Browse Source

HUE-3502 [editor] Handle correct statement number on multi query error

We need to return the current statement position even if the execution failed.
If not we stay on the old statement and does not move by one.
Romain Rigaux 9 years ago
parent
commit
f3b71333c2

+ 1 - 3
desktop/libs/notebook/src/notebook/api.py

@@ -27,8 +27,7 @@ from django.views.decorators.http import require_GET, require_POST
 from desktop.lib.django_util import JsonResponse
 from desktop.lib.django_util import JsonResponse
 from desktop.models import Document2, Document
 from desktop.models import Document2, Document
 
 
-from notebook.connectors.base import get_api, Notebook, QueryExpired,\
-  SessionExpired
+from notebook.connectors.base import get_api, Notebook, QueryExpired, SessionExpired
 from notebook.decorators import api_error_handler, check_document_access_permission, check_document_modify_permission
 from notebook.decorators import api_error_handler, check_document_access_permission, check_document_modify_permission
 from notebook.github import GithubClient
 from notebook.github import GithubClient
 from notebook.models import escape_rows
 from notebook.models import escape_rows
@@ -93,7 +92,6 @@ def execute(request):
       _snippet = [s for s in notebook['snippets'] if s['id'] == snippet['id']][0]
       _snippet = [s for s in notebook['snippets'] if s['id'] == snippet['id']][0]
       if 'handle' in response: # No failure
       if 'handle' in response: # No failure
         _snippet['result']['handle'] = response['handle']
         _snippet['result']['handle'] = response['handle']
-        _snippet['result']['statements_count'] = response['handle']['statements_count']
       else:
       else:
         _snippet['status'] = 'failed'
         _snippet['status'] = 'failed'
       history = _historify(notebook, request.user)
       history = _historify(notebook, request.user)

+ 2 - 1
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -39,8 +39,9 @@ class AuthenticationRequired(Exception):
   pass
   pass
 
 
 class QueryError(Exception):
 class QueryError(Exception):
-  def __init__(self, message):
+  def __init__(self, message, handle=None):
     self.message = message
     self.message = message
+    self.handle = handle
 
 
   def __str__(self):
   def __str__(self):
     return force_unicode(str(self.message))
     return force_unicode(str(self.message))

+ 6 - 5
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -108,26 +108,27 @@ class HS2Api(Api):
   def execute(self, notebook, snippet):
   def execute(self, notebook, snippet):
     db = self._get_db(snippet)
     db = self._get_db(snippet)
 
 
-    response = self._get_current_statement(db, snippet)
+    statement = self._get_current_statement(db, snippet)
 
 
-    query = self._prepare_hql_query(snippet, response.pop('statement'))
+    query = self._prepare_hql_query(snippet, statement.pop('statement'))
 
 
     try:
     try:
       db.use(query.database)
       db.use(query.database)
       handle = db.client.query(query)
       handle = db.client.query(query)
     except QueryServerException, ex:
     except QueryServerException, ex:
-      raise QueryError(ex.message)
+      raise QueryError(ex.message, handle=statement)
 
 
     # All good
     # All good
     server_id, server_guid = handle.get()
     server_id, server_guid = handle.get()
-    response.update({
+    response = {
       'secret': server_id,
       'secret': server_id,
       'guid': server_guid,
       'guid': server_guid,
       'operation_type': handle.operation_type,
       'operation_type': handle.operation_type,
       'has_result_set': handle.has_result_set,
       'has_result_set': handle.has_result_set,
       'modified_row_count': handle.modified_row_count,
       'modified_row_count': handle.modified_row_count,
       'log_context': handle.log_context,
       'log_context': handle.log_context,
-    })
+    }
+    response.update(statement)
 
 
     return response
     return response
 
 

+ 2 - 0
desktop/libs/notebook/src/notebook/decorators.py

@@ -89,6 +89,8 @@ def api_error_handler(func):
       LOG.exception('error running %s' % func)
       LOG.exception('error running %s' % func)
       response['status'] = 1
       response['status'] = 1
       response['message'] = force_unicode(str(e))
       response['message'] = force_unicode(str(e))
+      if e.handle:
+        response['handle'] = e.handle
     except Exception, e:
     except Exception, e:
       LOG.exception('error running %s' % func)
       LOG.exception('error running %s' % func)
       response['status'] = -1
       response['status'] = -1

+ 14 - 14
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -595,19 +595,6 @@
           self.result.clear();
           self.result.clear();
           self.result.handle(data.handle);
           self.result.handle(data.handle);
           self.result.hasResultset(data.handle.has_result_set);
           self.result.hasResultset(data.handle.has_result_set);
-          if (data.handle.statements_count != null) {
-            self.result.statements_count(data.handle.statements_count);
-            if (data.handle.statements_count > 1 && data.handle.start != null && data.handle.end != null) {
-              self.result.statement_range({
-                start: data.handle.start,
-                end: data.handle.end
-              });
-            }
-          }
-          if (data.handle.statement_id != null) {
-            self.result.statement_id(data.handle.statement_id);
-          }
-
           if (data.handle.sync) {
           if (data.handle.sync) {
             self.loadData(data.handle, 100);
             self.loadData(data.handle, 100);
             self.status('success');
             self.status('success');
@@ -618,6 +605,18 @@
         } else {
         } else {
           self._ajaxError(data, self.execute);
           self._ajaxError(data, self.execute);
         }
         }
+
+        if (data.handle.statements_count != null) {
+          self.result.statements_count(data.handle.statements_count);
+          self.result.statement_id(data.handle.statement_id);
+
+          if (data.handle.statements_count > 1 && data.handle.start != null && data.handle.end != null) {
+            self.result.statement_range({
+              start: data.handle.start,
+              end: data.handle.end
+            });
+          }
+        }
       }).fail(function (xhr, textStatus, errorThrown) {
       }).fail(function (xhr, textStatus, errorThrown) {
         $(document).trigger("error", xhr.responseText);
         $(document).trigger("error", xhr.responseText);
         self.status('failed');
         self.status('failed');
@@ -625,6 +624,7 @@
       });
       });
     };
     };
 
 
+
     self.reexecute = function () {
     self.reexecute = function () {
       self.result.handle()['statement_id'] = 0;
       self.result.handle()['statement_id'] = 0;
       self.result.handle()['start'] = {
       self.result.handle()['start'] = {
@@ -689,7 +689,7 @@
         targetPlatform: 'impala'
         targetPlatform: 'impala'
       }, function(data) {
       }, function(data) {
         if (data.status == 0) {
         if (data.status == 0) {
-         self.suggestion(ko.mapping.fromJS(data.query_compatibility.platformCompilationStatus.Impala));  
+         self.suggestion(ko.mapping.fromJS(data.query_compatibility.platformCompilationStatus.Impala));
          self.hasSuggestion(true);
          self.hasSuggestion(true);
         } else {
         } else {
           $(document).trigger("error", data.message);
           $(document).trigger("error", data.message);