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

Reply via email to