浏览代码

HUE-3450 [editor] Add SQL query compatibility button

Romain Rigaux 9 年之前
父节点
当前提交
87a0c6a

+ 23 - 8
apps/metastore/src/metastore/static/metastore/js/metastore.ko.js

@@ -303,7 +303,10 @@
     });
   };
 
-
+  function MetastoreTableDetails(details) {
+	var self = this;
+  }
+  
   /**
    * @param {Object} options
    * @param {MetastoreDatabase} options.database
@@ -329,6 +332,7 @@
 
     self.optimizerStats = ko.observable();
     self.navigatorStats = ko.observable();
+    self.optimizerDetails = ko.observable();
 
     self.loaded = ko.observable(false);
     self.loading = ko.observable(false);
@@ -435,19 +439,30 @@
               self.partitions.loaded(true);
             }
             if (self.optimizerEnabled) {
-                $.get('/metadata/api/navigator/find_entity', {
-                  type: 'table',
-                  database: self.database.name,
-                  name: self.name
+              $.get('/metadata/api/navigator/find_entity', {
+                type: 'table',
+                database: self.database.name,
+                name: self.name
+              }, function(data){
+                if (data && data.status == 0) {
+                  self.navigatorStats(ko.mapping.fromJS(data.entity));
+                } else {
+                  $(document).trigger("info", data.message);
+                }
+              }).fail(function (xhr, textStatus, errorThrown) {
+                $(document).trigger("error", xhr.responseText);
+              });
+              $.post('/metadata/api/optimizer_api/table_details', {
+                tableName: self.name
                 }, function(data){
                   if (data && data.status == 0) {
-                    self.navigatorStats(ko.mapping.fromJS(data.entity));
+                    self.optimizerDetails(ko.mapping.fromJS(data.table_details));
                   } else {
                     $(document).trigger("info", data.message);
                   }
-                }).fail(function (xhr, textStatus, errorThrown) {
+              }).fail(function (xhr, textStatus, errorThrown) {
                   $(document).trigger("error", xhr.responseText);
-                });
+              });
             }
           }
           else {

+ 13 - 1
apps/metastore/src/metastore/templates/metastore.mako

@@ -957,7 +957,19 @@ ${ assist.assistPanel() }
     </div>
 
     <div class="tab-pane" id="analysis">
-      <div class="empty-message">${ _('Currently not available.') }</div>
+      <!-- ko if: $root.database() && $root.database().table() -->
+        <span data-bind="text: $root.database().table().optimizerDetails()"></span>
+        
+        ## top cols
+        
+        ## joined tables
+        
+        ## col stats
+        
+        ## query lists
+        
+        ## link to optimizer
+      <!-- /ko -->
     </div>
 
     <div class="tab-pane" id="relationships">

+ 2 - 2
desktop/libs/metadata/src/metadata/optimizer_api.py

@@ -112,12 +112,12 @@ def query_compatibility(request):
   response = {'status': -1}
 
   source_platform = request.POST.get('sourcePlatform')
-  target_platform = request.POST.get('target_platform')
+  target_platform = request.POST.get('targetPlatform')
   query = request.POST.get('query')
 
   api = OptimizerApi()
 
-  response['table_details'] = api.query_compatibility(source_platform=source_platform, target_platform=target_platform, query=query)
+  response['query_compatibility'] = api.query_compatibility(source_platform=source_platform, target_platform=target_platform, query=query)
   response['status'] = 0
 
   return JsonResponse(response)

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

@@ -663,6 +663,22 @@
       });
     }
 
+    self.queryCompatibility = function () {
+      $.post("/metadata/api/optimizer_api/query_compatibility", {
+        query: self.statement(),
+        sourcePlatform: self.type(),
+        targetPlatform: 'impala'
+      }, function(data) {
+        if (data.status == 0) {
+       	 $(document).trigger("info", data.query_compatibility);
+        } else {
+          $(document).trigger("error", data.message);
+        }
+      }).fail(function (xhr, textStatus, errorThrown) {
+        $(document).trigger("error", xhr.responseText);
+      });
+    };
+
     self.fetchResult = function (rows, startOver) {
       if (typeof startOver == "undefined") {
         startOver = true;

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

@@ -998,7 +998,7 @@ ${ require.config() }
     </a>
     <div class="dropdown">
       <a class="snippet-side-btn" style="padding-right:0" href="javascript: void(0)" data-bind="click: explain, css: {'disabled': statement() === '' || status() === 'running' || status() === 'loading' }" title="${ _('Explain the current SQL query') }">
-        <i class="fa fa-fw fa-code-fork fa-rotate-90"></i>
+        <i class="fa fa-fw fa-map-o"></i>
       </a>
       <!-- ko if: isSqlDialect -->
       <a class="dropdown-toggle snippet-side-btn" style="padding:0" data-toggle="dropdown" href="javascript: void(0)" data-bind="css: {'disabled': statement() === '' }">
@@ -1008,7 +1008,7 @@ ${ require.config() }
       <ul class="dropdown-menu less-padding">
         <li>
           <a href="javascript:void(0)" data-bind="click: explain" title="${ _('Explain the current SQL query') }">
-            <i class="fa fa-fw fa-code-fork fa-rotate-90"></i> ${_('Explain')}
+            <i class="fa fa-fw fa-map-o"></i> ${_('Explain')}
           </a>
         </li>
         <li>
@@ -1021,6 +1021,11 @@ ${ require.config() }
             <i class="fa fa-fw fa-eraser"></i> ${_('Clear')}
           </a>
         </li>
+        <li>
+          <a href="javascript:void(0)" data-bind="click: queryCompatibility, visible: $root.isOptimizerEnabled" title="${ _('Get Impala compatibility hints') }">
+            <i class="fa fa-fw fa-random"></i> ${_('Check Impala compatibility')}
+          </a>
+        </li>
       </ul>
       <!-- /ko -->
     </div>

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

@@ -68,9 +68,9 @@ def notebook(request):
       'options_json': json.dumps({
           'languages': get_interpreters(request.user),
           'session_properties': SparkApi.PROPERTIES,
+          'is_optimizer_enabled': has_optimizer(),
       }),
       'is_yarn_mode': is_yarn_mode,
-      'is_optimizer_enabled': has_optimizer(),
   })
 
 
@@ -94,9 +94,9 @@ def editor(request):
       'options_json': json.dumps({
           'languages': [{"name": "%s SQL" % editor_type.title(), "type": editor_type}],
           'mode': 'editor',
+          'is_optimizer_enabled': has_optimizer(),
       }),
       'editor_type': editor_type,
-      'is_optimizer_enabled': has_optimizer(),
   })