Browse Source

HUE-1909 [impala] No errors are displayed

In both Impala/Beeswax:
- create table already exists three times
- create aaaaaaa thre times
- one multiple query three times: show tables, create aaaaaa, select * from sample_07
- explaine with good and bad synxtax several times
Romain Rigaux 12 years ago
parent
commit
bd786d5

+ 5 - 2
apps/beeswax/src/beeswax/api.py

@@ -33,7 +33,8 @@ import beeswax.models
 from beeswax.forms import QueryForm
 from beeswax.design import HQLdesign
 from beeswax.server import dbms
-from beeswax.server.dbms import expand_exception, get_query_server_config
+from beeswax.server.dbms import expand_exception, get_query_server_config,\
+  QueryServerException
 from beeswax.views import authorized_get_design, authorized_get_query_history, make_parameterization_form,\
                           safe_get_design, save_design, massage_columns_for_json, _get_query_handle_and_state,\
                           _parse_out_hadoop_jobs
@@ -54,7 +55,7 @@ def error_handler(view_fn):
         message = str(e)
       else:
         message = force_unicode(e.message, strings_only=True, errors='replace')
-        
+
         if 'Invalid OperationHandle' in message and 'id' in kwargs:
           # Expired state.
           query_history = authorized_get_query_history(request, kwargs['id'], must_exist=False)
@@ -154,6 +155,8 @@ def watch_query_refresh_json(request, id):
     if request.POST.get('next') or (not query_history.is_finished() and query_history.is_success() and not query_history.has_results):
       query_history = db.execute_next_statement(query_history)
       handle, state = _get_query_handle_and_state(query_history)
+  except QueryServerException, ex:
+    raise ex
   except Exception, ex:
     LOG.exception(ex)
     handle, state = _get_query_handle_and_state(query_history)

+ 5 - 7
apps/beeswax/src/beeswax/templates/execute.mako

@@ -215,17 +215,15 @@ ${layout.menubar(section='query')}
       <div class="tab-content">
         <div id="queryPane">
 
-          <div data-bind="css: {'hide': design.query.errors().length == 0}" class="hide alert alert-error">
+          <div data-bind="css: {'hide': design.errors().length == 0}" class="alert alert-error">
             <!-- ko if: $root.getQueryErrors().length > 0 -->
             <p><strong>${_('Please provide a query')}</strong></p>
             <!-- /ko -->
             <!-- ko if: $root.getQueryErrors().length == 0 -->
             <p><strong>${_('Your query has the following error(s):')}</strong></p>
 
-            <div>
-              <div data-bind="foreach: design.errors">
-                <p data-bind="text: $data" class="queryErrorMessage"></p>
-              </div>
+            <div data-bind="foreach: design.errors">
+              <p data-bind="text: $data" class="queryErrorMessage"></p>
             </div>
             <!-- /ko -->
           </div>
@@ -316,8 +314,8 @@ ${layout.menubar(section='query')}
             </tbody>
           </table>
         </div>
-        <div class="tab-pane" id="results">
 
+        <div class="tab-pane" id="results">
           <div data-bind="css: {'hide': design.results.errors().length == 0}" class="alert alert-error">
             <p><strong>${_('Fetching results ran into the following error(s):')}</strong></p>
 
@@ -1522,7 +1520,7 @@ $(document).on('error.query', function () {
     errorWidgets = [];
   });
 
-  // Move error to codeMirror if we konw the line number
+  // Move error to codeMirror if we know the line number
   $.each($(".queryErrorMessage"), function(index, el) {
     var err = $(el).text().toLowerCase();
     var firstPos = err.indexOf("line");

+ 17 - 30
apps/beeswax/static/js/beeswax.vm.js

@@ -245,18 +245,6 @@ function BeeswaxViewModel(server) {
     self.design.fileResources.values.splice(index, 1);
   };
 
-  self.getFileResourceTypeErrors = function(index) {
-    if (self.design.settings.errors() && self.design.settings.errors()[index]) {
-      return self.design.settings.errors()[index];
-    } else {
-      return {};
-    }
-  };
-
-  self.getFileResourcePathErrors = function(index) {
-    
-  };
-
   self.addFunction = function(name, class_name) {
     var obj = {
       'name': ko.observable(name),
@@ -275,14 +263,6 @@ function BeeswaxViewModel(server) {
     self.design.functions.values.splice(index, 1);
   };
 
-  self.getFunctionErrors = function(index) {
-    if (self.design.settings.errors() && self.design.settings.errors()[index]) {
-      return self.design.settings.errors()[index];
-    } else {
-      return {};
-    }
-  };
-
   var advancedErrorHandling = function(advanced_parameter, key) {
     return function(index) {
       var errors = self.design[advanced_parameter].errors();
@@ -496,19 +476,20 @@ function BeeswaxViewModel(server) {
       dataType: 'json',
       type: 'POST',
       success: function(data) {
-        self.resetErrors();
+        self.design.errors.removeAll();
+        self.design.watch.errors.removeAll();
         if (data.status == 0) {
           self.design.results.url('/' + self.server() + '/results/' + data.id + '/0?format=json');
           self.design.watch.url(data.watch_url);
           self.design.statement(data.statement);
           self.design.history.id(data.id);
           self.watchQueryLoop();
+          $(document).trigger('executed.query', data);
         } else {
           self.setErrors(data.message, data.errors);
           self.design.isRunning(false);
           $(document).trigger('error.query');
         }
-        $(document).trigger('executed.query', data);
       },
       error: error_fn,
       data: data
@@ -531,13 +512,19 @@ function BeeswaxViewModel(server) {
       dataType: 'json',
       type: 'POST',
       success: function(data) {
-        self.resetErrors();
-        self.design.watch.logs.removeAll();
-        self.design.statement(data.statement);
-        self.design.watch.url(data.watch_url);
-        self.design.results.url('/' + self.server() + '/results/' + data.id + '/0?format=json');
-        self.watchQueryLoop();
-        $(document).trigger('executed.query', data);
+        if (data.status == 0) {
+          self.design.watch.logs.removeAll();
+          self.design.statement(data.statement);
+          self.design.watch.url(data.watch_url);
+          self.design.results.url('/' + self.server() + '/results/' + data.id + '/0?format=json');
+          self.watchQueryLoop();
+          $(document).trigger('executed.query', data);
+        } else {
+          self.setErrors(data.message, data.errors);
+          self.design.isRunning(false);
+          self.design.isFinished(false); // We propose to skip the failed statement
+          $(document).trigger('error.query');
+        }
       },
       error: error_fn,
       data: data
@@ -623,7 +610,7 @@ function BeeswaxViewModel(server) {
 
   self.fetchResults = function() {
     $(document).trigger('fetch.results');
-    self.resetErrors();
+    self.design.errors.removeAll();
     var request = {
       url: self.design.results.url(),
       dataType: 'json',