소스 검색

HUE-7820 [frontend] Add sample to the data catalog entries

Johan Ahlen 7 년 전
부모
커밋
f6a9f5340e
2개의 변경된 파일112개의 추가작업 그리고 184개의 파일을 삭제
  1. 55 157
      desktop/core/src/desktop/static/desktop/js/apiHelper.js
  2. 57 27
      desktop/core/src/desktop/static/desktop/js/dataCatalog.js

+ 55 - 157
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -609,98 +609,6 @@ var ApiHelper = (function () {
     }));
   };
 
-  /**
-   * @param {Object} options
-   * @param {Function} options.successCallback
-   * @param {Function} [options.errorCallback]
-   * @param {boolean} [options.silenceErrors]
-   * @param {Number} [options.timeout]
-   * @param {Object} [options.editor] - Ace editor
-   *
-   */
-  ApiHelper.prototype.fetchSolrCollections = function (options) {
-    var self = this;
-    var url = SOLR_COLLECTIONS_API;
-    var fetchFunction = function (storeInCache) {
-      if (options.timeout === 0) {
-        self.assistErrorCallback(options)({ status: -1 });
-        return;
-      }
-      $.ajax({
-        dataType: "json",
-        url: url,
-        type: 'POST',
-        timeout: options.timeout,
-        success: function (data) {
-          if (!data.error && !self.successResponseIsError(data) && typeof data.collections !== 'undefined' && data.collections !== null) {
-            storeInCache(data);
-            options.successCallback(data);
-          } else {
-            self.assistErrorCallback(options)(data);
-          }
-        }
-      })
-      .fail(self.assistErrorCallback(options))
-      .always(function () {
-        if (typeof options.editor !== 'undefined' && options.editor !== null) {
-          options.editor.hideSpinner();
-        }
-      });
-    };
-
-    fetchCached.bind(self)($.extend({}, options, {
-      sourceType: 'collections',
-      url: url,
-      fetchFunction: fetchFunction
-    }));
-  };
-
-  /**
-   * @param {Object} options
-   * @param {String} options.collectionName
-   * @param {Function} options.successCallback
-   * @param {Function} [options.errorCallback]
-   * @param {boolean} [options.silenceErrors]
-   * @param {Number} [options.timeout]
-   *
-   */
-  ApiHelper.prototype.fetchSolrCollection = function (options) {
-    var self = this;
-    var url = SOLR_FIELDS_API  + '?name=' + options.collectionName;
-    var fetchFunction = function (storeInCache) {
-      if (options.timeout === 0) {
-        self.assistErrorCallback(options)({ status: -1 });
-        return;
-      }
-      $.ajax({
-        dataType: "json",
-        url: url,
-        type: 'GET',
-        timeout: options.timeout,
-        success: function (data) {
-          if (!data.error && !self.successResponseIsError(data) && typeof data.schema !== 'undefined' && data.schema !== null) {
-            storeInCache(data);
-            options.successCallback(data);
-          } else {
-            self.assistErrorCallback(options)(data);
-          }
-        }
-      })
-      .fail(self.assistErrorCallback(options))
-      .always(function () {
-        if (typeof options.editor !== 'undefined' && options.editor !== null) {
-          options.editor.hideSpinner();
-        }
-      });
-    };
-
-    fetchCached.bind(self)($.extend({}, options, {
-      sourceType: 'collections',
-      url: url,
-      fetchFunction: fetchFunction
-    }));
-  };
-
   /**
    * @param {Object} options
    * @param {String} options.collectionName
@@ -1235,6 +1143,7 @@ var ApiHelper = (function () {
    * @param {Object[]} options.identifierChain
    * @param {string} options.defaultDatabase
    */
+  // TODO: Move to DataCatalog
   ApiHelper.prototype.fetchPartitions = function (options) {
     var self = this;
 
@@ -1277,6 +1186,7 @@ var ApiHelper = (function () {
    * @param {string} options.databaseName
    * @param {string} options.tableName
    */
+  // TODO: Move to DataCatalog
   ApiHelper.prototype.fetchTableDetails = function (options) {
     var self = this;
     $.ajax({
@@ -1300,6 +1210,8 @@ var ApiHelper = (function () {
 
 
   /**
+   * Deprecated, use DataCatalog.getEntry(...).getSample()
+   *
    * @param {Object} options
    * @param {string} options.sourceType
    * @param {Function} options.successCallback
@@ -1312,6 +1224,7 @@ var ApiHelper = (function () {
    * @param {string} [options.columnName]
    * @param {Object} [options.editor] - Ace editor
    */
+  // TODO: Delete once DataCatalog is used throughout
   ApiHelper.prototype.fetchTableSample = function (options) {
     var self = this;
     var url = SAMPLE_API_PREFIX + options.databaseName + '/' + options.tableName + (options.columnName ? '/' + options.columnName : '');
@@ -1396,37 +1309,6 @@ var ApiHelper = (function () {
     }).fail(self.assistErrorCallback(options));
   };
 
-  /**
-   * @param {Object} options
-   * @param {string} options.sourceType
-   * @param {Function} options.successCallback
-   * @param {Function} [options.errorCallback]
-   * @param {boolean} [options.silenceErrors]
-   *
-   * @param {string} options.databaseName
-   * @param {string} options.tableName
-   * @param {string} options.columnName
-   */
-  ApiHelper.prototype.fetchStats = function (options) {
-    var self = this;
-    $.ajax({
-      url: "/" + options.sourceType + "/api/table/" + options.databaseName + "/" + options.tableName + "/stats/" + ( options.columnName || ""),
-      data: {},
-      beforeSend: function (xhr) {
-        xhr.setRequestHeader("X-Requested-With", "Hue");
-      },
-      dataType: "json",
-      success: function (response) {
-        if (! self.successResponseIsError(response)) {
-          options.successCallback(response)
-        } else {
-          self.assistErrorCallback(options)(response);
-        }
-      },
-      error: self.assistErrorCallback(options)
-    });
-  };
-
   /**
    * Returns a promise that will always be resolved with:
    *
@@ -1655,6 +1537,35 @@ var ApiHelper = (function () {
     return self.simplePost(url, data, options);
   };
 
+  /**
+   * Fetches samples for the given source and path
+   *
+   * @param {Object} options
+   * @param {boolean} [options.silenceErrors]
+   * @param {boolean} [options.noCache]
+   * @param {boolean} [options.refreshCache] - Default false
+   *
+   * @param {string} options.sourceType
+   * @param {string[]} options.path
+   */
+  ApiHelper.prototype.fetchSample = function (options) {
+    var self = this;
+    var deferred = $.Deferred();
+    fetchAssistData.bind(self)({
+      url: SAMPLE_API_PREFIX + options.path.join('/'),
+      sourceType: options.sourceType,
+      noCache: options.noCache,
+      refreshCache: options.refreshCache,
+      silenceErrors: options.silenceErrors,
+      successCallback: deferred.resolve,
+      errorCallback: self.assistErrorCallback({
+        errorCallback: deferred.reject,
+        silenceErrors: options.silenceErrors
+      }),
+      cacheCondition: genericCacheCondition
+    });
+    return deferred.promise();
+  };
 
   /**
    * Fetches a navigator entity for the given source and path
@@ -1669,7 +1580,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchNavigatorMetadata = function (options) {
     var self = this;
-    var promise = $.Deferred();
+    var deferred = $.Deferred();
     var url = NAV_URLS.FIND_ENTITY;
 
     if (options.path.length === 1) {
@@ -1686,15 +1597,17 @@ var ApiHelper = (function () {
       noCache: options.noCache,
       refreshCache: options.refreshCache,
       silenceErrors: options.silenceErrors,
-      successCallback: promise.resolve,
+      successCallback: function (data) {
+        deferred.resolve(data.entity || data);
+      },
       errorCallback: self.assistErrorCallback({
-        errorCallback: promise.reject,
+        errorCallback: deferred.reject,
         silenceErrors: options.silenceErrors
       }),
       cacheCondition: genericCacheCondition
     });
 
-    return promise;
+    return deferred.promise();
   };
 
   ApiHelper.prototype.updateNavigatorMetadata = function (options) {
@@ -1739,6 +1652,8 @@ var ApiHelper = (function () {
 
 
   /**
+   * Deprecated, use DataCatalog.getEntry(...).getSourceDetails()
+   *
    * @param {Object} options
    * @param {string} options.sourceType
    * @param {Function} options.successCallback
@@ -1752,7 +1667,7 @@ var ApiHelper = (function () {
    * @param {string} options.identifierChain.name
    * @param {string} options.defaultDatabase
    */
-  // TODO: Drop and use fetchSqlMetadata instead
+  // TODO: Drop and use DataCatalog.getEntry(...).getSourceDetails() throughout
   ApiHelper.prototype.fetchAutocomplete = function (options) {
     var self = this;
     self.identifierChainToPath(options).done(function (path) {
@@ -1765,6 +1680,8 @@ var ApiHelper = (function () {
   };
 
   /**
+   * Deprecated, use DataCatalog.getEntry(...).getSourceDetails()
+   *
    * @param {Object} options
    * @param {string} options.sourceType
    * @param {Function} options.successCallback
@@ -1775,7 +1692,7 @@ var ApiHelper = (function () {
    *
    * @param {string} options.databaseName
    */
-  // TODO: Drop and use fetchSqlMetadata instead
+  // TODO: Drop and use DataCatalog.getEntry(...).getSourceDetails() throughout
   ApiHelper.prototype.fetchTables = function (options) {
     var self = this;
     return fetchAssistData.bind(self)($.extend({}, options, {
@@ -1786,6 +1703,8 @@ var ApiHelper = (function () {
   };
 
   /**
+   * Deprecated, use DataCatalog.getEntry(...).getSourceDetails()
+   *
    * @param {Object} options
    * @param {string} options.sourceType
    * @param {Function} options.successCallback
@@ -1799,7 +1718,7 @@ var ApiHelper = (function () {
    * @param {string} options.tableName
    * @param {string[]} options.fields
    */
-  // TODO: Drop and use fetchSqlMetadata instead
+  // TODO: Drop and use DataCatalog.getEntry(...).getSourceDetails() throughout
   ApiHelper.prototype.fetchFields = function (options) {
     var self = this;
     var fieldPart = options.fields.length > 0 ? "/" + options.fields.join("/") : "";
@@ -1811,6 +1730,8 @@ var ApiHelper = (function () {
   };
 
   /**
+   * Deprecated, use DataCatalog.getEntry(...).getSample()
+   *
    * @param {Object} options
    * @param {string} options.sourceType
    * @param {Function} options.successCallback
@@ -1823,6 +1744,7 @@ var ApiHelper = (function () {
    * @param {string} options.identifierChain.name
    * @param {string} options.defaultDatabase
    */
+  // TODO: Drop and use DataCatalog.getEntry(...).getSample() throughout
   ApiHelper.prototype.fetchSamples = function (options) {
     var self = this;
     self.identifierChainToPath(options).done(function (path) {
@@ -1848,6 +1770,7 @@ var ApiHelper = (function () {
    * @param {string} options.identifierChain.name
    * @param {string} options.defaultDatabase
    */
+  // TODO: Add to DataCatalog
   ApiHelper.prototype.fetchAnalysis = function (options) {
     var self = this;
     var clonedIdentifierChain = options.identifierChain.concat();
@@ -1964,6 +1887,7 @@ var ApiHelper = (function () {
    *
    * @param {Object[]} options.database
    */
+  // TODO: Add to DataCatalog
   ApiHelper.prototype.fetchNavOptTopTables = function (options) {
     var self = this;
     return self.fetchNavOptCached(NAV_OPT_URLS.TOP_TABLES, options, function (data) {
@@ -1985,6 +1909,7 @@ var ApiHelper = (function () {
    * @param {string} options.tables.identifierChain.name
    * @param {string} [options.defaultDatabase]
    */
+  // TODO: Add to DataCatalog
   ApiHelper.prototype.fetchNavOptTopColumns = function (options) {
     var self = this;
     return self.fetchNavOptCached(NAV_OPT_URLS.TOP_COLUMNS, options, function (data) {
@@ -2158,33 +2083,6 @@ var ApiHelper = (function () {
     return promise;
   };
 
-  ApiHelper.prototype.globalSearchAutocomplete = function (options) {
-    var self = this;
-
-    $.when.apply($, [
-      $.post(INTERACTIVE_SEARCH_API, {
-        query_s: ko.mapping.toJSON(options.query),
-        limit: 5,
-        sources: '["sql", "hdfs", "s3"]'
-      }),
-      $.post(INTERACTIVE_SEARCH_API, {
-          query_s: ko.mapping.toJSON(options.query),
-          limit: 5,
-          sources: '["documents"]'
-        })
-      ]
-    ).done(function (metadata, documents) {
-      if (metadata[0].status === 0 || documents[0].status === 0) {
-        if (documents[0].status === 0) {
-           metadata[0].resultsHuedocuments = documents[0].results;
-        }
-        options.successCallback(metadata[0]);
-      } else {
-        self.assistErrorCallback(options)(metadata);
-      }
-    }).fail(self.assistErrorCallback(options));
-  };
-
   ApiHelper.prototype.searchEntities = function (options) {
     var self = this;
     var deferred = $.Deferred();

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

@@ -39,6 +39,16 @@ var DataCatalog = (function () {
     return self.entries[identifier] || (self.entries[identifier] = new DataCatalogEntry(self, options.path, options.definition));
   };
 
+  var fetchMeta = function (apiHelperFunction, dataCatalogEntry, apiOptions) {
+    return ApiHelper.getInstance()[apiHelperFunction]({
+      sourceType: dataCatalogEntry.dataCatalog.sourceType,
+      path: dataCatalogEntry.path,
+      silenceErrors: apiOptions && apiOptions.silenceErrors,
+      cachedOnly: apiOptions && apiOptions.cachedOnly,
+      refreshCache: apiOptions && apiOptions.refreshCache
+    })
+  };
+
   /**
    * @param {DataCatalogEntry} dataCatalogEntry
    * @param {Object} [apiOptions]
@@ -48,18 +58,10 @@ var DataCatalog = (function () {
    * @return {Promise}
    */
   var reloadSourceMeta = function (dataCatalogEntry, apiOptions) {
-    var deferred = $.Deferred();
-    ApiHelper.getInstance().fetchSourceMetadata({
-      sourceType: dataCatalogEntry.dataCatalog.sourceType,
-      path: dataCatalogEntry.path,
-      silenceErrors: apiOptions && apiOptions.silenceErrors,
-      cachedOnly: apiOptions && apiOptions.cachedOnly,
-      refreshCache: apiOptions && apiOptions.refreshCache
-    }).done(function (data) {
-      dataCatalogEntry.sourceMeta = data;
-      deferred.resolve(data);
-    }).fail(deferred.reject);
-    dataCatalogEntry.lastSourceMetaPromise = deferred.promise();
+    dataCatalogEntry.lastSourceMetaPromise = fetchMeta('fetchSourceMetadata', dataCatalogEntry, apiOptions);
+    dataCatalogEntry.lastSourceMetaPromise.done(function (sourceMeta) {
+      dataCatalogEntry.sourceMeta = sourceMeta;
+    });
     return dataCatalogEntry.lastSourceMetaPromise;
   };
 
@@ -72,28 +74,37 @@ var DataCatalog = (function () {
    * @return {Promise}
    */
   var reloadNavigatorMeta = function (dataCatalogEntry, apiOptions) {
-    var deferred = $.Deferred();
     if (HAS_NAVIGATOR) {
-      ApiHelper.getInstance().fetchNavigatorMetadata({
-        path: dataCatalogEntry.path,
-        silenceErrors: apiOptions && apiOptions.silenceErrors,
-        cachedOnly: apiOptions && apiOptions.cachedOnly,
-        refreshCache: apiOptions && apiOptions.refreshCache
-      }).done(function (data) {
-        dataCatalogEntry.navigatorMeta = data.entity || data;
-        deferred.resolve(dataCatalogEntry.navigatorMeta);
-      }).fail(deferred.reject);
+      dataCatalogEntry.lastNavigatorMetaPromise = fetchMeta('fetchNavigatorMetadata', dataCatalogEntry, apiOptions);
+      dataCatalogEntry.lastNavigatorMetaPromise.done(function (navigatorMeta) {
+        dataCatalogEntry.navigatorMeta = navigatorMeta;
+      });
     } else {
-      deferred.reject();
+      dataCatalogEntry.lastNavigatorMetaPromise =  $.Deferred.reject().promise();
     }
-    dataCatalogEntry.lastNavigatorMetaPromise = deferred.promise();
     return dataCatalogEntry.lastNavigatorMetaPromise;
   };
 
+  /**
+   * @param {DataCatalogEntry} dataCatalogEntry
+   * @param {Object} [apiOptions]
+   * @param {boolean} [apiOptions.silenceErrors]
+   * @param {boolean} [apiOptions.cachedOnly]
+   * @param {boolean} [apiOptions.refreshCache]
+   * @return {Promise}
+   */
+  var reloadSample = function (dataCatalogEntry, apiOptions) {
+    dataCatalogEntry.lastSamplePromise = fetchMeta('fetchSample', dataCatalogEntry, apiOptions);
+    dataCatalogEntry.lastSamplePromise.done(function (sample) {
+      dataCatalogEntry.sample = sample;
+    });
+    return dataCatalogEntry.lastSamplePromise;
+  };
+
   /**
    * @param {DataCatalog} dataCatalog
    * @param {string|string[]} path
-   * @param {Object} definition
+   * @param {Object} definition - Initial known metadata on creation
    * @constructor
    */
   function DataCatalogEntry(dataCatalog, path, definition) {
@@ -104,11 +115,16 @@ var DataCatalog = (function () {
     self.name = self.path.length ? self.path[self.path.length - 1] : dataCatalog.sourceType;
 
     self.definition = definition;
+
     self.lastSourceMetaPromise = undefined;
     self.sourceMeta = undefined;
+
     self.lastNavigatorMetaPromise = undefined;
     self.navigatorMeta = undefined;
 
+    self.lastSamplePromise = undefined;
+    self.sample = undefined;
+
     self.children = undefined;
   }
 
@@ -184,10 +200,10 @@ var DataCatalog = (function () {
         if (result && result.entities && result.entities.length > 0) {
           var entityIndex = {};
           result.entities.forEach(function (entity) {
-            entityIndex[entity.name || entity.originalName] = entity;
+            entityIndex[(entity.name || entity.originalName).toLowerCase()] = entity;
           });
           children.forEach(function (child) {
-            var name = child.path[child.path.length - 1];
+            var name = child.name.toLowerCase();
             if (entityIndex[name]) {
               child.navigatorMeta = entityIndex[name];
               child.lastNavigatorMetaPromise = $.Deferred().resolve(child.navigatorMeta).promise();
@@ -436,6 +452,20 @@ var DataCatalog = (function () {
     return self.lastNavigatorMetaPromise || reloadNavigatorMeta(self, apiOptions)
   };
 
+  /**
+   * @param {Object} [apiOptions]
+   * @param {boolean} [apiOptions.silenceErrors]
+   * @param {boolean} [apiOptions.cachedOnly]
+   * @param {boolean} [apiOptions.refreshCache]
+   * @return {Promise}
+   */
+  DataCatalogEntry.prototype.getSample = function () {
+    var self = this;
+    return self.lastSamplePromise || reloadSample(self, options)
+  };
+
+
+
 
   var instances = {};