From b4d2cef526965444db9f0dacfe9a5580a2fb8b55 Mon Sep 17 00:00:00 2001 From: David Huynh Date: Wed, 3 Mar 2010 22:12:48 +0000 Subject: [PATCH] Added an option for what to do when a text transform errors out. Made a custom expression preview dialog for the text transform command in order to suppor that option. git-svn-id: http://google-refine.googlecode.com/svn/trunk@178 7d457c2a-affb-35e4-300a-418c747d4874 --- .../com/metaweb/gridworks/ProjectManager.java | 5 ++ .../commands/edit/DoTextTransformCommand.java | 7 +- .../gridworks/expr/ExpressionUtils.java | 10 +++ .../operations/TextTransformOperation.java | 48 ++++++++++++-- .../views/data-table-column-header-ui.js | 65 +++++++++++++++---- 5 files changed, 117 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/metaweb/gridworks/ProjectManager.java b/src/main/java/com/metaweb/gridworks/ProjectManager.java index 675a39526..6ca40098e 100644 --- a/src/main/java/com/metaweb/gridworks/ProjectManager.java +++ b/src/main/java/com/metaweb/gridworks/ProjectManager.java @@ -81,6 +81,8 @@ public class ProjectManager implements Serializable { } static protected ProjectManager load(File file) { + Gridworks.log("Loading project metadata from " + file.getAbsolutePath()); + ProjectManager pm = null; FileInputStream fis = null; ObjectInputStream in = null; @@ -198,6 +200,8 @@ public class ProjectManager implements Serializable { } public void save() { + Gridworks.log("Saving project metadata ..."); + File file = new File(_dir, "projects"); FileOutputStream fos = null; @@ -226,6 +230,7 @@ public class ProjectManager implements Serializable { } public void saveAllProjects() { + Gridworks.log("Saving all projects ..."); for (Project project : _projects.values()) { try { saveProject(project); diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java index 7201d3d6d..a35da29e7 100644 --- a/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java @@ -16,7 +16,12 @@ public class DoTextTransformCommand extends EngineDependentCommand { String columnName = request.getParameter("columnName"); String expression = request.getParameter("expression"); + String onError = request.getParameter("onError"); - return new TextTransformOperation(engineConfig, columnName, expression); + return new TextTransformOperation( + engineConfig, + columnName, + expression, + TextTransformOperation.stringToOnError(onError)); } } diff --git a/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java b/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java index 9aed29b30..f5b8574ee 100644 --- a/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java +++ b/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java @@ -53,4 +53,14 @@ public class ExpressionUtils { ((Boolean) o).booleanValue() : Boolean.parseBoolean(o.toString())); } + + static public boolean sameValue(Object v1, Object v2) { + if (v1 == null) { + return (v2 == null) || (v2 instanceof String && ((String) v2).length() == 0); + } else if (v2 == null) { + return (v1 == null) || (v1 instanceof String && ((String) v1).length() == 0); + } else { + return v1.equals(v2); + } + } } diff --git a/src/main/java/com/metaweb/gridworks/operations/TextTransformOperation.java b/src/main/java/com/metaweb/gridworks/operations/TextTransformOperation.java index bf6951179..fd44aca9b 100644 --- a/src/main/java/com/metaweb/gridworks/operations/TextTransformOperation.java +++ b/src/main/java/com/metaweb/gridworks/operations/TextTransformOperation.java @@ -20,8 +20,15 @@ import com.metaweb.gridworks.model.changes.CellChange; public class TextTransformOperation extends EngineDependentMassCellOperation { private static final long serialVersionUID = -7698202759999537298L; + + static public enum OnError { + KeepOriginal, + SetToBlank, + StoreError + } final protected String _expression; + final protected OnError _onError; static public AbstractOperation reconstruct(Project project, JSONObject obj) throws Exception { JSONObject engineConfig = obj.getJSONObject("engineConfig"); @@ -29,13 +36,34 @@ public class TextTransformOperation extends EngineDependentMassCellOperation { return new TextTransformOperation( engineConfig, obj.getString("columnName"), - obj.getString("expression") + obj.getString("expression"), + stringToOnError(obj.getString("onError")) ); } - public TextTransformOperation(JSONObject engineConfig, String columnName, String expression) { + static public OnError stringToOnError(String s) { + if ("set-to-blank".equalsIgnoreCase(s)) { + return OnError.SetToBlank; + } else if ("store-error".equalsIgnoreCase(s)) { + return OnError.StoreError; + } else { + return OnError.KeepOriginal; + } + } + static public String onErrorToString(OnError onError) { + if (onError == OnError.SetToBlank) { + return "set-to-blank"; + } else if (onError == OnError.StoreError) { + return "store-error"; + } else { + return "keep-original"; + } + } + + public TextTransformOperation(JSONObject engineConfig, String columnName, String expression, OnError onError) { super(engineConfig, columnName, true); _expression = expression; + _onError = onError; } public void write(JSONWriter writer, Properties options) @@ -47,6 +75,7 @@ public class TextTransformOperation extends EngineDependentMassCellOperation { writer.key("engineConfig"); writer.value(getEngineConfig()); writer.key("columnName"); writer.value(_columnName); writer.key("expression"); writer.value(_expression); + writer.key("onError"); writer.value(onErrorToString(_onError)); writer.endObject(); } @@ -83,12 +112,21 @@ public class TextTransformOperation extends EngineDependentMassCellOperation { public boolean visit(Project project, int rowIndex, Row row, boolean contextual) { Cell cell = row.getCell(cellIndex); + Object oldValue = cell != null ? cell.value : null; ExpressionUtils.bind(bindings, row, rowIndex, cell); - Object v = eval.evaluate(bindings); - if ((cell != null && cell.value != null) || v != null) { - Cell newCell = new Cell(v, (cell != null) ? cell.recon : null); + Object newValue = eval.evaluate(bindings); + if (ExpressionUtils.isError(newValue)) { + if (_onError == OnError.KeepOriginal) { + return false; + } else if (_onError == OnError.SetToBlank) { + newValue = null; + } + } + + if (!ExpressionUtils.sameValue(oldValue, newValue)) { + Cell newCell = new Cell(newValue, (cell != null) ? cell.recon : null); CellChange cellChange = new CellChange(rowIndex, cellIndex, cell, newCell); cellChanges.add(cellChange); diff --git a/src/main/webapp/scripts/views/data-table-column-header-ui.js b/src/main/webapp/scripts/views/data-table-column-header-ui.js index fb4ca4397..ebceb4200 100644 --- a/src/main/webapp/scripts/views/data-table-column-header-ui.js +++ b/src/main/webapp/scripts/views/data-table-column-header-ui.js @@ -59,15 +59,15 @@ DataTableColumnHeaderUI.prototype._createMenuForColumnHeader = function(elmt) { submenu: [ { label: "To Titlecase", - click: function() { self._doTextTransform("toTitlecase(value)"); } + click: function() { self._doTextTransform("toTitlecase(value)", "store-blank"); } }, { label: "To Uppercase", - click: function() { self._doTextTransform("toUppercase(value)"); } + click: function() { self._doTextTransform("toUppercase(value)", "store-blank"); } }, { label: "To Lowercase", - click: function() { self._doTextTransform("toLowercase(value)"); } + click: function() { self._doTextTransform("toLowercase(value)", "store-blank"); } }, { label: "Custom Transform ...", @@ -399,10 +399,10 @@ DataTableColumnHeaderUI.prototype._doFilterByExpressionPrompt = function(express ); }; -DataTableColumnHeaderUI.prototype._doTextTransform = function(expression) { +DataTableColumnHeaderUI.prototype._doTextTransform = function(expression, onError) { Gridworks.postProcess( "do-text-transform", - { columnName: this._column.headerLabel, expression: expression }, + { columnName: this._column.headerLabel, expression: expression, onError: onError }, null, { cellsChanged: true } ); @@ -410,13 +410,54 @@ DataTableColumnHeaderUI.prototype._doTextTransform = function(expression) { DataTableColumnHeaderUI.prototype._doTextTransformPrompt = function() { var self = this; - DataTableView.promptExpressionOnVisibleRows( - this._column, - "Custom Transform on " + this._column.headerLabel, - "value", - function(expression) { - self._doTextTransform(expression); - } + var frame = DialogSystem.createDialog(); + frame.width("700px"); + + var header = $('
').addClass("dialog-header").text("Custom text transform on column " + this._column.headerLabel).appendTo(frame); + var body = $('
').addClass("dialog-body").appendTo(frame); + var footer = $('
').addClass("dialog-footer").appendTo(frame); + + body.html(ExpressionPreviewDialog.generateWidgetHtml()); + var bodyElmts = DOM.bind(body); + + footer.html( + '' + + '' + + '' + + '' + + '' + + '
' + + 'On error ' + + ' set to blank ' + + ' store error ' + + ' keep original' + + '' + + '' + + '' + + '
'); + var footerElmts = DOM.bind(footer); + + var level = DialogSystem.showDialog(frame); + var dismiss = function() { + DialogSystem.dismissUntil(level - 1); + }; + + footerElmts.okButton.click(function() { + self._doTextTransform( + previewWidget.getExpression(true), + $('input[name="text-transform-dialog-onerror-choice"]:checked')[0].value + ); + dismiss(); + }) + footerElmts.cancelButton.click(dismiss); + + var o = DataTableView.sampleVisibleRows(this._column); + var previewWidget = new ExpressionPreviewDialog.Widget( + bodyElmts, + this._column.cellIndex, + o.rowIndices, + o.values, + "value" ); };