Put more of the logic of suggesting properties for protograph links over to the gridworks-helper acre app.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@563 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
David Huynh 2010-04-28 18:57:19 +00:00
parent 89e1d8b5ac
commit 66c671fa5e

View File

@ -93,8 +93,9 @@ SchemaAlignmentDialog.UILink.prototype._renderDetails = function() {
SchemaAlignmentDialog.UILink.prototype._startEditProperty = function(elmt) { SchemaAlignmentDialog.UILink.prototype._startEditProperty = function(elmt) {
var sourceTypeID = this._parentUINode.getExpectedType(); var sourceTypeID = this._parentUINode.getExpectedType();
var targetTypeID = "type" in this._link.target && this._link.target.type !== null ? this._link.target.type.id : null; var targetNode = this._targetUI._node;
var targetTypeName = "columnName" in this._link.target ? this._link.target.columnName : null; var targetTypeID = "type" in targetNode && targetNode.type !== null ? targetNode.type.id : null;
var targetTypeName = "columnName" in targetNode ? targetNode.columnName : null;
if (sourceTypeID !== null) { if (sourceTypeID !== null) {
var self = this; var self = this;
@ -109,12 +110,14 @@ SchemaAlignmentDialog.UILink.prototype._startEditProperty = function(elmt) {
self._showPropertySuggestPopup( self._showPropertySuggestPopup(
elmt, elmt,
SchemaAlignmentDialog.UILink._rankProperties(properties, sourceTypeID, targetTypeID, targetTypeName) properties
); );
} }
SchemaAlignmentDialog.UILink._getPropertiesOfType( SchemaAlignmentDialog.UILink._getPropertiesOfType(
sourceTypeID, sourceTypeID,
targetTypeID,
targetTypeName,
onDone onDone
); );
} else { } else {
@ -122,78 +125,20 @@ SchemaAlignmentDialog.UILink.prototype._startEditProperty = function(elmt) {
} }
}; };
SchemaAlignmentDialog.UILink._rankProperties = function(properties, sourceTypeID, targetTypeID, targetTypeName) { SchemaAlignmentDialog.UILink._getPropertiesOfType = function(typeID, targetTypeID, targetTypeName, onDone) {
var nameScorer;
if (targetTypeName === null) {
nameScorer = function() { return 1; };
} else {
var nameWords = targetTypeName.toLowerCase().replace(/\W/g, ' ').replace(/\s+/g, ' ').split(" ");
var nameScoreString = function(score, s) {
s = s.toLowerCase().replace(/\W/g, ' ');
var n = 0;
for (var i = 0; i < nameWords.length; i++) {
if (s.indexOf(nameWords[i]) >= 0) {
n++;
}
}
return Math.max(score, n / nameWords.length);
};
var nameScoreStrings = function(score, a) {
$.each(a, function() { score = nameScoreString(score, this); });
return score;
};
nameScorer = function(p) {
var score = nameScoreString(0, p.name);
score = nameScoreStrings(score, p.alias);
if ("name2" in p) {
score = nameScoreString(score, p.name2);
score = nameScoreStrings(score, p.alias2);
}
if ("expects" in p && p.expects !== null) {
score = nameScoreString(score, p.expects.name);
score = nameScoreStrings(score, p.expects.alias);
}
if ("expects2" in p && p.expects2 !== null) {
score = nameScoreString(score, p.expects2.name);
score = nameScoreStrings(score, p.expects2.alias);
}
return score;
};
}
var typeScorer;
if (targetTypeID === null) {
typeScorer = function(p) { return p.weight; };
} else {
typeScorer = function(p) {
return p.expects.id == targetTypeID ? 1 : p.weight;
};
}
var suggestions = [];
for (var i = 0; i < properties.length; i++) {
var p = properties[i];
p.score = p.weight * (0.5 * nameScorer(p) + 0.5 * typeScorer(p));
suggestions.push(p);
}
suggestions.sort(function(a, b) { return b.score - a.score; });
suggestions = suggestions.slice(0, 7);
return suggestions;
};
SchemaAlignmentDialog.UILink._getPropertiesOfType = function(typeID, onDone) {
var done = false; var done = false;
var params = {
"type" : typeID
};
if (targetTypeID != null) {
params.expects = targetTypeID;
} else if (targetTypeName != null) {
params.expects = targetTypeName;
}
$.getJSON( $.getJSON(
"http://gridworks-helper.freebaseapps.com/get_properties_of_type?type=" + typeID + "&callback=?", "http://gridworks-helper.freebaseapps.com/get_properties_of_type?" + $.param(params) + "&callback=?",
null, null,
function(data) { function(data) {
if (done) return; if (done) return;