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

HUE-6296 [editor] Automatically upload query on the fly if enabled

Romain Rigaux 8 жил өмнө
parent
commit
ec82233

+ 3 - 0
desktop/conf.dist/hue.ini

@@ -1641,6 +1641,9 @@
     # Default to true automatically if the cluster is secure.
     ## apply_sentry_permissions=False
 
+    # Automatically upload queries after their execution in order to improve recommendations.
+    ## auto_upload_queries=true
+
     # In secure mode (HTTPS), if Optimizer SSL certificates have to be verified against certificate authority.
     ## ssl_cert_ca_verify=True
 

+ 3 - 0
desktop/conf/pseudo-distributed.ini.tmpl

@@ -1645,6 +1645,9 @@
     # Default to true automatically if the cluster is secure.
     ## apply_sentry_permissions=False
 
+    # Automatically upload queries after their execution in order to improve recommendations.
+    ## auto_upload_queries=true
+
     # In secure mode (HTTPS), if Optimizer SSL certificates have to be verified against certificate authority.
     ## ssl_cert_ca_verify=True
 

+ 6 - 0
desktop/libs/metadata/src/metadata/conf.py

@@ -117,6 +117,12 @@ OPTIMIZER = ConfigSection(
       dynamic_default=get_security_default,
       type=coerce_bool
     ),
+    AUTO_UPLOAD_QUERIES = Config(
+      key="auto_upload_queries",
+      help=_t("Automatically upload queries after their execution in order to improve recommendations."),
+      default=True,
+      type=coerce_bool
+    ),
 
     EMAIL=Config(
       key="email",

+ 25 - 1
desktop/libs/metadata/src/metadata/optimizer_api.py

@@ -31,7 +31,7 @@ from notebook.api import _get_statement
 from notebook.models import Notebook
 
 from metadata.optimizer_client import OptimizerApi, NavOptException, _get_table_name
-
+from metadata.conf import OPTIMIZER
 
 LOG = logging.getLogger(__name__)
 
@@ -337,6 +337,30 @@ def upload_history(request):
   return JsonResponse(response)
 
 
+@require_POST
+@error_handler
+def upload_query(request):
+  response = {'status': -1}
+
+  if OPTIMIZER.AUTO_UPLOAD_QUERIES.get():
+    query_id = request.POST.get('query_id')
+
+    doc = Document2.objects.document(request.user, doc_id=query_id)
+
+    query_data = Notebook(document=doc).get_data()
+    queries = _convert_queries([query_data])
+    source_platform = query_data['snippets'][0]['type']
+
+    api = OptimizerApi(request.user)
+
+    response['query_upload'] = api.upload(data=queries, data_type='queries', source_platform=source_platform)
+  else:
+    response['query_upload'] = _('Skipped')
+  response['status'] = 0
+
+  return JsonResponse(response)
+
+
 @require_POST
 @error_handler
 def upload_table_stats(request):

+ 1 - 0
desktop/libs/metadata/src/metadata/urls.py

@@ -37,6 +37,7 @@ urlpatterns = patterns('metadata.navigator_api',
 # Optimizer API
 urlpatterns += patterns('metadata.optimizer_api',
   url(r'^api/optimizer/upload/history/?$', 'upload_history', name='upload_history'),
+  url(r'^api/optimizer/upload/query/?$', 'upload_query', name='upload_query'),
   url(r'^api/optimizer/upload/table_stats/?$', 'upload_table_stats', name='upload_table_stats'),
   url(r'^api/optimizer/upload/status/?$', 'upload_status', name='upload_status'),
 

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

@@ -1119,6 +1119,9 @@ var EditorViewModel = (function() {
         if (data.status == 0) {
           self.result.handle(data.handle);
           self.result.hasResultset(data.handle.has_result_set);
+          if (vm.isOptimizerEnabled()) {
+            huePubSub.publish('editor.upload.query', data.history_id);
+          }
           if (data.handle.sync) {
             self.loadData(data.result, 100);
             self.status('available');
@@ -1616,8 +1619,8 @@ var EditorViewModel = (function() {
       });
     };
 
-    self.loadQueryHistory = function (n) {
-      hueAnalytics.log('notebook', 'load_query_history');
+    self.uploadQueryHistory = function (n) {
+      hueAnalytics.log('notebook', 'upload_query_history');
 
       $.post("/metadata/api/optimizer/upload/history", {
         n: typeof n != "undefined" ? n : null,
@@ -1632,7 +1635,13 @@ var EditorViewModel = (function() {
       });
     };
 
-    self.loadTableStats = function (activeTables) {
+    self.uploadQuery = function (query_id) {
+      $.post("/metadata/api/optimizer/upload/query", {
+        query_id: query_id,
+      });
+    };
+
+    self.uploadTableStats = function (activeTables) {
       hueAnalytics.log('notebook', 'load_table_stats');
       $(document).trigger("info", "Preparing table data...");
 

+ 7 - 10
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -1719,13 +1719,6 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, ENABLE_
             <i class="fa fa-fw fa-random"></i> ${_('Check compatibility')}
           </a>
         </li>
-        % if user.is_superuser:
-        <li>
-          <a href="javascript:void(0)" data-bind="click: function() { huePubSub.publish('editor.workload.upload'); }" title="${ _('Load past query history in order to improve recommendations') }">
-            <i class="fa fa-fw fa-cloud-upload"></i> ${_('Upload history')}
-          </a>
-        </li>
-        % endif
         <!-- /ko -->
       </ul>
     </div>
@@ -3098,11 +3091,15 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, ENABLE_
       viewModel.init();
 
       huePubSub.subscribe("editor.table.stats.upload", function (activeTables) {
-        viewModel.selectedNotebook().snippets()[0].loadTableStats(activeTables);
+        viewModel.selectedNotebook().snippets()[0].uploadTableStats(activeTables);
+      });
+
+      huePubSub.subscribe("editor.upload.history", function () {
+        viewModel.selectedNotebook().snippets()[0].uploadQueryHistory(5);
       });
 
-      huePubSub.subscribe("editor.workload.upload", function () {
-        viewModel.selectedNotebook().snippets()[0].loadQueryHistory(5);
+      huePubSub.subscribe("editor.upload.query", function (query_id) {
+        viewModel.selectedNotebook().snippets()[0].uploadQuery(query_id);
       });
 
       huePubSub.subscribe('active.editor.statement.changed', function (statement) {