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

HUE-3450 [metadata] Provide hints on queries

Romain Rigaux 9 жил өмнө
parent
commit
d710104

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

@@ -101,6 +101,31 @@ def query_compatibility(request):
   return JsonResponse(response)
 
 
+@require_POST
+@error_handler
+def query_complexity(request):
+  response = {'status': -1}
+
+  snippet = json.loads(request.POST.get('snippet'))
+
+  if 'join' in snippet['statement'].lower():
+    comment = 'Large join is happening'
+  elif 'large' in snippet['statement'].lower():
+    comment = 'Previously failed 5 times in a row'
+  elif 'partition' in snippet['statement'].lower():
+    comment = 'Has 50k partitions'
+  else:
+    comment = ''
+
+  response['query_complexity'] = {
+    'level': randome.choice(['LOW', 'MEDIUM', 'HIGH']),
+    'comment': comment
+  }
+  response['status'] = 0
+
+  return JsonResponse(response)
+
+
 @require_POST
 @error_handler
 def upload_history(request):

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

@@ -36,4 +36,5 @@ urlpatterns += patterns('metadata.optimizer_api',
   url(r'^api/optimizer_api/table_details/?$', 'table_details', name='table_details'),
   url(r'^api/optimizer_api/query_compatibility/?$', 'query_compatibility', name='query_compatibility'),
   url(r'^api/optimizer_api/upload_history/?$', 'upload_history', name='upload_history'),
+  url(r'^api/optimizer_api/query_complexity/?$', 'query_complexity', name='query_complexity'),
 )

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

@@ -369,6 +369,11 @@
       });
       return statement;
     });
+    this.delayedStatement = ko.pureComputed(self.statement).extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 2000 } });
+    this.delayedStatement.subscribe(function (val) {
+      self.getComplexity();
+    }, this);
+
     self.result = new Result(snippet, snippet.result);
     self.showGrid = ko.observable(typeof snippet.showGrid != "undefined" && snippet.showGrid != null ? snippet.showGrid : true);
     self.showChart = ko.observable(typeof snippet.showChart != "undefined" && snippet.showChart != null ? snippet.showChart : false);
@@ -421,6 +426,12 @@
 
     self.is_redacted = ko.observable(typeof snippet.is_redacted != "undefined" && snippet.is_redacted != null ? snippet.is_redacted : false);
 
+    self.complexity = ko.observable(typeof snippet.complexity != "undefined" && snippet.complexity != null ? snippet.complexity : '');
+    self.complexityLevel = ko.observable(typeof snippet.complexity_level != "undefined" && snippet.complexity_level != null ? snippet.complexity_level : '');
+    self.hasComplexity = ko.computed(function () {
+      return self.complexity().length > 0;
+    });
+
     self.chartType = ko.observable(typeof snippet.chartType != "undefined" && snippet.chartType != null ? snippet.chartType : ko.HUE_CHARTS.TYPES.BARCHART);
     self.chartSorting = ko.observable(typeof snippet.chartSorting != "undefined" && snippet.chartSorting != null ? snippet.chartSorting : "none");
     self.chartScatterGroup = ko.observable(typeof snippet.chartScatterGroup != "undefined" && snippet.chartScatterGroup != null ? snippet.chartScatterGroup : null);
@@ -854,6 +865,22 @@
       });
     };
 
+    self.getComplexity = function () {
+      logGA('get_complexity');
+      self.complexity('');
+
+      $.post("/metadata/api/optimizer_api/query_complexity", {
+        snippet: ko.mapping.toJSON(self.getContext())
+      }, function(data) {
+        if (data.status == 0) {
+          self.complexity(data.query_complexity.comment);
+          self.complexityLevel(data.query_complexity.level);
+        } else {
+          $(document).trigger("error", data.message);
+        }
+      });
+    };
+
     self.autocompleter = new Autocompleter({
       snippet: self,
       user: vm.user
@@ -1283,6 +1310,7 @@
     self.combinedContent = ko.observable();
     self.isPlayerMode = ko.observable(false);
     self.successUrl = ko.observable(options.success_url);
+    self.isOptimizerEnabled = ko.observable(options.is_optimizer_enabled);
 
     self.sqlSourceTypes = [];
 

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

@@ -660,6 +660,10 @@ ${ require.config() }
   <div class="alert alert-gradient" data-bind="visible: is_redacted">
     ${ _('The current query has been redacted to hide sensitive information.') }
   </div>
+  <div class="alert alert-gradient" data-bind="visible: hasComplexity">
+    <span class="alert alert-error" data-bind="text: complexityLevel"></span>
+    <span data-bind="text: complexity"></span>
+  </div>
   <div class="row-fluid" style="margin-bottom: 5px">
     <div class="editor span12" data-bind="css: {'single-snippet-editor ace-container-resizable' : $root.editorMode }, clickForAceFocus: ace">
       <div class="ace-editor" data-bind="css: {'single-snippet-editor ace-editor-resizable' : $root.editorMode, 'active-editor': inFocus }, attr: { id: id() }, delayedOverflow, aceEditor: {

+ 5 - 1
desktop/libs/notebook/src/notebook/views.py

@@ -26,6 +26,8 @@ from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.json_utils import JSONEncoderForHTML
 from desktop.models import Document2, Document
 
+from metadata.conf import has_optimizer
+
 from notebook.conf import get_interpreters
 from notebook.connectors.base import Notebook, get_api
 from notebook.connectors.spark_shell import SparkApi
@@ -67,7 +69,8 @@ def notebook(request):
           'languages': get_interpreters(request.user),
           'session_properties': SparkApi.PROPERTIES,
       }),
-      'is_yarn_mode': is_yarn_mode
+      'is_yarn_mode': is_yarn_mode,
+      'is_optimizer_enabled': has_optimizer(),
   })
 
 
@@ -93,6 +96,7 @@ def editor(request):
           'mode': 'editor',
       }),
       'editor_type': editor_type,
+      'is_optimizer_enabled': has_optimizer(),
   })