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

HUE-5601 [editor] Add popular filters to the autocomplete dropdown

Johan Ahlen 9 жил өмнө
parent
commit
bad553e

+ 84 - 2
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -95,6 +95,7 @@ var SqlAutocompleter3 = (function () {
     self.aggregateFunctions = ko.observableArray();
     self.groupBys = ko.observableArray();
     self.orderBys = ko.observableArray();
+    self.filters = ko.observableArray();
 
     self.loadingKeywords = ko.observable(false);
     self.loadingFunctions = ko.observable(false);
@@ -109,13 +110,14 @@ var SqlAutocompleter3 = (function () {
     self.loadingAggregateFunctions = ko.observable(false);
     self.loadingGroupBys = ko.observable(false);
     self.loadingOrderBys = ko.observable(false);
+    self.loadingFilters = ko.observable(false);
 
     self.filter = ko.observable();
 
     self.filtered = ko.pureComputed(function () {
       var result = self.keywords().concat(self.identifiers(), self.columnAliases(), self.commonTableExpressions(),
           self.functions(), self.databases(), self.tables(), self.columns(), self.values(), self.paths(), self.joins(),
-          self.joinConditions(), self.aggregateFunctions(), self.groupBys(), self.orderBys());
+          self.joinConditions(), self.aggregateFunctions(), self.groupBys(), self.orderBys(), self.filters());
 
       if (self.filter()) {
         var lowerCaseFilter = self.filter().toLowerCase();
@@ -201,6 +203,7 @@ var SqlAutocompleter3 = (function () {
     self.aggregateFunctions([]);
     self.groupBys([]);
     self.orderBys([]);
+    self.filters([]);
 
     self.loadingKeywords(false);
     self.loadingFunctions(false);
@@ -215,6 +218,7 @@ var SqlAutocompleter3 = (function () {
     self.loadingAggregateFunctions(false);
     self.loadingGroupBys(false);
     self.loadingOrderBys(false);
+    self.loadingFilters(false);
 
     self.filter('');
 
@@ -237,9 +241,10 @@ var SqlAutocompleter3 = (function () {
     var aggregateFunctionsDeferred = self.handleAggregateFunctions();
     var groupBysDeferred = self.handleGroupBys();
     var orderBysDeferred = self.handleOrderBys();
+    var filtersDeferred = self.handleFilters();
 
     $.when(colRefDeferred, databasesDeferred, tablesDeferred, columnsDeferred, pathsDeferred, joinsDeferred,
-        joinConditionsDeferred, aggregateFunctionsDeferred, groupBysDeferred, orderBysDeferred).done(function () {
+        joinConditionsDeferred, aggregateFunctionsDeferred, groupBysDeferred, orderBysDeferred, filtersDeferred).done(function () {
       huePubSub.publish('hue.ace.autocompleter.done');
     });
   };
@@ -980,6 +985,83 @@ var SqlAutocompleter3 = (function () {
     return orderBysDeferred;
   };
 
+  Suggestions.prototype.handleFilters = function () {
+    var self = this;
+    var filtersDeferred = $.Deferred();
+    var suggestFilters = self.parseResult.suggestFilters;
+    if (HAS_OPTIMIZER && suggestFilters) {
+      self.loadingFilters(true);
+      self.apiHelper.fetchNavOptTopFilters({
+        sourceType: self.snippet.type(),
+        timeout: AUTOCOMPLETE_TIMEOUT,
+        defaultDatabase: self.activeDatabase,
+        silenceErrors: true,
+        tables: suggestFilters.tables,
+        successCallback: function (data) {
+          var filterSuggestions = [];
+          data.values.forEach(function (value) {
+            if (typeof value.popularValues !== 'undefined' && value.popularValues.length > 0) {
+              value.popularValues.forEach(function (popularValue) {
+                if (typeof popularValue.group !== 'undefined') {
+                  popularValue.group.forEach(function (grp) {
+                    var compVal = suggestFilters.prefix ? (self.parseResult.lowerCase ? suggestFilters.prefix.toLowerCase() : suggestFilters.prefix) + ' ' : '';
+                    compVal += self.createNavOptIdentifier(value.tableName, grp.columnName, suggestFilters.tables);
+                    if (!/^ /.test(grp.op)) {
+                      compVal += ' ';
+                    }
+                    compVal += self.parseResult.lowerCase ? grp.op.toLowerCase() : grp.op;
+                    if (!/ $/.test(grp.op)) {
+                      compVal += ' ';
+                    }
+                    compVal += grp.literal;
+                    filterSuggestions.push({
+                      value: compVal,
+                      meta: AutocompleterGlobals.i18n.meta.filter,
+                      weight: DEFAULT_WEIGHTS.POPULAR_FILTER,
+                      detailsTemplate: 'filter',
+                      details: popularValue
+                    });
+                  });
+                }
+              });
+            }
+          });
+          self.filters(filterSuggestions);
+          self.loadingFilters(false);
+          filtersDeferred.resolve(filterSuggestions);
+        },
+        errorCallback: function () {
+          self.loadingFilters(false);
+          filtersDeferred.resolve([]);
+        }
+      });
+    } else {
+      filtersDeferred.resolve([]);
+    }
+    return filtersDeferred;
+  };
+
+  Suggestions.prototype.createNavOptIdentifier = function(navOptTableName, navOptColumnName, tables) {
+    var self = this;
+    var path = navOptTableName + '.' + navOptColumnName.split('.').pop();
+    for (var i = 0; i < tables.length; i++) {
+      var tablePath = '';
+      if (tables[i].identifierChain.length == 2) {
+        tablePath = $.map(tables[i].identifierChain, function (identifier) { return identifier.name }).join('.');
+      } else if (tables[i].identifierChain.length == 1) {
+        tablePath = self.activeDatabase + '.' + tables[i].identifierChain[0].name;
+      }
+      if (path.indexOf(tablePath) === 0) {
+        path = path.substring(tablePath.length + 1);
+        if (tables[i].alias) {
+          path = tables[i].alias + '.' + path;
+        }
+        break;
+      }
+    }
+    return path;
+  };
+
   Suggestions.prototype.createNavOptIdentifierForColumn = function (navOptColumn, tables) {
     var self = this;
     for (var i = 0; i < tables.length; i++) {

+ 1 - 0
desktop/core/src/desktop/templates/common_header_footer_components.mako

@@ -97,6 +97,7 @@ from metadata.conf import has_optimizer, OPTIMIZER
           alias: '${ _('alias') }',
           commonTableExpression: '${ _('cte') }',
           database: '${ _('database') }',
+          filter: '${ _('filter') }',
           groupBy: '${ _('group by') }',
           join: '${ _('join') }',
           joinCondition: '${ _('condition') }',