Răsfoiți Sursa

HUE-4885 [editor] Integrate result row count when available

Romain Rigaux 9 ani în urmă
părinte
comite
13f2cc5

+ 37 - 41
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -290,51 +290,47 @@ class HS2Api(Api):
   def fetch_result_size(self, notebook, snippet):
     resp = {
       'rows': None,
-      'size': None
+      'size': None,
+      'message': ''
     }
 
-    # Check that the results are available
-    if snippet.get('status') == 'available':
-      # Attempt to get metadata
-      if snippet['type'] == 'hive':
-        engine = self._get_hive_execution_engine(notebook, snippet).lower()
-        if engine == 'mr':
-          # Get last task of last job
-          logs = self.get_log(notebook, snippet, startFrom=0)
-
-          jobs = self.get_jobs(notebook, snippet, logs)
-          if jobs:
-            last_job_id = jobs[-1].get('name')
-            LOG.info("Hive query executed %d jobs, last job ID is: %s" % (len(jobs), last_job_id))
-
-            # Attempt to fetch last task's syslog and parse the total records
-            task_syslog = self._get_syslog(last_job_id)
-            if task_syslog:
-              total_records_re = "org.apache.hadoop.hive.ql.exec.FileSinkOperator: RECORDS_OUT_0:(?P<total_records>\d+)"
-              total_records_match = re.search(total_records_re, task_syslog, re.MULTILINE)
-              if total_records_match:
-                resp['rows'] = int(total_records_match.group('total_records'))
-            else:
-              LOG.warn("Failed to get task syslog for Hive query with job ID: %s" % last_job_id)
-          else:
-            LOG.info("Hive query did not execute any jobs.")
-        elif engine == 'spark':
-          logs = self.get_log(notebook, snippet, startFrom=0)
-
-          total_records_re = "RECORDS_OUT_0: (?P<total_records>\d+)"
-          total_size_re = "Spark Job\[[a-z0-9-]+\] Metrics[A-Za-z0-9:\s]+ResultSize: (?P<total_size>\d+)"
-          total_records_match = re.search(total_records_re, logs, re.MULTILINE)
-          total_size_match = re.search(total_size_re, logs, re.MULTILINE)
-
-          if total_records_match:
-            resp['rows'] = int(total_records_match.group('total_records'))
-          if total_size_match:
-            resp['size'] = int(total_size_match.group('total_size'))
+    total_records_match = None
+    total_size_match = None
+
+    if snippet.get('status') != 'available':
+      raise QueryError(_('Result status is not available'))
+
+    if snippet['type'] != 'hive':
+      raise QueryError(_('Cannot fetch result metadata for snippet type: %s') % snippet['type'])
+
+    engine = self._get_hive_execution_engine(notebook, snippet).lower()
+    logs = self.get_log(notebook, snippet, startFrom=0)
+
+    if engine == 'mr':
+      jobs = self.get_jobs(notebook, snippet, logs)
+      if jobs:
+        last_job_id = jobs[-1].get('name')
+        LOG.info("Hive query executed %d jobs, last job is: %s" % (len(jobs), last_job_id))
+
+        # Attempt to fetch last task's syslog and parse the total records
+        task_syslog = self._get_syslog(last_job_id)
+        if task_syslog:
+          total_records_re = "org.apache.hadoop.hive.ql.exec.FileSinkOperator: RECORDS_OUT_0:(?P<total_records>\d+)"
+          total_records_match = re.search(total_records_re, task_syslog, re.MULTILINE)
         else:
-          LOG.warn('Cannot fetch result metadata for execution engine: %s' % engine)
-      # TODO: Impala
+          raise QueryError(_('Failed to get task syslog for Hive query with job: %s')  % last_job_id)
       else:
-        LOG.warn('Cannot fetch result metadata for snippet type: %s' % snippet['type'])
+        resp['message'] = _('Hive query did not execute any jobs.')
+    elif engine == 'spark':
+      total_records_re = "RECORDS_OUT_0: (?P<total_records>\d+)"
+      total_size_re = "Spark Job\[[a-z0-9-]+\] Metrics[A-Za-z0-9:\s]+ResultSize: (?P<total_size>\d+)"
+      total_records_match = re.search(total_records_re, logs, re.MULTILINE)
+      total_size_match = re.search(total_size_re, logs, re.MULTILINE)
+
+    if total_records_match:
+      resp['rows'] = int(total_records_match.group('total_records'))
+    if total_size_match:
+      resp['size'] = int(total_size_match.group('total_size'))
 
     return resp
 

+ 3 - 2
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -163,6 +163,7 @@
       self.endTime(new Date());
       self.explanation('');
       self.logLines = 0;
+      self.size({});
     };
   };
 
@@ -1082,7 +1083,7 @@
         snippet: ko.mapping.toJSON(self.getContext())
       }, function (data) {
         if (data.status == 0) {
-          self.result.size(data.result.size);
+          self.result.size(data.result);
         } else {
           $(document).trigger("error", data.message);
         }
@@ -1112,7 +1113,7 @@
             }
             else if (self.status() == 'available') {
               self.fetchResult(100);
-              // self.fetchResultSize(); Disabled for now
+              self.fetchResultSize();
               self.progress(100);
              if (self.isSqlDialect() && ! self.result.handle().has_result_set) { // DDL
                 self.ddlNotification(Math.random());

+ 3 - 0
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -1250,6 +1250,9 @@ ${ hueIcons.symbols() }
         <!-- ko if: result.hasSomeResults -->
         <li data-bind="click: function(){ currentQueryTab('queryResults'); }, css: {'active': currentQueryTab() == 'queryResults'}">
           <a class="inactive-action" href="#queryResults" data-toggle="tab">${_('Results')}
+            <!-- ko if: result.size() && result.size().rows -->
+              (<span data-bind="text: result.size().rows" title="${ _('Number of rows') }"></span>)
+            <!-- /ko -->
             <div class="inline-block inactive-action margin-left-10 pointer" title="${_('Search the results')}" data-bind="click: function(data, e){ $(e.target).parents('.snippet').find('.resultTable').hueDataTable().fnShowSearch() }"><i class="snippet-icon fa fa-search"></i></div>
             <div class="inline-block inactive-action pointer" title="${_('Expand results')}" rel="tooltip" data-bind="visible: !$root.isFullscreenMode() && !$root.isPlayerMode(), click: function(){ $root.isPlayerMode(true); }"><i class="snippet-icon fa fa-expand"></i></div>
             <div class="inline-block inactive-action pointer" title="${_('Collapse results')}" rel="tooltip" data-bind="visible: !$root.isFullscreenMode() && $root.isPlayerMode(), click: function(){ $root.isPlayerMode(false); }"><i class="snippet-icon fa fa-compress"></i></div>