More work on the extend data preview dialog. It's starting to render some results.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@290 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
David Huynh 2010-03-13 08:08:25 +00:00
parent f34577ec85
commit 99ae7dea29
5 changed files with 110 additions and 27 deletions

View File

@ -70,6 +70,7 @@ public class PreviewExtendDataCommand extends Command {
JSONWriter writer = new JSONWriter(response.getWriter());
writer.object();
writer.key("code"); writer.value("ok");
writer.key("columns");
writer.array();
for (String name : job.columnNames) {

View File

@ -76,7 +76,7 @@ public class FreebaseDataExtensionJob {
protected FreebaseDataExtensionJob.DataExtension collectResult(JSONObject obj) throws JSONException {
List<Object[]> rows = new ArrayList<Object[]>();
collectResult(rows, extension, obj, 0, 0);
collectResult(rows, extension.getJSONArray("properties"), obj, 0, 0);
Object[][] data = new Object[rows.size()][columnCount];
rows.toArray(data);
@ -157,16 +157,18 @@ public class FreebaseDataExtensionJob {
storeCell(rows, startRowIndex2++, startColumnIndex2++, o);
}
int[] rowcol = collectResult(
rows,
extNode.getJSONArray("properties"),
o,
startRowIndex,
startColumnIndex2
);
startRowIndex = rowcol[0];
maxColIndex = Math.max(maxColIndex, rowcol[1]);
if (hasSubProperties) {
int[] rowcol = collectResult(
rows,
extNode.getJSONArray("properties"),
o,
startRowIndex,
startColumnIndex2
);
startRowIndex = rowcol[0];
maxColIndex = Math.max(maxColIndex, rowcol[1]);
}
}
return new int[] { startRowIndex, maxColIndex };
@ -210,6 +212,7 @@ static protected InputStream doPost(URL url, String name, String load) throws IO
URLConnection connection = url.openConnection();
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setConnectTimeout(5000);
connection.setDoOutput(true);
DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
try {
@ -242,7 +245,7 @@ static protected void formulateQuery(Set<String> guids, JSONObject node, Writer
}
jsonWriter.endArray();
formulateQueryNode(node, jsonWriter);
formulateQueryNode(node.getJSONArray("properties"), jsonWriter);
jsonWriter.endObject();
jsonWriter.endArray();
@ -270,12 +273,7 @@ static protected void formulateQueryNode(JSONObject node, JSONWriter writer) thr
}
if (hasSubProperties) {
JSONArray a = node.getJSONArray("properties");
int l = a.length();
for (int i = 0; i < l; i++) {
formulateQueryNode(a.getJSONObject(i), writer);
}
formulateQueryNode(node.getJSONArray("properties"), writer);
}
}
writer.endObject();
@ -284,6 +282,14 @@ static protected void formulateQueryNode(JSONObject node, JSONWriter writer) thr
writer.endArray();
}
static protected void formulateQueryNode(JSONArray propertiesA, JSONWriter writer) throws JSONException {
int l = propertiesA.length();
for (int i = 0; i < l; i++) {
formulateQueryNode(propertiesA.getJSONObject(i), writer);
}
}
static protected int countColumns(JSONObject obj, List<String> columnNames) throws JSONException {
if (obj.has("properties") && !obj.isNull("properties")) {
boolean included = (obj.has("included") && obj.getBoolean("included"));

View File

@ -1,21 +1,25 @@
function ExtendDataPreviewDialog(columnName, rowIndices, onDone) {
function ExtendDataPreviewDialog(column, rowIndices, onDone) {
this._column = column;
this._rowIndices = rowIndices;
this._onDone = onDone;
this._extension = { properties: [] };
var self = this;
var frame = DialogSystem.createDialog();
frame.width("900px").addClass("extend-data-preview-dialog");
var header = $('<div></div>').addClass("dialog-header").text("Add Columns from Freebase Based on Column " + columnName).appendTo(frame);
var header = $('<div></div>').addClass("dialog-header").text("Add Columns from Freebase Based on Column " + column.name).appendTo(frame);
var body = $('<div></div>').addClass("dialog-body").appendTo(frame);
var footer = $('<div></div>').addClass("dialog-footer").appendTo(frame);
var html = $(
'<div class="grid-layout layout-normal layout-full"><table style="height: 600px">' +
'<tr>' +
'<td width="150" height="1">Add Property</td>' +
'<td height="100%" rowspan="4"><div class="preview-container" bind="previewDiv"></div></td>' +
'<td height="1">Preview</td>' +
'</tr>' +
'<tr>' +
'<td height="1"><div class="input-container"><input /></div></td>' +
'<td height="1"><div class="input-container"><input bind="addPropertyInput" /></div></td>' +
'<td height="100%" rowspan="3"><div class="preview-container" bind="previewContainer"></div></td>' +
'</tr>' +
'<tr>' +
'<td height="1">Suggested Properties</td>' +
@ -38,8 +42,74 @@ function ExtendDataPreviewDialog(columnName, rowIndices, onDone) {
}).appendTo(footer);
this._level = DialogSystem.showDialog(frame);
var suggestConfig = {
type: '/type/property'
};
if ("reconConfig" in column) {
suggestConfig.schema = column.reconConfig.type.id;
}
this._elmts.addPropertyInput.suggestP(suggestConfig).bind("fb-select", function(evt, data) {
self._addProperty(data);
});
};
ExtendDataPreviewDialog.prototype.update = function() {
ExtendDataPreviewDialog.prototype._update = function() {
this._elmts.previewContainer.empty().text("Querying Freebase ...");
};
var self = this;
var params = {
project: theProject.id,
columnName: this._column.name
};
$.post(
"/command/preview-extend-data?" + $.param(params),
{
rowIndices: JSON.stringify(this._rowIndices),
extension: JSON.stringify(this._extension)
},
function(data) {
self._renderPreview(data)
},
"json"
);
};
ExtendDataPreviewDialog.prototype._addProperty = function(p) {
this._extension.properties.push({
id : p.id,
name: p.name,
expected: p["/type/property/expected_type"]
});
this._update();
};
ExtendDataPreviewDialog.prototype._renderPreview = function(data) {
var container = this._elmts.previewContainer.empty();
if (data.code == "error") {
container.text("Error.");
return;
}
var table = $('<table>')[0];
for (var r = 0; r < data.rows.length; r++) {
var tr = table.insertRow(table.rows.length);
var row = data.rows[r];
for (var c = 0; c < row.length; c++) {
var td = tr.insertCell(tr.cells.length);
var cell = row[c];
if (cell != null) {
if ($.isPlainObject(cell)) {
$('<a>').attr("href", "http://www.freebase.com/view" + cell.id).text(cell.name).appendTo(td);
} else {
$('<span>').text(cell).appendTo(td);
}
}
}
}
container.append(table);
}

View File

@ -66,7 +66,8 @@
"id" : val,
"name" : null,
"guid" : null,
"x:type" : "/type/property"
"x:type" : "/type/property",
"/type/property/expected_type" : null
}];
var data = {
query: JSON.stringify({ query: query })
@ -122,7 +123,12 @@
var o = this.options;
var data = {
query: val
query: val,
mql_output: JSON.stringify([{
"id" : null,
"name" : null,
"/type/property/expected_type" : null
}])
};
if (start) {
data.start = start;

View File

@ -822,7 +822,7 @@ DataTableColumnHeaderUI.prototype._doAddColumnFromFreebase = function() {
var o = DataTableView.sampleVisibleRows(this._column);
new ExtendDataPreviewDialog(
this._column.name,
this._column,
o.rowIndices,
function() {}
);