Prechádzať zdrojové kódy

HUE-3450 [metadata] Add data in table autocompletion

Johan Ahlen 9 rokov pred
rodič
commit
9239d0a63d

+ 27 - 0
desktop/core/src/desktop/static/desktop/css/hue3.css

@@ -2556,3 +2556,30 @@ body {
   width: 1em!important;
   height: 1em!important;
 }
+
+.autocomplete-tooltip {
+  background-color: #FFF;
+  margin-left: -1px !important;
+  border-top: 1px solid lightgrey;
+  border-right: 1px solid lightgrey;
+  border-bottom: 1px solid lightgrey;
+  border-radius: 1px;
+  box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+  color: black;
+  max-width: 100%;
+  padding: 3px 4px;
+  position: fixed;
+  z-index: 999999;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  cursor: default;
+  white-space: pre;
+  word-wrap: break-word;
+  line-height: normal;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  pointer-events: none;
+  height: 130px;
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/ace/ext-language_tools.js


+ 8 - 0
desktop/core/src/desktop/static/desktop/js/autocompleter.js

@@ -35,6 +35,8 @@
   function Autocompleter(options) {
     var self = this;
     self.snippet = options.snippet;
+    
+    self.topTables = {};
 
     var initializeAutocompleter = function () {
       var hdfsAutocompleter = new HdfsAutocompleter({
@@ -76,6 +78,12 @@
     }, editor);
   };
 
+  Autocompleter.prototype.getDocTooltip = function (item) {
+    var self = this;
+    return self.autocompleter.getDocTooltip(item);
+  };
+
+
   Autocompleter.prototype.autocomplete = function(beforeCursor, afterCursor, callback, editor) {
     var self = this;
     if (self.autocompleter) {

+ 3 - 0
desktop/core/src/desktop/static/desktop/js/hdfsAutocompleter.js

@@ -107,5 +107,8 @@
     }
   };
 
+  HdfsAutocompleter.prototype.getDocTooltip = function (item) {
+  };
+
   return HdfsAutocompleter;
 }));

+ 44 - 9
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter.js

@@ -36,12 +36,27 @@
     self.hdfsAutocompleter = options.hdfsAutocompleter;
     self.oldEditor = options.oldEditor || false;
 
+    self.topTablesPerDb = {};
+
     // Speed up by caching the databases
     var initDatabases = function () {
       self.snippet.getAssistHelper().loadDatabases({
         sourceType: self.snippet.type(),
         silenceErrors: true,
-        successCallback: $.noop
+        successCallback: function () {
+          $.each(self.snippet.getAssistHelper().lastKnownDatabases[self.snippet.type()], function (idx, db) {
+            $.post('/metadata/api/optimizer_api/top_tables', {
+              database: db
+            }, function(data){
+              if (! self.topTablesPerDb[db]) {
+                self.topTablesPerDb[db] = {};
+              }
+              data.top_tables.forEach(function (table) {
+                self.topTablesPerDb[db][table.name] = table;
+              });
+            });
+          });
+        }
       });
     };
     self.snippet.type.subscribe(function() {
@@ -268,7 +283,7 @@
     }
   };
 
-  SqlAutocompleter.prototype.extractFields = function (data, valuePrefix, includeStar, extraSuggestions, excludeDatabases) {
+  SqlAutocompleter.prototype.extractFields = function (data, database, valuePrefix, includeStar, extraSuggestions, excludeDatabases) {
     var self = this;
     var fields = [];
     var result = [];
@@ -323,7 +338,7 @@
 
     fields.forEach(function(field, idx) {
       if (field.name != "") {
-        result.push({value: typeof valuePrefix != "undefined" ? valuePrefix + field.name : field.name, score: 1000 - idx, meta: field.type});
+        result.push({value: typeof valuePrefix != "undefined" ? valuePrefix + field.name : field.name, score: 1000 - idx, meta: field.type, database: database });
       }
     });
     return result;
@@ -457,7 +472,7 @@
             }
             fromKeyword += " ";
           }
-          var result = self.extractFields(data, fromKeyword, false, [], dbRefMatch !== null && partialTableOrDb === null);
+          var result = self.extractFields(data, database, fromKeyword, false, [], dbRefMatch !== null && partialTableOrDb === null);
           if (partialTableOrDb !== null) {
             callback($.grep(result, function (suggestion) {
               return suggestion.value.indexOf(partialTableOrDb) === 0;
@@ -545,7 +560,7 @@
           var tableRefs = [{
             value: tableName,
             score: 1000,
-            meta: 'table'
+            meta: 'tables'
           }];
           self.getValueReferences(conditionMatch, database, fromReferences, tableRefs, callback);
           return;
@@ -572,9 +587,9 @@
             editor: editor,
             successCallback: function (data) {
               if (fields.length == 0) {
-                callback(self.extractFields(data, "", !fieldTermBefore && !impalaFieldRef, viewReferences.allViewReferences));
+                callback(self.extractFields(data, database, "", !fieldTermBefore && !impalaFieldRef, viewReferences.allViewReferences));
               } else {
-                callback(self.extractFields(data, "", !fieldTermBefore));
+                callback(self.extractFields(data, database, "", !fieldTermBefore));
               }
             },
             silenceErrors: true,
@@ -588,7 +603,7 @@
           if (hiveSyntax) {
             if (viewReferences.index[part]) {
               if (viewReferences.index[part].references && remainingParts.length == 0) {
-                callback(self.extractFields([], "", true, viewReferences.index[part].references));
+                callback(self.extractFields([], database, "", true, viewReferences.index[part].references));
                 return;
               }
               if (fields.length == 0 && viewReferences.index[part].leadingPath.length > 0) {
@@ -662,7 +677,7 @@
                     extraFields.push({ name: "items", type: "items" });
                   }
                 }
-                callback(self.extractFields(data, "", false, extraFields));
+                callback(self.extractFields(data, database, "", false, extraFields));
                 return;
               }
               getFields(database, remainingParts, fields);
@@ -691,6 +706,26 @@
       onFailure();
     }
   };
+  
+  SqlAutocompleter.prototype.getDocTooltip = function (item) {
+    var self = this;
+    if (item.meta === 'table' && !item.docHTML) {
+      var table = item.value;
+      if (table.lastIndexOf(' ') > -1) {
+        table = table.substring(table.lastIndexOf(' ') + 1);
+      }
+      if (self.topTablesPerDb[item.database] && self.topTablesPerDb[item.database][table]) {
+        var optData = self.topTablesPerDb[item.database][table];
+        item.docHTML = '<table style="margin:10px;">' +
+            '<tr style="height: 20px;"><td style="width: 80px;">Table:</td><td style="width: 100px;">' + optData.name + '</td></tr>' +
+            '<tr style="height: 20px;"><td style="width: 80px;">Popularity:</td><td style="width: 100px;"><div class="progress" style="height: 10px; width: 100px;"><div class="bar" style="background-color: #338bb8; width: ' + optData.popularity + '%" ></div></div></td></tr>' +
+            '<tr style="height: 20px;"><td style="width: 80px;">Columns:</td><td style="width: 100px;">' + optData.column_count + '</td></tr>' +
+            '<tr style="height: 20px;"><td style="width: 80px;">Fact:</td><td style="width: 100px;">' + optData.is_fact + '</td></tr>' +
+            '</table>';
+
+      }
+    }
+  };
 
   return SqlAutocompleter;
 }));

+ 1 - 1
tools/ace-editor/lib/ace/autocomplete.js

@@ -363,7 +363,7 @@ var Autocomplete = function() {
     this.showDocTooltip = function(item) {
         if (!this.tooltipNode) {
             this.tooltipNode = dom.createElement("div");
-            this.tooltipNode.className = "ace_tooltip ace_doc-tooltip";
+            this.tooltipNode.className = "autocomplete-tooltip";
             this.tooltipNode.style.margin = 0;
             this.tooltipNode.style.pointerEvents = "auto";
             this.tooltipNode.tabIndex = -1;

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov