Jonas Kress (WMDE) has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/359790 )
Change subject: Query Helper make property suggestions query aware
......................................................................
Query Helper make property suggestions query aware
Change-Id: I5fcf441ebae653aacda64a0da1b7338d34c24329
---
M wikibase/queryService/api/Sparql.js
M wikibase/queryService/ui/queryHelper/QueryHelper.js
M wikibase/queryService/ui/queryHelper/SelectorBox.js
M wikibase/queryService/ui/queryHelper/SparqlQuery.js
4 files changed, 86 insertions(+), 20 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/gui
refs/changes/90/359790/1
diff --git a/wikibase/queryService/api/Sparql.js
b/wikibase/queryService/api/Sparql.js
index b0c0947..7b9e2f0 100644
--- a/wikibase/queryService/api/Sparql.js
+++ b/wikibase/queryService/api/Sparql.js
@@ -128,16 +128,22 @@
* Submit a query to the API
*
* @param {string[]} query
+ * @param {Number} timeout in millis
* @return {jQuery.Promise} query
*/
- SELF.prototype.query = function( query ) {
+ SELF.prototype.query = function( query, timeout ) {
query = this._replaceAutoLanguage( query );
+
+ var data = 'query=' + encodeURIComponent( query );
+ if ( timeout ) {
+ data += '&maxQueryTimeMillis=' + timeout;
+ }
var self = this,
deferred = $.Deferred(),
settings = {
headers: { Accept:
'application/sparql-results+json' },
- data: 'query=' + encodeURIComponent( query )
+ data: data
};
function done( data, textStatus, request ) {
self._executionTime = Date.now() - self._executionTime;
diff --git a/wikibase/queryService/ui/queryHelper/QueryHelper.js
b/wikibase/queryService/ui/queryHelper/QueryHelper.js
index a61d0a9..13bf4f5 100644
--- a/wikibase/queryService/ui/queryHelper/QueryHelper.js
+++ b/wikibase/queryService/ui/queryHelper/QueryHelper.js
@@ -95,6 +95,8 @@
SELF.prototype.setQuery = function( query ) {
var prefixes = wikibase.queryService.RdfNamespaces.ALL_PREFIXES;
this._query.parse( query, prefixes );
+
+ this._selectorBox.setQuery( this._query );
};
/**
diff --git a/wikibase/queryService/ui/queryHelper/SelectorBox.js
b/wikibase/queryService/ui/queryHelper/SelectorBox.js
index 601dbae..4158158 100644
--- a/wikibase/queryService/ui/queryHelper/SelectorBox.js
+++ b/wikibase/queryService/ui/queryHelper/SelectorBox.js
@@ -70,22 +70,38 @@
FILTER((LANG(?description)) = "{LANGUAGE}")\
}\
LIMIT 20',
-// genericSuggest:// Find properties that are most often
used with all items
-// 'SELECT ?id ?label ?description WITH {\
-// SELECT ?pred (COUNT(?value) AS ?count)
WHERE\
-// {\
-// ?subj ?pred ?value .\
-// } GROUP BY ?pred ORDER BY DESC(?count)
LIMIT 1000\
-// } AS %inner\
-// WHERE {\
-// INCLUDE %inner\
-// ?id wikibase:claim ?pred.\
-// ?id rdfs:label ?label.\
-// ?id schema:description ?description.\
-// FILTER((LANG(?label)) = "en")\
-// FILTER((LANG(?description)) = "en")\
-// } ORDER BY DESC(?count)\
-// LIMIT 20',
+ genericSuggest: function() { // Find properties
that are most often used with some items
+ //TODO use named subqueries to avoid
timeout
+ var template = '{PREFIXES}\nSELECT ?id
?label ?description WHERE {\
+ hint:Query hint:optimizer "None".\
+ {\
+ SELECT ?id (COUNT(?id)
AS ?count) WHERE {\
+ {\
+ SELECT
DISTINCT ( {VARIABLE} as ?item ) WHERE {\
+
{ {QUERY} }\
+ }\
+ }\
+ ?item ?prop ?x.\
+ ?id ?xx ?prop.\
+ ?id rdf:type
wikibase:Property.\
+ } GROUP BY ?id ORDER BY
DESC(?count)\
+ LIMIT 20\
+ }\
+ ?id rdfs:label ?label.\
+ ?id schema:description ?description.\
+ FILTER((LANG(?label)) = "{LANGUAGE}")\
+ FILTER((LANG(?description)) =
"{LANGUAGE}")\
+ }\
+ LIMIT 20',
+ query =
this._query.clone().setLimit( 100 ).getQueryString(),
+ variable =
this._query.getBoundVariables().shift(),
+ prefixes = query.match(
/PREFIX(.*)/gi ).join( '\n' );
+
+ query = query.replace( /PREFIX(.*)/gi,
'' );
+ return template.replace( '{QUERY}',
query )
+ .replace( '{VARIABLE}',
variable )
+ .replace( '{PREFIXES}',
prefixes );
+ },
search: null,
// search:// Find properties that are most often used with
a specific item and filter with term prefix
// 'SELECT ?id ?label ?description WHERE {\
@@ -173,6 +189,19 @@
* @private
*/
SELF.prototype._sparqlApi = null;
+
+ /**
+ * @property {wikibase.queryService.ui.queryHelper.SparqlQuery}
+ * @private
+ */
+ SELF.prototype._query = null;
+
+ /**
+ * @param {wikibase.queryService.ui.queryHelper.SparqlQuery} query
+ */
+ SELF.prototype.setQuery = function( query ) {
+ this._query = query;
+ };
/**
* Add selector box to element
@@ -347,6 +376,19 @@
* @private
*/
SELF.prototype._getSparqlTemplate = function( term, type, triple,
sparql ) {
+ var definition = this._getSparqlTemplateDefinition( term, type,
triple, sparql );
+
+ if ( typeof definition === 'function' ) {
+ definition = definition.apply( this );
+ }
+
+ return definition;
+ };
+
+ /**
+ * @private
+ */
+ SELF.prototype._getSparqlTemplateDefinition = function( term, type,
triple, sparql ) {
if ( sparql ) {
if ( term ) {
return SPARQL_QUERY.sparql.search.replace(
'{SPARQL}', sparql );
@@ -424,7 +466,7 @@
return deferred.resolve( [] ).promise();
}
- this._sparqlApi.query( query ).done( function( data ) {
+ this._sparqlApi.query( query, 3 * 1000 ).done( function( data )
{
var r = data.results.bindings.map( function( d ) {
var id = d.id.value.split( '/' ).pop();
return {
@@ -438,7 +480,9 @@
} );
deferred.resolve( r );
- } ).fail( deferred.reject );
+ } ).always( function () {
+ deferred.resolve( [] );
+ } );
return deferred.promise();
};
diff --git a/wikibase/queryService/ui/queryHelper/SparqlQuery.js
b/wikibase/queryService/ui/queryHelper/SparqlQuery.js
index 404d802..1f3d2b9 100644
--- a/wikibase/queryService/ui/queryHelper/SparqlQuery.js
+++ b/wikibase/queryService/ui/queryHelper/SparqlQuery.js
@@ -86,6 +86,7 @@
* Set LIMIT
*
* @param {int} limit
+ * @return {wikibase.queryService.ui.queryHelper.SparqlQuery}
*/
SELF.prototype.setLimit = function( limit ) {
if ( !limit ) {
@@ -93,6 +94,8 @@
}
this._query.limit = limit;
+
+ return this;
};
/**
@@ -315,5 +318,16 @@
return null;
};
+ /**
+ * Clone query
+ *
+ * @return {wikibase.queryService.ui.queryHelper.SparqlQuery}
+ */
+ SELF.prototype.clone = function() {
+ var query = new SELF();
+ query.parse( this.getQueryString() );
+ return query;
+ };
+
return SELF;
}( jQuery, wikibase, sparqljs ) );
--
To view, visit https://gerrit.wikimedia.org/r/359790
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I5fcf441ebae653aacda64a0da1b7338d34c24329
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/gui
Gerrit-Branch: master
Gerrit-Owner: Jonas Kress (WMDE) <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits