From c30a5126dfd47cd2553fe8f9ba211e6e2e4620f2 Mon Sep 17 00:00:00 2001 From: David Huynh Date: Mon, 15 Mar 2010 19:44:33 +0000 Subject: [PATCH] More work on the extend data preview dialog: columns can now be removed. git-svn-id: http://google-refine.googlecode.com/svn/trunk@299 7d457c2a-affb-35e4-300a-418c747d4874 --- .../util/PreviewExtendDataCommand.java | 18 ++++- .../util/FreebaseDataExtensionJob.java | 50 +++++++++---- .../dialogs/extend-data-preview-dialog.js | 75 ++++++++++++++++++- .../dialogs/extend-data-preview-dialog.css | 7 +- 4 files changed, 131 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/metaweb/gridworks/commands/util/PreviewExtendDataCommand.java b/src/main/java/com/metaweb/gridworks/commands/util/PreviewExtendDataCommand.java index a3355be27..025678b00 100644 --- a/src/main/java/com/metaweb/gridworks/commands/util/PreviewExtendDataCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/util/PreviewExtendDataCommand.java @@ -21,6 +21,7 @@ import com.metaweb.gridworks.model.Project; import com.metaweb.gridworks.model.ReconCandidate; import com.metaweb.gridworks.model.Row; import com.metaweb.gridworks.util.FreebaseDataExtensionJob; +import com.metaweb.gridworks.util.FreebaseDataExtensionJob.ColumnInfo; import com.metaweb.gridworks.util.FreebaseDataExtensionJob.DataExtension; public class PreviewExtendDataCommand extends Command { @@ -73,8 +74,21 @@ public class PreviewExtendDataCommand extends Command { writer.key("code"); writer.value("ok"); writer.key("columns"); writer.array(); - for (String name : job.columnNames) { - writer.value(name); + for (ColumnInfo info : job.columns) { + writer.object(); + writer.key("names"); + writer.array(); + for (String name : info.names) { + writer.value(name); + } + writer.endArray(); + writer.key("path"); + writer.array(); + for (String id : info.path) { + writer.value(id); + } + writer.endArray(); + writer.endObject(); } writer.endArray(); diff --git a/src/main/java/com/metaweb/gridworks/util/FreebaseDataExtensionJob.java b/src/main/java/com/metaweb/gridworks/util/FreebaseDataExtensionJob.java index 92d242f29..1e4200a06 100644 --- a/src/main/java/com/metaweb/gridworks/util/FreebaseDataExtensionJob.java +++ b/src/main/java/com/metaweb/gridworks/util/FreebaseDataExtensionJob.java @@ -33,14 +33,24 @@ public class FreebaseDataExtensionJob { } } - final public JSONObject extension; - final public int columnCount; - final public List columnNames = new ArrayList(); + static public class ColumnInfo { + final public List names; + final public List path; + + protected ColumnInfo(List names, List path) { + this.names = names; + this.path = path; + } + } + + final public JSONObject extension; + final public int columnCount; + final public List columns = new ArrayList(); public FreebaseDataExtensionJob(JSONObject obj) throws JSONException { this.extension = obj; this.columnCount = (obj.has("properties") && !obj.isNull("properties")) ? - countColumns(obj.getJSONArray("properties"), columnNames) : 0; + countColumns(obj.getJSONArray("properties"), columns, new ArrayList(), new ArrayList()) : 0; } public Map extend(Set guids) throws Exception { @@ -177,7 +187,7 @@ public class FreebaseDataExtensionJob { } else { return new int[] { startRowIndex, - startColumnIndex + countColumns(extNode, null) + startColumnIndex + countColumns(extNode, null, new ArrayList(), new ArrayList()) }; } } @@ -295,26 +305,40 @@ public class FreebaseDataExtensionJob { } } - static protected int countColumns(JSONObject obj, List columnNames) throws JSONException { + static protected int countColumns(JSONObject obj, List columns, List names, List path) throws JSONException { + String name = obj.getString("name"); + + List names2 = null; + List path2 = null; + if (columns != null) { + names2 = new ArrayList(names); + names2.add(name); + + path2 = new ArrayList(path); + path2.add(obj.getString("id")); + } + if (obj.has("properties") && !obj.isNull("properties")) { boolean included = (obj.has("included") && obj.getBoolean("included")); - if (included && columnNames != null) { - columnNames.add(obj.getString("name")); + if (included && columns != null) { + columns.add(new ColumnInfo(names2, path2)); } - return (included ? 1 : 0) + countColumns(obj.getJSONArray("properties"), columnNames); + + return (included ? 1 : 0) + + countColumns(obj.getJSONArray("properties"), columns, names2, path2); } else { - if (columnNames != null) { - columnNames.add(obj.getString("name")); + if (columns != null) { + columns.add(new ColumnInfo(names2, path2)); } return 1; } } - static protected int countColumns(JSONArray a, List columnNames) throws JSONException { + static protected int countColumns(JSONArray a, List columns, List names, List path) throws JSONException { int c = 0; int l = a.length(); for (int i = 0; i < l; i++) { - c += countColumns(a.getJSONObject(i), columnNames); + c += countColumns(a.getJSONObject(i), columns, names, path); } return c; } diff --git a/src/main/webapp/scripts/dialogs/extend-data-preview-dialog.js b/src/main/webapp/scripts/dialogs/extend-data-preview-dialog.js index 088007a77..817580e7b 100644 --- a/src/main/webapp/scripts/dialogs/extend-data-preview-dialog.js +++ b/src/main/webapp/scripts/dialogs/extend-data-preview-dialog.js @@ -161,11 +161,71 @@ ExtendDataPreviewDialog.prototype._update = function() { }; ExtendDataPreviewDialog.prototype._addProperty = function(p) { - this._extension.properties.push(p); + var addSeveralToList = function(properties, oldProperties) { + for (var i = 0; i < properties.length; i++) { + addToList(properties[i], oldProperties); + } + }; + var addToList = function(property, oldProperties) { + for (var i = 0; i < oldProperties.length; i++) { + var oldProperty = oldProperties[i]; + if (oldProperty.id == property.id) { + if ("included" in property) { + oldProperty.included = "included" in oldProperty ? + (oldProperty.included || property.included) : + property.included; + } + + if ("properties" in property) { + if ("properties" in oldProperty) { + addSeveralToList(property.properties, oldProperty.properties); + } else { + oldProperty.properties = property.properties; + } + } + return; + } + } + + oldProperties.push(property); + }; + + addToList(p, this._extension.properties); + + this._update(); +}; + +ExtendDataPreviewDialog.prototype._removeProperty = function(path) { + var removeFromList = function(path, index, properties) { + var id = path[index]; + + for (var i = properties.length - 1; i >= 0; i--) { + var property = properties[i]; + if (property.id == id) { + if (index === path.length - 1) { + if ("included" in property) { + delete property.included; + } + } else if ("properties" in property && property.properties.length > 0) { + removeFromList(path, index + 1, property.properties); + } + + if (!("properties" in property) || property.properties.length === 0) { + properties.splice(i, 1); + } + + return; + } + } + }; + + removeFromList(path, 0, this._extension.properties); + this._update(); }; ExtendDataPreviewDialog.prototype._renderPreview = function(data) { + var self = this; var container = this._elmts.previewContainer.empty(); if (data.code == "error") { container.text("Error."); @@ -174,10 +234,19 @@ ExtendDataPreviewDialog.prototype._renderPreview = function(data) { var table = $('')[0]; var trHead = table.insertRow(table.rows.length); - $(trHead.insertCell(trHead.cells.length)).text(this._column.name); + $('
').appendTo(trHead).text(this._column.name); for (var c = 0; c < data.columns.length; c++) { - $(trHead.insertCell(trHead.cells.length)).text(data.columns[c]); + var column = data.columns[c]; + var th = $('').appendTo(trHead); + + $('').html(column.names.join(" » ")).appendTo(th); + $('') + .attr("src", "images/close.png") + .attr("title", "Remove this column") + .click(function() { + self._removeProperty(column.path); + }).appendTo(th); } for (var r = 0; r < data.rows.length; r++) { diff --git a/src/main/webapp/styles/dialogs/extend-data-preview-dialog.css b/src/main/webapp/styles/dialogs/extend-data-preview-dialog.css index b8b1dcd83..ecad6f1f5 100644 --- a/src/main/webapp/styles/dialogs/extend-data-preview-dialog.css +++ b/src/main/webapp/styles/dialogs/extend-data-preview-dialog.css @@ -25,7 +25,12 @@ border-collapse: collapse; } -.extend-data-preview-dialog .preview-container td { +.extend-data-preview-dialog .preview-container td, .extend-data-preview-dialog .preview-container th { padding: 3px 5px; border-bottom: 1px solid #ddd; } + +.extend-data-preview-dialog .preview-container th img { + vertical-align: top; + margin-left: 5px; +} \ No newline at end of file