var SchemaAlignment = {}; SchemaAlignment.autoAlign = function() { var protograph = {}; var columns = theProject.columnModel.columns; var typedCandidates = []; var candidates = []; for (var c = 0; c < columns.length; c++) { var column = columns[c]; var typed = "reconConfig" in column && column.reconConfig != null; var candidate = { status: "unbound", typed: typed, index: c, column: column }; candidates.push(candidate); if (typed) { typedCandidates.push(candidate); } } if (typedCandidates.length > 0) { } else { var queries = {}; for (var i = 0; i < candidates.length; i++) { var candidate = candidates[i]; var name = SchemaAlignment._cleanName(candidate.column.name); var key = "t" + i + ":search"; queries[key] = { "query" : name, "limit" : 10, "type" : "/type/type,/type/property", "type_strict" : "any" }; } SchemaAlignment._batchSearch(queries, function(result) { console.log(result); }); } }; SchemaAlignment._batchSearch = function(queries, onDone) { var keys = []; for (var n in queries) { if (queries.hasOwnProperty(n)) { keys.push(n); } } var result = {}; var args = []; var makeBatch = function(keyBatch) { var batch = {}; for (var k = 0; k < keyBatch.length; k++) { var key = keyBatch[k]; batch[key] = queries[key]; } args.push("http://api.freebase.com/api/service/search?" + $.param({ "queries" : JSON.stringify(batch) }) + "&callback=?"); args.push(null); // no data args.push(function(data) { for (var k = 0; k < keyBatch.length; k++) { var key = keyBatch[k]; result[key] = data[key]; } }); }; for (var i = 0; i < keys.length; i += 10) { makeBatch(keys.slice(i, i + 10)); } args.push(function() { onDone(result); }); Ajax.chainGetJSON.apply(null, args); }; SchemaAlignment._cleanName = function(s) { return s.replace(/\W/g, " ").replace(/\s+/g, " ").toLowerCase(); }; SchemaAlignment.createNewRootNode = function() { var rootNode = null; var links = []; var columns = theProject.columnModel.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; var target = { nodeType: "cell-as-topic", columnName: column.name, createForNoReconMatch: true }; if ("reconConfig" in column && column.reconConfig != null) { target.type = { id: column.reconConfig.type.id, name: column.reconConfig.type.name }; } if (column.name == theProject.columnModel.keyColumnName) { rootNode = target; } else { links.push({ property: null, target: target }); } } rootNode = rootNode || { nodeType: "cell-as-topic" }; rootNode.links = links; return rootNode; }; function SchemaAlignmentDialog(protograph, onDone) { this._onDone = onDone; this._originalProtograph = protograph || { rootNodes: [] }; this._protograph = cloneDeep(this._originalProtograph); // this is what can be munched on if (this._protograph.rootNodes.length == 0) { this._protograph.rootNodes.push(SchemaAlignment.createNewRootNode()); } this._nodeUIs = []; this._createDialog(); this.preview(); } SchemaAlignmentDialog.prototype._createDialog = function() { var self = this; var frame = DialogSystem.createDialog(); frame.width("1000px"); var header = $('
').addClass("dialog-header").text("Schema Alignment").appendTo(frame); var body = $('').addClass("dialog-body").appendTo(frame); var footer = $('').addClass("dialog-footer").appendTo(frame); this._constructFooter(footer); this._constructBody(body); this._level = DialogSystem.showDialog(frame); this._renderBody(body); }; SchemaAlignmentDialog.prototype._constructFooter = function(footer) { var self = this; $('').html(" OK ").click(function() { var protograph = self.getJSON(); Gridworks.postProcess( "save-protograph", {}, { protograph: JSON.stringify(protograph) }, {}, { onDone: function() { DialogSystem.dismissUntil(self._level - 1); theProject.protograph = protograph; } } ); }).appendTo(footer); $('').text("Cancel").click(function() { DialogSystem.dismissUntil(self._level - 1); }).appendTo(footer); }; SchemaAlignmentDialog.prototype._constructBody = function(body) { $('' + 'The schema alignment skeleton below specifies how the graph-shaped data that will get generated ' + 'from your grid-shaped data and written into Freebase. The cells in each record of your data will ' + 'get placed into nodes within the skeleton. Configure the skeleton by specifying which ' + 'column to substitute into which node. A node can also be an automatically generated ' + 'anonymous node, or it can be an explicit value or topic that is the same for all records.' + '
').appendTo(body); $( '