Эх сурвалжийг харах

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 жил өмнө
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.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.github import GithubClient
 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]
       if 'handle' in response: # No failure
         _snippet['result']['handle'] = response['handle']
-        _snippet['result']['statements_count'] = response['handle']['statements_count']
       else:
         _snippet['status'] = 'failed'
       history = _historify(notebook, request.user)

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

@@ -39,8 +39,9 @@ class AuthenticationRequired(Exception):
   pass
 
 class QueryError(Exception):
-  def __init__(self, message):
+  def __init__(self, message, handle=None):
     self.message = message
+    self.handle = handle
 
   def __str__(self):
     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):
     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:
       db.use(query.database)
       handle = db.client.query(query)
     except QueryServerException, ex:
-      raise QueryError(ex.message)
+      raise QueryError(ex.message, handle=statement)
 
     # All good
     server_id, server_guid = handle.get()
-    response.update({
+    response = {
       'secret': server_id,
       'guid': server_guid,
       'operation_type': handle.operation_type,
       'has_result_set': handle.has_result_set,
       'modified_row_count': handle.modified_row_count,
       'log_context': handle.log_context,
-    })
+    }
+    response.update(statement)
 
     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)
       response['status'] = 1
       response['message'] = force_unicode(str(e))
+      if e.handle:
+        response['handle'] = e.handle
     except Exception, e:
       LOG.exception('error running %s' % func)
       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.handle(data.handle);
           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) {
             self.loadData(data.handle, 100);
             self.status('success');
@@ -618,6 +605,18 @@
         } else {
           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) {
         $(document).trigger("error", xhr.responseText);
         self.status('failed');
@@ -625,6 +624,7 @@
       });
     };
 
+
     self.reexecute = function () {
       self.result.handle()['statement_id'] = 0;
       self.result.handle()['start'] = {
@@ -689,7 +689,7 @@
         targetPlatform: 'impala'
       }, function(data) {
         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);
         } else {
           $(document).trigger("error", data.message);