瀏覽代碼

HUE-4338 [editor] API to provide result set row count and data size

Romain Rigaux 9 年之前
父節點
當前提交
84b00c4

+ 15 - 0
desktop/libs/notebook/src/notebook/api.py

@@ -241,6 +241,21 @@ def fetch_result_metadata(request):
   return JsonResponse(response)
   return JsonResponse(response)
 
 
 
 
+@require_POST
+@check_document_access_permission()
+@api_error_handler
+def fetch_result_size(request):
+  response = {'status': -1}
+
+  notebook = json.loads(request.POST.get('notebook', '{}'))
+  snippet = json.loads(request.POST.get('snippet', '{}'))
+
+  response['result'] = get_api(request, snippet).fetch_result_size(notebook, snippet)
+  response['status'] = 0
+
+  return JsonResponse(response)
+
+
 @require_POST
 @require_POST
 @check_document_access_permission()
 @check_document_access_permission()
 @api_error_handler
 @api_error_handler

+ 3 - 0
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -177,3 +177,6 @@ class Api(object):
   def export_data_as_table(self, notebook, snippet, destination, is_temporary=False, location=None): raise NotImplementedError()
   def export_data_as_table(self, notebook, snippet, destination, is_temporary=False, location=None): raise NotImplementedError()
 
 
   def export_large_data_to_hdfs(self, notebook, snippet, destination): raise NotImplementedError()
   def export_large_data_to_hdfs(self, notebook, snippet, destination): raise NotImplementedError()
+
+  def fetch_result_size(self, notebook, snippet):
+    pass

+ 7 - 2
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -402,6 +402,11 @@ class HS2Api(Api):
       'statement': query.get_query_statement(0),
       'statement': query.get_query_statement(0),
     }
     }
 
 
+  def fetch_result_size(self, notebook, snippet):
+    return {
+      'rows': 1000,
+      'size': 1024 * 1024 * 100, # Until HUE-4181
+    }
 
 
   @query_error_handler
   @query_error_handler
   def export_data_as_hdfs_file(self, snippet, target_file, overwrite):
   def export_data_as_hdfs_file(self, snippet, target_file, overwrite):
@@ -422,7 +427,7 @@ class HS2Api(Api):
     query = self._prepare_hql_query(snippet, response.pop('statement'), session)
     query = self._prepare_hql_query(snippet, response.pop('statement'), session)
 
 
     if 'select' not in query.hql_query.strip().lower():
     if 'select' not in query.hql_query.strip().lower():
-      raise Exception(_('Only SELECT statements can be saved. Provided statement: %(query)s') % {'query': query.hql_query})
+      raise PopupException(_('Only SELECT statements can be saved. Provided statement: %(query)s') % {'query': query.hql_query})
 
 
     database = snippet.get('database') or 'default'
     database = snippet.get('database') or 'default'
     table = destination
     table = destination
@@ -446,7 +451,7 @@ class HS2Api(Api):
     query = self._prepare_hql_query(snippet, response.pop('statement'), session)
     query = self._prepare_hql_query(snippet, response.pop('statement'), session)
 
 
     if 'select' not in query.hql_query.strip().lower():
     if 'select' not in query.hql_query.strip().lower():
-      raise Exception(_('Only SELECT statements can be saved. Provided statement: %(query)s') % {'query': query.hql_query})
+      raise PopupException(_('Only SELECT statements can be saved. Provided statement: %(query)s') % {'query': query.hql_query})
 
 
     db.use(query.database)
     db.use(query.database)
 
 

+ 2 - 2
desktop/libs/notebook/src/notebook/models.py

@@ -52,8 +52,7 @@ def escape_rows(rows, nulls_only=False):
 
 
 
 
 def make_notebook(name='Browse', description='', editor_type='hive', statement='', status='ready',
 def make_notebook(name='Browse', description='', editor_type='hive', statement='', status='ready',
-                  files=None, functions=None, settings=None, is_saved=False, database='default', snippet_properties=None):
-
+                  files=None, functions=None, settings=None, is_saved=False, database='default', snippet_properties=None, batch_submit=False):
   from notebook.connectors.hiveserver2 import HS2Api
   from notebook.connectors.hiveserver2 import HS2Api
 
 
   editor = Notebook()
   editor = Notebook()
@@ -101,6 +100,7 @@ def make_notebook(name='Browse', description='', editor_type='hive', statement='
          'statement_raw': statement,
          'statement_raw': statement,
          'statement': statement,
          'statement': statement,
          'type': editor_type,
          'type': editor_type,
+         'wasBatchExecuted': batch_submit,
          'properties': {
          'properties': {
             'files': [] if files is None else files,
             'files': [] if files is None else files,
             'functions': [] if functions is None else functions,
             'functions': [] if functions is None else functions,

+ 17 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -46,6 +46,7 @@
       .extend("throttle", 100);
       .extend("throttle", 100);
     self.handle = ko.observable(typeof result.handle != "undefined" && result.handle != null ? result.handle : {});
     self.handle = ko.observable(typeof result.handle != "undefined" && result.handle != null ? result.handle : {});
     self.meta = ko.observableArray(typeof result.meta != "undefined" && result.meta != null ? result.meta : []);
     self.meta = ko.observableArray(typeof result.meta != "undefined" && result.meta != null ? result.meta : []);
+    self.size = ko.observable(typeof result.size != "undefined" && result.size != null ? result.size : {});
     self.hasMore = ko.observable(typeof result.hasMore != "undefined" && result.hasMore != null ? result.hasMore : false);
     self.hasMore = ko.observable(typeof result.hasMore != "undefined" && result.hasMore != null ? result.hasMore : false);
     self.statement_id = ko.observable(typeof result.statement_id != "undefined" && result.statement_id != null ? result.statement_id : 0);
     self.statement_id = ko.observable(typeof result.statement_id != "undefined" && result.statement_id != null ? result.statement_id : 0);
     self.statement_range = ko.observable(typeof result.statement_range != "undefined" && result.statement_range != null ? result.statement_range : {
     self.statement_range = ko.observable(typeof result.statement_range != "undefined" && result.statement_range != null ? result.statement_range : {
@@ -1033,6 +1034,21 @@
       });
       });
     };
     };
 
 
+    self.fetchResultSize = function() {
+      $.post("/notebook/api/fetch_result_size", {
+        notebook: ko.mapping.toJSON(notebook.getContext()),
+        snippet: ko.mapping.toJSON(self.getContext())
+      }, function (data) {
+        if (data.status == 0) {
+          self.result.size(data.result.size);
+        } else {
+          $(document).trigger("error", data.message);
+        }
+      }).fail(function (xhr, textStatus, errorThrown) {
+        $(document).trigger("error", xhr.responseText);
+      });
+    };
+
     self.checkStatus = function () {
     self.checkStatus = function () {
       $.post("/notebook/api/check_status", {
       $.post("/notebook/api/check_status", {
         notebook: ko.mapping.toJSON(notebook.getContext()),
         notebook: ko.mapping.toJSON(notebook.getContext()),
@@ -1054,6 +1070,7 @@
             }
             }
             else if (self.status() == 'available') {
             else if (self.status() == 'available') {
               self.fetchResult(100);
               self.fetchResult(100);
+              // self.fetchResultSize(); Disabled for now
               self.progress(100);
               self.progress(100);
              if (self.isSqlDialect() && ! self.result.handle().has_result_set) { // DDL
              if (self.isSqlDialect() && ! self.result.handle().has_result_set) { // DDL
                 self.ddlNotification(Math.random());
                 self.ddlNotification(Math.random());

+ 2 - 1
desktop/libs/notebook/src/notebook/urls.py

@@ -51,9 +51,10 @@ urlpatterns += patterns('notebook.api',
   url(r'^api/create_session/?$', 'create_session', name='create_session'),
   url(r'^api/create_session/?$', 'create_session', name='create_session'),
   url(r'^api/close_session/?$', 'close_session', name='close_session'),
   url(r'^api/close_session/?$', 'close_session', name='close_session'),
   url(r'^api/execute/?$', 'execute', name='execute'),
   url(r'^api/execute/?$', 'execute', name='execute'),
-  url(r'^api/check_status/?$', 'check_status', name='check_status'),
+  url(r'^api/check_status/?$', 'check_status', name='check_status'),  
   url(r'^api/fetch_result_data/?$', 'fetch_result_data', name='fetch_result_data'),
   url(r'^api/fetch_result_data/?$', 'fetch_result_data', name='fetch_result_data'),
   url(r'^api/fetch_result_metadata/?$', 'fetch_result_metadata', name='fetch_result_metadata'),
   url(r'^api/fetch_result_metadata/?$', 'fetch_result_metadata', name='fetch_result_metadata'),
+  url(r'^api/fetch_result_size/?$', 'fetch_result_size', name='fetch_result_size'),
   url(r'^api/cancel_statement/?$', 'cancel_statement', name='cancel_statement'),
   url(r'^api/cancel_statement/?$', 'cancel_statement', name='cancel_statement'),
   url(r'^api/close_statement/?$', 'close_statement', name='close_statement'),
   url(r'^api/close_statement/?$', 'close_statement', name='close_statement'),
   url(r'^api/get_logs/?$', 'get_logs', name='get_logs'),
   url(r'^api/get_logs/?$', 'get_logs', name='get_logs'),