Jonas Kress (WMDE) has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/315505

Change subject: Refactor error extraction and move to api
......................................................................

Refactor error extraction and move to api

Bug: T147114
Bug: T144666
Change-Id: I0c58cdcee72b25c60ec02b68bf25f4029641af01
---
M i18n/en.json
M i18n/qqq.json
M wikibase/queryService/api/Sparql.js
M wikibase/queryService/ui/App.js
4 files changed, 89 insertions(+), 48 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/gui 
refs/changes/05/315505/1

diff --git a/i18n/en.json b/i18n/en.json
index c9d68ba..078a21d 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -48,5 +48,7 @@
     "wdqs-action-error-display": "Unable to display result",
     "wdqs-action-timeout": "Query timeout limit reached",
     "wdqs-action-malformed-query": "Query is malformed",
+    "wdqs-action-server-error": "Server error",
+    "wdqs-action-unknow-error": "Unknown error",
     "wdqs-result-map-layers-all": "All layers"
 }
\ No newline at end of file
diff --git a/i18n/qqq.json b/i18n/qqq.json
index 6eeaf23..31299e7 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -50,5 +50,7 @@
        "wdqs-action-error-display": "Label for progressbar",
        "wdqs-action-timeout": "Label for progressbar",
        "wdqs-action-malformed-query": "Label for progressbar",
+    "wdqs-action-server-error": "Label for server error",
+       "wdqs-action-unknow-error": "Label for unknown error",
        "wdqs-result-map-layers-all": "Label for all layers in layer control on 
map view"
 }
diff --git a/wikibase/queryService/api/Sparql.js 
b/wikibase/queryService/api/Sparql.js
index 4d688d6..98bf89f 100644
--- a/wikibase/queryService/api/Sparql.js
+++ b/wikibase/queryService/api/Sparql.js
@@ -7,6 +7,18 @@
 
        var SPARQL_SERVICE_URI = 
'//query.wikidata.org/bigdata/namespace/wdq/sparql';
 
+       var ERROR_CODES = {
+                       TIMEOUT: 10,
+                       MALFORMED: 20,
+                       SERVER: 30,
+                       UNKNOWN: 100
+       };
+
+       var ERROR_MAP = {
+               'QueryTimeoutException: Query deadline is expired': 
ERROR_CODES.TIMEOUT,
+               'MalformedQueryException: ': ERROR_CODES.MALFORMED
+       };
+
        /**
         * SPARQL API for the Wikibase query service
         *
@@ -24,6 +36,11 @@
        }
 
        /**
+        * @property {Object}
+        */
+       SELF.prototype.ERROR_CODES = ERROR_CODES;
+
+       /**
         * @property {Number}
         * @private
         */
@@ -36,10 +53,10 @@
        SELF.prototype._executionTime = null;
 
        /**
-        * @property {string}
+        * @property {Object}
         * @private
         */
-       SELF.prototype._errorMessage = null;
+       SELF.prototype._error = null;
 
        /**
         * @property {Number}
@@ -109,9 +126,7 @@
         * @return {jQuery.Promise} query
         */
        SELF.prototype.query = function( query ) {
-               var self = this,
-                       deferred = $.Deferred(),
-                       settings = {
+               var self = this, deferred = $.Deferred(), settings = {
                        headers: {
                                Accept: 'application/sparql-results+json'
                        }
@@ -120,7 +135,7 @@
                this._queryUri = this._serviceUri + '?query=' + 
encodeURIComponent( query );
 
                this._executionTime = Date.now();
-               $.ajax( this._queryUri, settings ).done( function( data, 
textStatus, jqXHR ) {
+               $.ajax( this._queryUri, settings ).done( function( data, 
textStatus, request ) {
                        self._executionTime = Date.now() - self._executionTime;
 
                        if ( typeof data.boolean === 'boolean' ) {
@@ -131,11 +146,11 @@
                        self._rawData = data;
 
                        deferred.resolve();
-               } ).fail( function( jqXHR ) {
+               } ).fail( function( request ) {
                        self._executionTime = null;
                        self._rawData = null;
                        self._resultLength = null;
-                       self._generateErrorMessage( jqXHR );
+                       self._generateErrorMessage( request );
 
                        deferred.reject();
                } );
@@ -146,18 +161,41 @@
        /**
         * Get execution time in ms of the submitted query
         */
-       SELF.prototype._generateErrorMessage = function( jqXHR ) {
-               var message = 'ERROR: ';
+       SELF.prototype._generateErrorMessage = function( request, options, 
exception ) {
+               var error = {
+                       code: null,
+                       message: null,
+                       debug: request.responseText
+               };
 
-               if ( jqXHR.status === 0 ) {
-                       message += 'Could not contact server';
+               if ( request.status === 0 ) {
+                       error.code = ERROR_CODES.SERVER;
+                       error.message = exception;
                } else {
-                       message += jqXHR.responseText;
-                       if ( jqXHR.responseText.match( /Query deadline is 
expired/ ) ) {
-                               message = 'QUERY TIMEOUT\n' + message;
+
+                       try {
+                               var errorToMatch = error.debug.substring( 
error.debug
+                                               .indexOf( 
'java.util.concurrent.ExecutionException:' ) );
+
+                               for ( var errorKey in ERROR_MAP ) {
+                                       if ( errorToMatch.indexOf( errorKey ) 
!== -1 ) {
+                                               error.code = ERROR_MAP[ 
errorKey ];
+                                       }
+                               }
+
+                               if ( error.code === null || error.code === 
ERROR_CODES.MALFORMED ) {
+                                       error.message = error.debug
+                                                       .match(
+                                                                       
/(java\.util\.concurrent\.ExecutionException\:)+(.*)(Exception\:)+(.*)/ )
+                                                       .pop().trim();
+                               }
+
+                       } catch ( e ) {
+                               error.code = ERROR_CODES.UNKNOWN;
                        }
                }
-               this._errorMessage = message;
+
+               this._error = error;
        };
 
        /**
@@ -170,12 +208,12 @@
        };
 
        /**
-        * Get error message of the submitted query if it has failed
+        * Get error of the submitted query if it has failed
         *
-        * @return {Number}
+        * @return {object}
         */
-       SELF.prototype.getErrorMessage = function() {
-               return this._errorMessage;
+       SELF.prototype.getError = function() {
+               return this._error;
        };
 
        /**
diff --git a/wikibase/queryService/ui/App.js b/wikibase/queryService/ui/App.js
index 4c0a524..25e6edf 100644
--- a/wikibase/queryService/ui/App.js
+++ b/wikibase/queryService/ui/App.js
@@ -10,11 +10,6 @@
 
        var TRACKING_NAMESPACE = 'wikibase.queryService.ui.app.';
 
-       var QUERY_ERROR_MAP = {
-                       'QueryTimeoutException: Query deadline is expired': 
'wdqs-action-timeout',
-                       'MalformedQueryException: ': 
'wdqs-action-malformed-query'
-       };
-
        /**
         * A ui application for the Wikibase query service
         *
@@ -603,10 +598,9 @@
                $( '#execute-button' ).prop( 'disabled', true );
                $( '#query-error' ).hide();
 
-               this._sparqlApi.query( this._editor.getValue() ).done(
-                               $.proxy( this._handleQueryResult, this ) 
).fail( function() {
-                       self._handleQueryError( 
self._sparqlApi.getErrorMessage() );
-               } );
+               this._sparqlApi.query( this._editor.getValue() )
+                       .done( $.proxy( this._handleQueryResult, this ) )
+                       .fail( $.proxy( this._handleQueryError, this ) );
 
                $( '.queryUri' ).attr( 'href', self._sparqlApi.getQueryUri() );
        };
@@ -614,28 +608,33 @@
        /**
         * @private
         */
-       SELF.prototype._handleQueryError = function( error ) {
-               $( '#query-error' ).html( $( '<pre>' ).text( error ) ).show();
-               var shortError = null,
-                       errorMessageKey = null,
-                       errorToMatch = error.substring( error.indexOf( 
'java.util.concurrent.ExecutionException:' ) );
-
-               for ( var errorKey in QUERY_ERROR_MAP ) {
-                       if ( errorToMatch.indexOf( errorKey ) !== -1 ) {
-                               errorMessageKey = QUERY_ERROR_MAP[ errorKey ];
-                       }
-               }
-               if ( errorMessageKey === null || errorMessageKey === 
'wdqs-action-malformed-query' ) {
-                       shortError = error.match(
-                               
/(java\.util\.concurrent\.ExecutionException\:)+(.*)(Exception\:)+(.*)/ 
).pop().trim();
-               }
-
-               this._actionBar.show( errorMessageKey || '', shortError || '', 
'danger' );
+       SELF.prototype._handleQueryError = function() {
                $( '#execute-button' ).prop( 'disabled', false );
 
-               this._track( 'result.error.' + ( QUERY_ERROR_MAP[ shortError ] 
|| 'unknown' ) );
+               var error = this._sparqlApi.getError(), errorMessageKey = null, 
codes = this._sparqlApi.ERROR_CODES;
 
-               this._editor.highlightError( error );
+               switch ( error.code ) {
+               case codes.TIMEOUT:
+                       errorMessageKey = 'wdqs-action-timeout';
+                       break;
+               case codes.MALFORMED:
+                       errorMessageKey = 'wdqs-action-malformed-query';
+                       break;
+               case codes.SERVER:
+                       errorMessageKey = 'wdqs-action-server-error';
+                       break;
+               default:
+                       errorMessageKey = 'wdqs-action-unknow-error';
+                       break;
+               }
+
+               if ( error.debug ) {
+                       $( '#query-error' ).html( $( '<pre>' ).text( 
error.debug ) ).show();
+               }
+
+               this._actionBar.show( errorMessageKey || '', error.message || 
'', 'danger' );
+               this._track( 'result.error.' + ( errorMessageKey || 'unknown' ) 
);
+               this._editor.highlightError( error.debug );
        };
 
        /**

-- 
To view, visit https://gerrit.wikimedia.org/r/315505
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0c58cdcee72b25c60ec02b68bf25f4029641af01
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/gui
Gerrit-Branch: master
Gerrit-Owner: Jonas Kress (WMDE) <jonas.kr...@wikimedia.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to