فهرست منبع

HUE-7820 [frontend] Add analysis to the DataCatalog

Johan Ahlen 7 سال پیش
والد
کامیت
b702995

+ 2 - 2
apps/metastore/src/metastore/static/metastore/js/metastore.model.js

@@ -104,9 +104,9 @@ var MetastoreDatabase = (function () {
         })
       }
       if (optimizerEnabled) {
-        self.catalogEntry.loadNavOptMetaForChildren().done(function () {
+        self.catalogEntry.loadNavOptPopularityForChildren().done(function () {
           self.tables().forEach(function (table) {
-            table.optimizerStats(table.catalogEntry.navOptMeta);
+            table.optimizerStats(table.catalogEntry.navOptPopularity);
           })
         });
       }

+ 96 - 5
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -420,7 +420,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.simpleGet = function (url, data, options) {
     var self = this;
-    $.get(url, data, function (data) {
+    return $.get(url, data, function (data) {
       if (self.successResponseIsError(data)) {
         self.assistErrorCallback(options)(data);
       } else if (typeof options.successCallback !== 'undefined') {
@@ -1630,6 +1630,96 @@ var ApiHelper = (function () {
     return self.simplePost(url, data, options);
   };
 
+  /**
+   * Fetches the analysis for the given source and path
+   *
+   * @param {Object} options
+   * @param {boolean} [options.silenceErrors]
+   *
+   * @param {string} options.sourceType
+   * @param {string[]} options.path
+   *
+   * @return {CancellablePromise}
+   */
+  ApiHelper.prototype.fetchAnalysis = function (options) {
+    var self = this;
+    var deferred = $.Deferred();
+
+    var url = '/' + (options.sourceType === 'hive' ? 'beeswax' : options.sourceType) + '/api/table/' + options.path[0];
+
+    if (options.path.length > 1) {
+      url += '/' + options.path[1];
+    }
+
+    if (options.path.length > 2) {
+      url += '/stats/' + options.path.slice(2).join('/');
+    }
+
+    var request = self.simpleGet(url, {
+      'format' : 'json'
+    }, {
+      silenceErrors: options.silenceErrors,
+      successCallback: deferred.resolve,
+      errorCallback: deferred.reject
+    });
+
+    return new CancellablePromise(deferred.promise(), request);
+  };
+
+  /**
+   * Refreshes the analysis for the given source and path
+   *
+   * @param {Object} options
+   * @param {boolean} [options.silenceErrors]
+   *
+   * @param {string} options.sourceType
+   * @param {string[]} options.path
+   *
+   * @return {CancellablePromise}
+   */
+  ApiHelper.prototype.refreshAnalysis = function (options) {
+    var self = this;
+    var deferred = $.Deferred();
+
+    var promises = [];
+
+    var pollForAnalysis = function (url, delay) {
+      window.setTimeout(function () {
+        promises.push(self.simplePost(url, undefined, {
+          silenceErrors: options.silenceErrors,
+          successCallback: function (data) {
+            promises.pop();
+            if (data.isSuccess) {
+              promises.push(self.fetchAnalysis(options).done(deferred.resolve).fail(deferred.reject));
+            } else if (data.isFailure) {
+              deferred.reject(data);
+            } else {
+              pollForAnalysis(url, 1000);
+            }
+          },
+          errorCallback: deferred.reject
+        }));
+      }, delay);
+    };
+
+    var url = '/' + (options.sourceType === 'hive' ? 'beeswax' : options.sourceType) + '/api/analyze/' + options.path.join('/') + '/';
+
+    promises.push(self.simplePost(url, undefined, {
+      silenceErrors: options.silenceErrors,
+      successCallback: function (data) {
+        promises.pop();
+        if (data.status === 0 && data.watch_url) {
+          pollForAnalysis(data.watch_url, 500);
+        } else {
+          deferred.reject();
+        }
+      },
+      errorCallback: deferred.reject
+    }));
+
+    return new CancellablePromise(deferred.promise(), undefined, promises);
+  };
+
   /**
    * Fetches samples for the given source and path
    *
@@ -1655,7 +1745,8 @@ var ApiHelper = (function () {
       successCallback: function (data) {
         data.hueTimestamp = Date.now();
         deferred.resolve(data);
-      }
+      },
+      errorCallback: deferred.reject
     }).done().fail(deferred.reject);
 
     return new CancellablePromise(deferred.promise(), request);
@@ -1727,14 +1818,14 @@ var ApiHelper = (function () {
   };
 
   /**
-   * Fetches navOpt metadata for the children of the given path
+   * Fetches navOpt popularity for the children of the given path
    *
    * @param {Object} options
    * @param {boolean} [options.silenceErrors]
    * @param {string[string[]]} options.paths
    * @return {CancellablePromise}
    */
-  ApiHelper.prototype.fetchNavOptMetadata = function (options) {
+  ApiHelper.prototype.fetchNavOptPopularity = function (options) {
     var self = this;
     var deferred = $.Deferred();
     var url, data;
@@ -1907,7 +1998,7 @@ var ApiHelper = (function () {
    * @param {string} options.defaultDatabase
    */
   // TODO: Add to DataCatalog
-  ApiHelper.prototype.fetchAnalysis = function (options) {
+  ApiHelper.prototype.fetchAnalysis_OLD = function (options) {
     var self = this;
     var clonedIdentifierChain = options.identifierChain.concat();
 

+ 3 - 3
desktop/core/src/desktop/static/desktop/js/assist/assistDbEntry.js

@@ -341,12 +341,12 @@ var AssistDbEntry = (function () {
     };
 
     if (!self.navigationSettings.rightAssist && HAS_OPTIMIZER && self.catalogEntry.isTable() && self.assistDbSource.sourceType !== 'solr') {
-      self.catalogEntry.loadNavOptMetaForChildren({ silenceErrors: true }).done(function () {
+      self.catalogEntry.loadNavOptPopularityForChildren({ silenceErrors: true }).done(function () {
         loadEntriesDeferred.done(function () {
           if (!self.hasErrors()) {
             self.entries().forEach(function (entry) {
-              if (entry.catalogEntry.navOptMeta) {
-                entry.popularity(entry.catalogEntry.navOptMeta.columnCount)
+              if (entry.catalogEntry.navOptPopularity) {
+                entry.popularity(entry.catalogEntry.navOptPopularity.columnCount)
               }
             });
 

+ 3 - 3
desktop/core/src/desktop/static/desktop/js/assist/assistDbSource.js

@@ -122,11 +122,11 @@ var AssistDbSource = (function () {
     self.selectedDatabase.subscribe(function () {
       var db = self.selectedDatabase();
       if (HAS_OPTIMIZER && db && !db.popularityIndexSet && self.sourceType !== 'solr') {
-        db.catalogEntry.loadNavOptMetaForChildren({ silenceErrors: true }).done(function () {
+        db.catalogEntry.loadNavOptPopularityForChildren({ silenceErrors: true }).done(function () {
           var applyPopularity = function () {
             db.entries().forEach(function (entry) {
-              if (entry.catalogEntry.navOptMeta && entry.catalogEntry.navOptMeta.popularity >= 5) {
-                entry.popularity(entry.catalogEntry.navOptMeta.popularity )
+              if (entry.catalogEntry.navOptPopularity && entry.catalogEntry.navOptPopularity.popularity >= 5) {
+                entry.popularity(entry.catalogEntry.navOptPopularity.popularity )
               }
             });
             if (self.activeSort() === 'popular') {

+ 82 - 57
desktop/core/src/desktop/static/desktop/js/dataCatalog.js

@@ -42,9 +42,10 @@ var DataCatalog = (function () {
       version: DATA_CATALOG_VERSION,
       definition: dataCatalogEntry.definition,
       sourceMeta: dataCatalogEntry.sourceMeta,
+      analysis: dataCatalogEntry.analysis,
       sample: dataCatalogEntry.sample,
       navigatorMeta: dataCatalogEntry.navigatorMeta,
-      navOptMeta: dataCatalogEntry.navOptMeta
+      navOptPopularity: dataCatalogEntry.navOptPopularity
     });
   };
 
@@ -56,27 +57,27 @@ var DataCatalog = (function () {
    *
    * @return {CancellablePromise}
    */
-  DataCatalog.prototype.loadNavOptMetaForTables = function (options) {
+  DataCatalog.prototype.loadNavOptPopularityForTables = function (options) {
     var self = this;
     var deferred = $.Deferred();
     var cancellablePromises = [];
-    var entriesWithNavOptMeta = [];
+    var popularEntries = [];
     var pathsToLoad = [];
 
     var existingPromises = [];
     options.paths.forEach(function (path) {
       var existingDeferred = $.Deferred();
       self.getEntry({ path: path }).done(function (tableEntry) {
-        if (tableEntry.navOptMetaForChildrenPromise) {
-          tableEntry.navOptMetaForChildrenPromise.done(function (existingNavOptMetaEntries) {
-            entriesWithNavOptMeta = entriesWithNavOptMeta.concat(existingNavOptMetaEntries);
+        if (tableEntry.navOptPopularityForChildrenPromise) {
+          tableEntry.navOptPopularityForChildrenPromise.done(function (existingPopularEntries) {
+            popularEntries = popularEntries.concat(existingPopularEntries);
             existingDeferred.resolve();
           }).fail(existingDeferred.reject);
         } else if (tableEntry.definition && tableEntry.definition.navOptLoaded) {
           tableEntry.getChildren({silenceErrors: options.silenceErrors}).done(function (childEntries) {
             childEntries.forEach(function (childEntry) {
-              if (childEntry.navOptMeta) {
-                entriesWithNavOptMeta.push(childEntry);
+              if (childEntry.navOptPopularity) {
+                popularEntries.push(childEntry);
               }
             });
             existingDeferred.resolve();
@@ -92,7 +93,7 @@ var DataCatalog = (function () {
     $.when.apply($, existingPromises).always(function () {
       var loadDeferred = $.Deferred();
       if (pathsToLoad.length) {
-        cancellablePromises.push(ApiHelper.getInstance().fetchNavOptMetadata({
+        cancellablePromises.push(ApiHelper.getInstance().fetchNavOptPopularity({
           silenceErrors: options.silenceErrors,
           paths: pathsToLoad
         }).done(function (data) {
@@ -127,11 +128,11 @@ var DataCatalog = (function () {
           Object.keys(perTable).forEach(function (path) {
             var tableDeferred = $.Deferred();
             self.getEntry({ path: path }).done(function (entry) {
-              entry.navOptMetaForChildrenPromise = entry.applyNavOptResponseToChildren(perTable[path], options).done(function (entries) {
-                entriesWithNavOptMeta = entriesWithNavOptMeta.concat(entries);
+              entry.navOptPopularityForChildrenPromise = entry.applyNavOptResponseToChildren(perTable[path], options).done(function (entries) {
+                popularEntries = popularEntries.concat(entries);
                 tableDeferred.resolve();
               }).fail(tableDeferred.resolve);
-              cancellablePromises.push(entry.navOptMetaForChildrenPromise);
+              cancellablePromises.push(entry.navOptPopularityForChildrenPromise);
             }).fail(tableDeferred.reject);
             tablePromises.push(tableDeferred.promise());
           });
@@ -145,7 +146,7 @@ var DataCatalog = (function () {
       }
       loadDeferred.always(function () {
         $.when.apply($, cancellablePromises).done(function () {
-          deferred.resolve(entriesWithNavOptMeta);
+          deferred.resolve(popularEntries);
         }).fail(deferred.reject);
       });
     });
@@ -165,9 +166,10 @@ var DataCatalog = (function () {
 
     mergeAttribute('definition', CACHEABLE_TTL.default);
     mergeAttribute('sourceMeta', CACHEABLE_TTL.default, 'sourceMetaPromise');
+    mergeAttribute('analysis', CACHEABLE_TTL.default, 'analysisPromise');
     mergeAttribute('sample', CACHEABLE_TTL.default, 'samplePromise');
     mergeAttribute('navigatorMeta', CACHEABLE_TTL.default, 'navigatorMetaPromise');
-    mergeAttribute('navOptMeta', CACHEABLE_TTL.optimizer);
+    mergeAttribute('navOptPopularity', CACHEABLE_TTL.optimizer);
   };
 
   /**
@@ -209,12 +211,13 @@ var DataCatalog = (function () {
     return deferred.promise();
   };
 
-  var fetchMeta = function (apiHelperFunction, dataCatalogEntry, apiOptions) {
+  var fetchAndSave = function (apiHelperFunction, attributeName, dataCatalogEntry, apiOptions) {
     return ApiHelper.getInstance()[apiHelperFunction]({
       sourceType: dataCatalogEntry.getSourceType(),
       path: dataCatalogEntry.path,
       silenceErrors: apiOptions && apiOptions.silenceErrors
-    }).done(function () {
+    }).done(function (data) {
+      dataCatalogEntry[attributeName] = data;
       dataCatalogEntry.saveLater();
     })
   };
@@ -223,16 +226,11 @@ var DataCatalog = (function () {
    * @param {DataCatalogEntry} dataCatalogEntry
    * @param {Object} [apiOptions]
    * @param {boolean} [apiOptions.silenceErrors]
-   * @param {boolean} [apiOptions.cachedOnly]
-   * @param {boolean} [apiOptions.refreshCache]
    *
    * @return {CancellablePromise}
    */
   var reloadSourceMeta = function (dataCatalogEntry, apiOptions) {
-    dataCatalogEntry.sourceMetaPromise = fetchMeta('fetchSourceMetadata', dataCatalogEntry, apiOptions);
-    dataCatalogEntry.sourceMetaPromise.done(function (sourceMeta) {
-      dataCatalogEntry.sourceMeta = sourceMeta;
-    });
+    dataCatalogEntry.sourceMetaPromise = fetchAndSave('fetchSourceMetadata', 'sourceMeta', dataCatalogEntry, apiOptions);
     return dataCatalogEntry.sourceMetaPromise;
   };
 
@@ -240,23 +238,31 @@ var DataCatalog = (function () {
    * @param {DataCatalogEntry} dataCatalogEntry
    * @param {Object} [apiOptions]
    * @param {boolean} [apiOptions.silenceErrors]
-   * @param {boolean} [apiOptions.cachedOnly]
-   * @param {boolean} [apiOptions.refreshCache]
    *
    * @return {CancellablePromise}
    */
   var reloadNavigatorMeta = function (dataCatalogEntry, apiOptions) {
     if (HAS_NAVIGATOR && (dataCatalogEntry.getSourceType() === 'hive' || dataCatalogEntry.getSourceType() === 'impala')) {
-      dataCatalogEntry.navigatorMetaPromise = fetchMeta('fetchNavigatorMetadata', dataCatalogEntry, apiOptions);
-      dataCatalogEntry.navigatorMetaPromise.done(function (navigatorMeta) {
-        dataCatalogEntry.navigatorMeta = navigatorMeta;
-      });
+      dataCatalogEntry.navigatorMetaPromise = fetchAndSave('fetchNavigatorMetadata', 'navigatorMeta', dataCatalogEntry, apiOptions);
     } else {
       dataCatalogEntry.navigatorMetaPromise =  $.Deferred.reject().promise();
     }
     return dataCatalogEntry.navigatorMetaPromise;
   };
 
+  /**
+   * @param {DataCatalogEntry} dataCatalogEntry
+   * @param {Object} [apiOptions]
+   * @param {boolean} [apiOptions.silenceErrors]
+   * @param {boolean} [apiOptions.refreshAnalysis]
+   *
+   * @return {CancellablePromise}
+   */
+  var reloadAnalysis = function (dataCatalogEntry, apiOptions) {
+    dataCatalogEntry.analysisPromise = fetchAndSave(apiOptions && apiOptions.refreshAnalysis ? 'refreshAnalysis' : 'fetchAnalysis', 'analysis', dataCatalogEntry, apiOptions);
+    return dataCatalogEntry.analysisPromise;
+  };
+
   /**
    * @param {DataCatalogEntry} dataCatalogEntry
    * @param {Object} [apiOptions]
@@ -267,10 +273,7 @@ var DataCatalog = (function () {
    * @return {CancellablePromise}
    */
   var reloadSample = function (dataCatalogEntry, apiOptions) {
-    dataCatalogEntry.samplePromise = fetchMeta('fetchSample', dataCatalogEntry, apiOptions);
-    dataCatalogEntry.samplePromise.done(function (sample) {
-      dataCatalogEntry.sample = sample;
-    });
+    dataCatalogEntry.samplePromise = fetchAndSave('fetchSample', 'sample', dataCatalogEntry, apiOptions);
     return dataCatalogEntry.samplePromise;
   };
 
@@ -298,10 +301,10 @@ var DataCatalog = (function () {
     self.samplePromise = undefined;
     self.sample = undefined;
 
-    self.navOptMeta = undefined;
+    self.navOptPopularity = undefined;
 
     self.navigatorMetaForChildrenPromise = undefined;
-    self.navOptMetaForChildrenPromise = undefined;
+    self.navOptPopularityForChildrenPromise = undefined;
 
     self.childrenPromise = undefined;
     self.saveTimeout = -1;
@@ -317,13 +320,16 @@ var DataCatalog = (function () {
     self.navigatorMeta = undefined;
     self.navigatorMetaPromise = undefined;
 
+    self.analysis = undefined;
+    self.analysisPromise = undefined;
+
     self.samplePromise = undefined;
     self.sample = undefined;
 
-    self.navOptMeta = undefined;
+    self.navOptPopularity = undefined;
 
     self.navigatorMetaForChildrenPromise = undefined;
-    self.navOptMetaForChildrenPromise = undefined;
+    self.navOptPopularityForChildrenPromise = undefined;
 
     self.childrenPromise = undefined;
 
@@ -505,21 +511,21 @@ var DataCatalog = (function () {
         response.top_tables.forEach(function (topTable) {
           var matchingChild = entriesByName[topTable.name.toLowerCase()];
           if (matchingChild) {
-            matchingChild.navOptMeta = topTable;
+            matchingChild.navOptPopularity = topTable;
             matchingChild.saveLater();
             updatedIndex[matchingChild.getQualifiedPath()] = matchingChild;
           }
         });
       } else if (self.isTableOrView() && response.values) {
-        var addNavOptMeta = function (columns, type) {
+        var addNavOptPopularity = function (columns, type) {
           if (columns) {
             columns.forEach(function (column) {
               var matchingChild = entriesByName[column.columnName.toLowerCase()];
               if (matchingChild) {
-                if (!matchingChild.navOptMeta) {
-                  matchingChild.navOptMeta = {};
+                if (!matchingChild.navOptPopularity) {
+                  matchingChild.navOptPopularity = {};
                 }
-                matchingChild.navOptMeta[type] = column;
+                matchingChild.navOptPopularity[type] = column;
                 matchingChild.saveLater();
                 updatedIndex[matchingChild.getQualifiedPath()] = matchingChild;
               }
@@ -527,17 +533,17 @@ var DataCatalog = (function () {
           }
         };
 
-        addNavOptMeta(response.values.filterColumns, 'filterColumn');
-        addNavOptMeta(response.values.groupbyColumns, 'groupByColumn');
-        addNavOptMeta(response.values.joinColumns, 'joinColumn');
-        addNavOptMeta(response.values.orderbyColumns, 'orderByColumn');
-        addNavOptMeta(response.values.selectColumns, 'selectColumn');
+        addNavOptPopularity(response.values.filterColumns, 'filterColumn');
+        addNavOptPopularity(response.values.groupbyColumns, 'groupByColumn');
+        addNavOptPopularity(response.values.joinColumns, 'joinColumn');
+        addNavOptPopularity(response.values.orderbyColumns, 'orderByColumn');
+        addNavOptPopularity(response.values.selectColumns, 'selectColumn');
       }
-      var entriesWithNavOptMeta = [];
+      var popularEntries = [];
       Object.keys(updatedIndex).forEach(function(path) {
-        entriesWithNavOptMeta.push(updatedIndex[path]);
+        popularEntries.push(updatedIndex[path]);
       });
-      deferred.resolve(entriesWithNavOptMeta);
+      deferred.resolve(popularEntries);
     }).fail(deferred.reject);
 
     return new CancellablePromise(deferred.promise(), undefined, [ childPromise ]);
@@ -550,22 +556,22 @@ var DataCatalog = (function () {
    *
    * @return {CancellablePromise}
    */
-  DataCatalogEntry.prototype.loadNavOptMetaForChildren = function (options) {
+  DataCatalogEntry.prototype.loadNavOptPopularityForChildren = function (options) {
     var self = this;
     if (self.getSourceType() !== 'hive' && self.getSourceType() !== 'impala') {
       return $.Deferred().reject().promise();
     }
-    if (self.navOptMetaForChildrenPromise && (!options || !options.refreshCache)) {
-      return self.navOptMetaForChildrenPromise;
+    if (self.navOptPopularityForChildrenPromise && (!options || !options.refreshCache)) {
+      return self.navOptPopularityForChildrenPromise;
     }
     var deferred = $.Deferred();
     var cancellablePromises = [];
     if (self.definition && self.definition.navOptLoaded && (!options || !options.refreshCache)) {
       cancellablePromises.push(self.getChildren(options).done(function (childEntries) {
-        deferred.resolve(childEntries.filter(function (entry) { return entry.navOptMeta }));
+        deferred.resolve(childEntries.filter(function (entry) { return entry.navOptPopularity }));
       }).fail(deferred.reject));
     } else if (self.isDatabase() || self.isTableOrView()) {
-      cancellablePromises.push(ApiHelper.getInstance().fetchNavOptMetadata({
+      cancellablePromises.push(ApiHelper.getInstance().fetchNavOptPopularity({
         silenceErrors: options && options.silenceErrors,
         refreshCache: options && options.refreshCache,
         paths: [ self.path ]
@@ -575,8 +581,8 @@ var DataCatalog = (function () {
     } else {
       deferred.resolve([]);
     }
-    self.navOptMetaForChildrenPromise = new CancellablePromise(deferred.promise(), undefined, cancellablePromises);
-    return self.navOptMetaForChildrenPromise;
+    self.navOptPopularityForChildrenPromise = new CancellablePromise(deferred.promise(), undefined, cancellablePromises);
+    return self.navOptPopularityForChildrenPromise;
   };
 
   DataCatalogEntry.prototype.getKnownComment = function () {
@@ -889,6 +895,26 @@ var DataCatalog = (function () {
     return self.sourceMetaPromise || reloadSourceMeta(self, options);
   };
 
+  /**
+   * @param {Object} [options]
+   * @param {boolean} [options.silenceErrors]
+   * @param {boolean} [options.cachedOnly]
+   * @param {boolean} [options.refreshCache] - Clears the browser cache
+   * @param {boolean} [options.refreshAnalysis] - Performs a hard refresh on the source level
+   *
+   * @return {CancellablePromise}
+   */
+  DataCatalogEntry.prototype.getAnalysis = function (options) {
+    var self = this;
+    if (options && options.cachedOnly) {
+      return self.analysisPromise || $.Deferred().reject(false).promise();
+    }
+    if (options && (options.refreshCache || options.refreshAnalysis)) {
+      return reloadAnalysis(self, options);
+    }
+    return self.analysisPromise || reloadAnalysis(self, options);
+  };
+
   /**
    * @param {Object} [options]
    * @param {boolean} [options.silenceErrors]
@@ -955,7 +981,6 @@ var DataCatalog = (function () {
       promises.push(entry.getSourceMeta(options));
       promises.push(entry.getSample(options));
       if (entry.hasPossibleChildren()) {
-        //promises.push(entry.loadNavOptMetaForChildren(options));
         promises.push(entry.loadNavigatorMetaForChildren(options));
         promises.push(entry.getChildren(options).done(function (childEntries) {
           promises.push(childEntries.forEach(function (childEntry) {

+ 15 - 15
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -1183,27 +1183,27 @@ var AutocompleteResults = (function () {
     });
 
     self.cancellablePromises.push(DataCatalog.getCatalog(self.snippet.type())
-      .loadNavOptMetaForTables({ paths: paths, silenceErrors: true }).done(function (entries) {
+      .loadNavOptPopularityForTables({ paths: paths, silenceErrors: true }).done(function (entries) {
         var totalColumnCount = 0;
         var matchedEntries = [];
         var prefix = suggestSpec.prefix ? (self.parseResult.lowerCase ? suggestSpec.prefix.toLowerCase() : suggestSpec.prefix) + ' ' : '';
 
         entries.forEach(function (entry) {
-          if (entry.navOptMeta[navOptAttribute]) {
-            totalColumnCount += entry.navOptMeta[navOptAttribute].columnCount;
+          if (entry.navOptPopularity[navOptAttribute]) {
+            totalColumnCount += entry.navOptPopularity[navOptAttribute].columnCount;
             matchedEntries.push(entry);
           }
         });
         if (totalColumnCount > 0) {
           var suggestions = [];
           matchedEntries.forEach(function (entry) {
-            var filterValue = self.createNavOptIdentifierForColumn(entry.navOptMeta[navOptAttribute], suggestSpec.tables);
+            var filterValue = self.createNavOptIdentifierForColumn(entry.navOptPopularity[navOptAttribute], suggestSpec.tables);
             suggestions.push({
               value: prefix + filterValue,
               filterValue: filterValue,
               meta: navOptAttribute === 'groupByColumn' ? HUE_I18n.autocomplete.meta.groupBy : HUE_I18n.autocomplete.meta.orderBy,
               category: navOptAttribute === 'groupByColumn' ? CATEGORIES.POPULAR_GROUP_BY : CATEGORIES.POPULAR_ORDER_BY,
-              weightAdjust:  Math.round(100 * entry.navOptMeta[navOptAttribute].columnCount / totalColumnCount),
+              weightAdjust:  Math.round(100 * entry.navOptPopularity[navOptAttribute].columnCount / totalColumnCount),
               popular: ko.observable(true),
               hasCatalogEntry: true,
               details: entry
@@ -1320,20 +1320,20 @@ var AutocompleteResults = (function () {
         && self.parseResult.suggestTables.identifierChain[0].name ? self.parseResult.suggestTables.identifierChain[0].name : self.activeDatabase;
 
       DataCatalog.getEntry({sourceType: self.snippet.type(), path: [db]}).done(function (entry) {
-        self.cancellablePromises.push(entry.loadNavOptMetaForChildren({ silenceErrors: true }).done(function (childEntries) {
+        self.cancellablePromises.push(entry.loadNavOptPopularityForChildren({ silenceErrors: true }).done(function (childEntries) {
           var totalPopularity = 0;
           var popularityIndex = {};
           childEntries.forEach(function (childEntry) {
-            if (childEntry.navOptMeta && childEntry.navOptMeta.popularity) {
+            if (childEntry.navOptPopularity && childEntry.navOptPopularity.popularity) {
               popularityIndex[childEntry.name] = true;
-              totalPopularity += childEntry.navOptMeta.popularity;
+              totalPopularity += childEntry.navOptPopularity.popularity;
             }
           });
           if (totalPopularity > 0 && Object.keys(popularityIndex).length) {
             tablesDeferred.done(function (tableSuggestions) {
               tableSuggestions.forEach(function (suggestion) {
                 if (popularityIndex[suggestion.details.name]) {
-                  suggestion.relativePopularity = Math.round(100 * suggestion.details.navOptMeta.popularity / totalPopularity);
+                  suggestion.relativePopularity = Math.round(100 * suggestion.details.navOptPopularity.popularity / totalPopularity);
                   if (suggestion.relativePopularity >= 5) {
                     suggestion.popular(true);
                   }
@@ -1371,7 +1371,7 @@ var AutocompleteResults = (function () {
         }
       });
 
-      self.cancellablePromises.push(DataCatalog.getCatalog(self.snippet.type()).loadNavOptMetaForTables({ paths: paths, silenceErrors: true }).done(function (navOptMetaEntries) {
+      self.cancellablePromises.push(DataCatalog.getCatalog(self.snippet.type()).loadNavOptPopularityForTables({ paths: paths, silenceErrors: true }).done(function (popularEntries) {
         var valueAttribute = '';
         switch (suggestColumns.source) {
           case 'select':
@@ -1386,9 +1386,9 @@ var AutocompleteResults = (function () {
 
         var popularityIndex = {};
 
-        navOptMetaEntries.forEach(function (navOptMetaEntry) {
-          if (navOptMetaEntry.navOptMeta && navOptMetaEntry.navOptMeta[valueAttribute]) {
-            popularityIndex[navOptMetaEntry.getQualifiedPath()] = true;
+        popularEntries.forEach(function (popularEntry) {
+          if (popularEntry.navOptPopularity && popularEntry.navOptPopularity[valueAttribute]) {
+            popularityIndex[popularEntry.getQualifiedPath()] = true;
           }
         });
 
@@ -1403,12 +1403,12 @@ var AutocompleteResults = (function () {
           columns.forEach(function (suggestion) {
             if (suggestion.hasCatalogEntry && popularityIndex[suggestion.details.getQualifiedPath()]) {
               matchedSuggestions.push(suggestion);
-              totalColumnCount += suggestion.details.navOptMeta[valueAttribute].columnCount;
+              totalColumnCount += suggestion.details.navOptPopularity[valueAttribute].columnCount;
             }
           });
           if (totalColumnCount > 0) {
             matchedSuggestions.forEach(function (matchedSuggestion) {
-              matchedSuggestion.relativePopularity = Math.round(100 * matchedSuggestion.details.navOptMeta[valueAttribute].columnCount / totalColumnCount);
+              matchedSuggestion.relativePopularity = Math.round(100 * matchedSuggestion.details.navOptPopularity[valueAttribute].columnCount / totalColumnCount);
               if (matchedSuggestion.relativePopularity  >= 5) {
                 matchedSuggestion.popular(true);
               }

+ 3 - 3
desktop/core/src/desktop/templates/hue_ace_autocompleter.mako

@@ -689,10 +689,10 @@ from desktop.views import _ko
         self.showTitle = !!params.showTitle;
 
         // TODO: Load nav comment with 1 sec delay if not there
-        self.catalogEntry .getComment({ cacheOnly: true }).done(self.comment);
+        self.catalogEntry.getComment({ cacheOnly: true }).done(self.comment);
 
-        if (self.catalogEntry .navOptMeta && self.catalogEntry .navOptMeta.relativePopularity) {
-          self.popularity(self.catalogEntry .navOptMeta.relativePopularity);
+        if (self.catalogEntry.navOptPopularity && self.catalogEntry.navOptPopularity.relativePopularity) {
+          self.popularity(self.catalogEntry.navOptPopularity.relativePopularity);
         }
       }
 

+ 2 - 2
desktop/core/src/desktop/templates/ko_components/ko_context_popover.mako

@@ -607,9 +607,9 @@ from metadata.conf import has_navigator
 
         self.columns = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, apiHelper.fetchAutocomplete, self);
         self.columnDetails = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, apiHelper.fetchAutocomplete, self);
-        self.tableDetails = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, sourceType === 'solr' ? $.noop : apiHelper.fetchAnalysis, self);
+        self.tableDetails = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, sourceType === 'solr' ? $.noop : apiHelper.fetchAnalysis_OLD, self);
         self.sample = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, apiHelper.fetchSamples, self);
-        self.analysis = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, apiHelper.fetchAnalysis, self);
+        self.analysis = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, apiHelper.fetchAnalysis_OLD, self);
         self.partitions = new GenericTabContents(data.identifierChain, sourceType, defaultDatabase, apiHelper.fetchPartitions, self);
 
         self.hasErrors = false;