Jelajahi Sumber

HUE-5430 [assist] Prefetch popularity of tables

Johan Ahlen 9 tahun lalu
induk
melakukan
024e6a378b

+ 10 - 21
desktop/core/src/desktop/static/desktop/js/assist/assistDbEntry.js

@@ -52,6 +52,7 @@ var AssistDbEntry = (function () {
     self.highlight = ko.observable(false);
     self.highlightParent = ko.observable(false);
     self.activeSort = self.assistDbSource.activeSort;
+    self.popularityIndex = {};
 
     self.expandable = typeof definition.type === "undefined" || /table|view|struct|array|map/i.test(definition.type);
 
@@ -86,28 +87,11 @@ var AssistDbEntry = (function () {
     self.applySort = function (sortName, entries) {
       if (sortName === 'popular' && self.definition.isDatabase) {
         if (self.assistDbSource.selectedDatabase() === self) {
-          self.assistDbSource.applyingSort(true);
-          self.assistDbSource.apiHelper.fetchNavOptTopTables({
-            sourceType: self.assistDbSource.sourceType,
-            database: self.definition.name,
-            silenceErrors: true,
-            successCallback: function (data) {
-              var popularityIndex = {};
-              data.top_tables.forEach(function (topTable) {
-                popularityIndex[topTable.name] = topTable.popularity;
-              });
-              self.entries().forEach(function (entry) {
-                if (popularityIndex[entry.definition.name]) {
-                  entry.definition.popularity = popularityIndex[entry.definition.name];
-                }
-                entries.sort(self.sortFunctions.popular);
-              });
-              self.assistDbSource.applyingSort(false);
-            },
-            errorCallback: function (data) {
-              entries.sort(self.sortFunctions.creation);
-              self.assistDbSource.applyingSort(false);
+          self.entries().forEach(function (entry) {
+            if (self.popularityIndex[entry.definition.name]) {
+              entry.definition.popularity = self.popularityIndex[entry.definition.name];
             }
+            entries.sort(self.sortFunctions.popular);
           });
           deferredSort = false;
         } else {
@@ -196,6 +180,11 @@ var AssistDbEntry = (function () {
     });
   }
 
+  AssistDbEntry.prototype.setPopularityIndex = function (popularityIndex) {
+    var self = this;
+    self.popularityIndex = popularityIndex;
+  };
+
   AssistDbEntry.prototype.showContextPopover = function (entry, event, positionAdjustment) {
     var self = this;
     var $source = $(event.target);

+ 17 - 1
desktop/core/src/desktop/static/desktop/js/assist/assistDbSource.js

@@ -70,7 +70,6 @@ var AssistDbSource = (function () {
 
     self.invalidateOnRefresh = ko.observable('cache');
 
-    self.applyingSort = ko.observable(false);
     self.activeSort = ko.observable('alpha');
 
     self.activeSort.subscribe(function (newSort) {
@@ -179,6 +178,23 @@ var AssistDbSource = (function () {
         return database;
       });
 
+      if (HAS_OPTIMIZER && dbs.length > 0) {
+        dbs.forEach(function (db) {
+          self.apiHelper.fetchNavOptTopTables({
+            sourceType: self.sourceType,
+            database: db.definition.name,
+            silenceErrors: true,
+            successCallback: function (data) {
+              var popularityIndex = {};
+              data.top_tables.forEach(function (topTable) {
+                popularityIndex[topTable.name] = topTable.popularity;
+              });
+              db.setPopularityIndex(popularityIndex);
+            }
+          });
+        });
+      }
+
       dbs.sort(sortFunctions[self.activeSort()]);
       self.databases(dbs);
       self.reloading(false);

+ 1 - 1
desktop/core/src/desktop/templates/assist.mako

@@ -1024,7 +1024,7 @@ from notebook.conf import ENABLE_QUERY_BUILDER
       <span class="assist-tables-counter">(<span data-bind="text: filteredEntries().length"></span>)</span>
       <!-- ko ifnot: loading -->
       <!-- ko if: $parent.activeSort -->
-      <a class="inactive-action" data-toggle="dropdown" href="javascript:void(0)"><i class="pointer fa" data-bind="css: { 'fa-sort': !$parent.applyingSort(), 'fa-spinner fa-spin': $parent.applyingSort() }" title="${_('Sort')}"></i></a>
+      <a class="inactive-action" data-toggle="dropdown" href="javascript:void(0)"><i class="pointer fa fa-sort" title="${_('Sort')}"></i></a>
       <ul class="dropdown-menu hue-inner-drop-down" style="top: initial; left: inherit; position: fixed; z-index:10000;">
         <li><a href="javascript:void(0)" data-bind="click: function () { $parent.activeSort('alpha'); }"><i class="fa fa-fw" data-bind="css: { 'fa-check': $parent.activeSort() === 'alpha' }"></i> ${ _('Alphabetical') }</a></li>
         <li><a href="javascript:void(0)" data-bind="click: function () { $parent.activeSort('creation'); }"><i class="fa fa-fw" data-bind="css: { 'fa-check': $parent.activeSort() === 'creation' }"></i> ${ _('Column order') }</a></li>