Procházet zdrojové kódy

HUE-6132 [editor] Add list of risks in assistant

Very basic, and probably better to eventually harmonize asking for hints
after query edition, change of statement and maybe analyse button.
Romain Rigaux před 8 roky
rodič
revize
94fd706

+ 18 - 31
desktop/core/src/desktop/templates/assist.mako

@@ -1690,11 +1690,6 @@ from notebook.conf import get_ordered_interpreters
 
 
   <script type="text/html" id="assistant-panel-template">
   <script type="text/html" id="assistant-panel-template">
     ${ _('Tables') }
     ${ _('Tables') }
-    <!-- ko if: HAS_OPTIMIZER -->
-      <a href="javascript:void(0)" data-bind="visible: activeTables().length > 0, click: function() { huePubSub.publish('editor.table.stats.upload', activeTables()); }" title="${ _('Load table and columns stats in order to improve recommendations') }">
-        <i class="fa fa-fw fa-cloud-upload"></i>
-      </a>
-    <!-- /ko -->
     <br/>
     <br/>
     <ul data-bind="foreach: activeTables">
     <ul data-bind="foreach: activeTables">
       <li>
       <li>
@@ -1709,32 +1704,13 @@ from notebook.conf import get_ordered_interpreters
 
 
     <form class="form-horizontal">
     <form class="form-horizontal">
       <fieldset>
       <fieldset>
-        ${ _('Fields') }<br/>
-        <ul>
-          <li>'country-code' is a popular field <a href="javascript:void(0)">add</a></li>
-          <li>'gender' would be a good dimension with low cardinality (2) <a href="javascript:void(0)">add</a></li>
-          <li>'f1'</li>
-          <li>'f2'</li>
-          <li>'f3'</li>
-        </ul>
-      </fieldset>
-    </form>
-
-    <form class="form-horizontal">
-      <fieldset>
-        ${ _('Suggestions') }<br/>
-        <ul>
-          <li>Popular fields for the tables are: [code, salary, amount]</li>
-          <li>The query would run 2x faster by adding a WHERE date_f > '2017-01-01'</li>
-          <li>Parameterize the query?</li>
-          <li>'ts_s=17Q1' is the latest partition <a href="javascript:void(0)">add</a></li>
-          <li>Could be automated with integrated scheduler</li>
-          <li>Data has not been refreshed since last run 3 days ago  <i class="fa fa-warning"></i> <i class="fa fa-refresh"></i></li></li>
-          <li>A schema change happened last week, a new column 'salary_med' was added</li>
-          <li>Data statistics are not accurate, click to refresh them</li>
-          <li>Query ran 17 times last week</li>
-          <li>The datasets are sometimes joined with table [Population]</li>
-          <li>Query would be a good candidate to run interactively with Impala</li>
+        <div data-bind="visible: activeRisks().length > 0">${ _('Suggestions') }</div>
+        <ul data-bind="foreach: activeRisks">
+          <li>
+            <span data-bind="text: risk"></span>
+            <span data-bind="text: riskAnalysis"></span>
+            <span data-bind="text: riskRecommendation"></span>
+          </li>
         </ul>
         </ul>
       </fieldset>
       </fieldset>
     </form>
     </form>
@@ -1743,6 +1719,12 @@ from notebook.conf import get_ordered_interpreters
       <a href="javascript:void(0)" data-bind="click: function() { huePubSub.publish('editor.workload.upload'); }" title="${ _('Load past query history in order to improve recommendations') }">
       <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 workload')}
         <i class="fa fa-fw fa-cloud-upload"></i> ${_('Upload workload')}
       </a>
       </a>
+      <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-gears"></i> ${_('Analyse Query')}
+      </a>
+      <a href="javascript:void(0)" data-bind="visible: activeTables().length > 0, click: function() { huePubSub.publish('editor.table.stats.upload', activeTables()); }" title="${ _('Load table and columns stats in order to improve recommendations') }">
+        <i class="fa fa-fw fa-cloud-upload"></i>
+      </a>      
     <!-- /ko -->
     <!-- /ko -->
   </script>
   </script>
 
 
@@ -1759,6 +1741,7 @@ from notebook.conf import get_ordered_interpreters
         self.activeSourceType = ko.observable();
         self.activeSourceType = ko.observable();
         self.activeTables = ko.observableArray();
         self.activeTables = ko.observableArray();
         self.activeColumns = ko.observableArray();
         self.activeColumns = ko.observableArray();
+        self.activeRisks = ko.observableArray();
 
 
         var isPointInside = function (location, row, col) {
         var isPointInside = function (location, row, col) {
           return (location.first_line < row && row < location.last_line) ||
           return (location.first_line < row && row < location.last_line) ||
@@ -1830,6 +1813,10 @@ from notebook.conf import get_ordered_interpreters
           initActive();
           initActive();
         }).remove);
         }).remove);
 
 
+        self.disposals.push(huePubSub.subscribe('editor.active.risks', function (activeRisks) {
+          self.activeRisks(activeRisks);
+        }).remove);
+
         huePubSub.publish('get.active.editor.locations');
         huePubSub.publish('get.active.editor.locations');
       }
       }
 
 

+ 7 - 1
desktop/libs/metadata/src/metadata/optimizer_client.py

@@ -156,7 +156,13 @@ class OptimizerApi(object):
 
 
 
 
   def query_risk(self, query, source_platform, page_size=100, startingToken=None):
   def query_risk(self, query, source_platform, page_size=100, startingToken=None):
-    return self._call('getQueryRisk', {'tenant' : self._product_name, 'query': query, 'sourcePlatform': source_platform, 'pageSize': page_size, startingToken: None})
+    response = self._call('getQueryRisk', {'tenant' : self._product_name, 'query': query, 'sourcePlatform': source_platform, 'pageSize': page_size, startingToken: None})
+    data = response.get(source_platform + 'Risk', {})
+
+    if data and data == [{u'riskAnalysis': u'', u'risk': u'low', u'riskRecommendation': u''}]:
+      data = []
+
+    return data
 
 
 
 
   def similar_queries(self, source_platform, query, page_size=100, startingToken=None):
   def similar_queries(self, source_platform, query, page_size=100, startingToken=None):

+ 0 - 4
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -534,10 +534,6 @@ DROP TABLE IF EXISTS `%(table)s`;
     api = OptimizerApi()
     api = OptimizerApi()
 
 
     data = api.query_risk(query=query, source_platform=snippet['type'])
     data = api.query_risk(query=query, source_platform=snippet['type'])
-    data = data.get(snippet['type'] + 'Risk', {})
-
-    if data and data == {"riskAnalysis": "", "risk": "low", "riskRecommendation": ""}:
-      data = []
 
 
     return [{
     return [{
       'risk': risk.get('risk'),
       'risk': risk.get('risk'),

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

@@ -899,6 +899,8 @@ var EditorViewModel = (function() {
 
 
         hueAnalytics.log('notebook', 'get_query_risk');
         hueAnalytics.log('notebook', 'get_query_risk');
         self.complexityCheckRunning(true);
         self.complexityCheckRunning(true);
+        huePubSub.publish('editor.active.risks', []);
+
         lastComplexityRequest = $.ajax({
         lastComplexityRequest = $.ajax({
           type: 'POST',
           type: 'POST',
           url: '/notebook/api/optimizer/statement/risk',
           url: '/notebook/api/optimizer/statement/risk',
@@ -915,6 +917,7 @@ var EditorViewModel = (function() {
               // TODO: Silence errors
               // TODO: Silence errors
               $(document).trigger('error', data.message);
               $(document).trigger('error', data.message);
             }
             }
+            huePubSub.publish('editor.active.risks', self.complexity());
             lastCheckedComplexityStatement = self.statement_raw();
             lastCheckedComplexityStatement = self.statement_raw();
             self.complexityCheckRunning(false);
             self.complexityCheckRunning(false);
           }
           }

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

@@ -1075,9 +1075,6 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, ENABLE_
         <div class="round-icon success" data-bind="click: function(){ showOptimizer(! showOptimizer()) }, attr: { 'title': showOptimizer() ? '${ _ko('Close Validator') }' : '${ _ko('Open Validator') }'}">
         <div class="round-icon success" data-bind="click: function(){ showOptimizer(! showOptimizer()) }, attr: { 'title': showOptimizer() ? '${ _ko('Close Validator') }' : '${ _ko('Open Validator') }'}">
           <i class="fa fa-check"></i>
           <i class="fa fa-check"></i>
         </div>
         </div>
-        <!-- ko if: showOptimizer -->
-        <span class="optimizer-explanation alert-success alert-neutral">${ _('Query validated.') }</span>
-        <!-- /ko -->
       <!-- /ko -->
       <!-- /ko -->
       <!-- ko if: complexity()[0].risk === 'high' -->
       <!-- ko if: complexity()[0].risk === 'high' -->
         <div class="round-icon error" data-bind="click: function(){ showOptimizer(! showOptimizer()) }">
         <div class="round-icon error" data-bind="click: function(){ showOptimizer(! showOptimizer()) }">
@@ -1088,6 +1085,11 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, ENABLE_
         <!-- /ko -->
         <!-- /ko -->
       <!-- /ko -->
       <!-- /ko -->
     <!-- /ko -->
     <!-- /ko -->
+    <!-- ko if: ! hasSuggestion() && ! hasComplexity() -->
+      <!-- ko if: showOptimizer -->
+        <span class="optimizer-explanation alert-success alert-neutral">${ _('Query validated.') }</span>
+      <!-- /ko -->
+    <!-- /ko -->
   </div>
   </div>
   <!-- /ko -->
   <!-- /ko -->