In property suggest, bubble up properties of included types as well.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@241 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
David Huynh 2010-03-08 20:56:04 +00:00
parent 4a4ae6bf27
commit 6b421c2c75

View File

@ -1,6 +1,38 @@
(function() { (function() {
var base = { var oldResponse = $.suggest.suggest.prototype.response;
response: $.suggest.suggest.prototype.response var typeToIncludedTypes = {};
var resortByType = function(data, type) {
var schemaPrefixes = [ type + "/" ];
var includedTypes = typeToIncludedTypes[type];
for (var i = 0; i < includedTypes.length; i++) {
schemaPrefixes.push(includedTypes[i] + "/");
}
var results = data.result;
var entries1 = [];
var entries2 = [];
for (var i = 0; i < results.length; i++) {
var result = results[i];
var matched = false;
for (var j = 0; j < schemaPrefixes.length; j++) {
var schemaPrefix = schemaPrefixes[j];
if (result.id.substring(0, schemaPrefix.length) == schemaPrefix) {
matched = true;
break;
}
}
if (matched) {
entries1.push(result);
} else {
entries2.push(result);
}
}
data.result = entries1.concat(entries2);
}; };
/* /*
@ -13,26 +45,98 @@
{}, {},
$.suggest.suggest.prototype, $.suggest.suggest.prototype,
{ {
response: function(data) { request: function(val, start) {
if ("schema" in this.options) { var self = this,
var schema = this.options.schema + "/"; o = this.options;
var results = data.result; if (this.ac_xhr) {
var entries1 = []; this.ac_xhr.abort();
var entries2 = []; this.ac_xhr = null;
for (var i = 0; i < results.length; i++) {
var result = results[i];
if (result.id.substring(0, schema.length) == schema) {
entries1.push(result);
} else {
entries2.push(result);
}
}
data.result = entries1.concat(entries2);
} }
base.response.apply(this, [ data ]); var data = {
query: val
};
if (start) {
data.start = start;
}
$.extend(data, o.ac_param);
$.extend(data, { limit: 50 });
var baseUrl = "http://api.freebase.com/api/service/search";
var url = baseUrl + "?" + $.param(data),
cached = $.suggest.cache[url];
if (cached) {
this.response(cached, start ? start : -1, true);
return;
}
clearTimeout(this.request.timeout);
this.request.timeout =
setTimeout(function() {
self.ac_xhr = $.ajax({
url: baseUrl,
data: data,
beforeSend: function() {
var calls = self.input.data("request.count.suggest") || 0;
if (!calls) {
self.trackEvent(self.name, "start_session");
}
calls += 1;
self.trackEvent(self.name, "request", "count", calls);
self.input.data("request.count.suggest", calls);
},
success: function(data) {
data.prefix = val; // we need this so that the rest of suggest wouldn't error out
if ("schema" in o) {
var type = o.schema;
var apply = function() {
resortByType(data, type);
$.suggest.cache[url] = data;
self.response(data, start ? start : -1);
};
if (type in typeToIncludedTypes) {
apply();
} else {
var query = {
query: {
"id" : type,
"/freebase/type_hints/included_types": []
}
};
$.getJSON(
"http://api.freebase.com/api/service/mqlread?" + $.param({ query: JSON.stringify(query) }) + "&callback=?",
null,
function(d) {
var types = [];
if ("result" in d) {
types = d.result["/freebase/type_hints/included_types"];
}
typeToIncludedTypes[type] = types;
apply();
},
"jsonp"
);
}
} else {
self.response(data, start ? start : -1);
}
},
error: function(xhr) {
self.trackEvent(self.name, "request", "error", {url:this.url, response: xhr ? xhr.responseText : ''});
},
complete: function(xhr) {
if (xhr) {
self.trackEvent(self.name, "request", "tid", xhr.getResponseHeader("X-Metaweb-TID"));
}
},
dataType: "jsonp",
cache: true
});
}, o.xhr_delay);
}, },
create_item: function(data, response_data) { create_item: function(data, response_data) {
var css = this.options.css; var css = this.options.css;