Răsfoiți Sursa

[core] Migrate assist helper to new notebook API

Johan Ahlen 10 ani în urmă
părinte
comite
c42d7b3e03

+ 48 - 50
desktop/core/src/desktop/static/desktop/js/assistHelper.js

@@ -15,45 +15,40 @@
 // limitations under the License.
 
 var TIME_TO_LIVE_IN_MILLIS = 86400000; // 1 day
+var NOTEBOOK_API_PREFIX = "/notebook/api/autocomplete/";
 
 /**
  * @param options {object}
- * @param options.app
+ * @param options.notebook
  * @param options.user
  *
  * @constructor
  */
 function AssistHelper (options) {
   var self = this;
-  self.options = options;
-  self.app = options.app;
   self.activeDatabase = ko.observable();
   if (typeof options.db !== "undefined") {
     self.activeDatabase(options.db)
   }
+  self.notebook = options.notebook;
+  self.user = options.user;
 }
 
 AssistHelper.prototype.hasExpired = function (timestamp) {
   return (new Date()).getTime() - timestamp > TIME_TO_LIVE_IN_MILLIS;
 };
 
-AssistHelper.prototype.getTotalStorageUserPrefix = function () {
+AssistHelper.prototype.getTotalStorageUserPrefix = function (snippet) {
   var self = this;
-  var app = "";
-  if (typeof self.options.app != "undefined") {
-    app = self.options.app;
-  }
-  if (typeof self.options.user != "undefined") {
-    return app + "_" + self.options.user;
-  }
-  return app;
+  return snippet.type() + "_" + self.user;
 };
 
-AssistHelper.prototype.fetchTableHtmlPreview = function(tableName, successCallback, errorCallback) {
+AssistHelper.prototype.fetchTableHtmlPreview = function(snippet, tableName, successCallback, errorCallback) {
   var self = this;
+  var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
   $.ajax({
-    url: "/" + self.options.app + "/api/table/" + self.activeDatabase() + "/" + tableName,
-    data: {"sample": true},
+    url: "/" + app + "/api/table/" + self.activeDatabase() + "/" + tableName,
+    data: { "sample": true },
     beforeSend: function (xhr) {
       xhr.setRequestHeader("X-Requested-With", "Hue");
     },
@@ -63,7 +58,7 @@ AssistHelper.prototype.fetchTableHtmlPreview = function(tableName, successCallba
   });
 };
 
-AssistHelper.prototype.refreshTableStats = function(tableName, columnName, successCallback, errorCallback) {
+AssistHelper.prototype.refreshTableStats = function(snippet, tableName, columnName, successCallback, errorCallback) {
   var self = this;
   var pollRefresh = function (url) {
     $.post(url, function (data) {
@@ -79,7 +74,8 @@ AssistHelper.prototype.refreshTableStats = function(tableName, columnName, succe
     }).fail(errorCallback);
   };
 
-  $.post("/" + self.options.app + "/api/analyze/" + self.activeDatabase() + "/" + tableName + "/"  + (columnName || ""), function (data) {
+  var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
+  $.post("/" + app + "/api/analyze/" + self.activeDatabase() + "/" + tableName + "/"  + (columnName || ""), function (data) {
     if (data.status == 0 && data.watch_url) {
       pollRefresh(data.watch_url);
     } else {
@@ -88,10 +84,11 @@ AssistHelper.prototype.refreshTableStats = function(tableName, columnName, succe
   }).fail(errorCallback);
 };
 
-AssistHelper.prototype.fetchStats = function(tableName, columnName, successCallback, errorCallback) {
+AssistHelper.prototype.fetchStats = function(snippet, tableName, columnName, successCallback, errorCallback) {
   var self = this;
+  var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
   $.ajax({
-    url: "/" + self.options.app + "/api/table/" + self.activeDatabase() + "/" + tableName + "/stats/" + (columnName || ""),
+    url: "/" + app + "/api/table/" + self.activeDatabase() + "/" + tableName + "/stats/" + (columnName || ""),
     data: {},
     beforeSend: function (xhr) {
       xhr.setRequestHeader("X-Requested-With", "Hue");
@@ -102,10 +99,11 @@ AssistHelper.prototype.fetchStats = function(tableName, columnName, successCallb
   });
 };
 
-AssistHelper.prototype.fetchTerms = function(tableName, columnName, prefixFilter, successCallback, errorCallback) {
+AssistHelper.prototype.fetchTerms = function(snippet, tableName, columnName, prefixFilter, successCallback, errorCallback) {
   var self = this;
+  var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
   $.ajax({
-    url: "/" + self.options.app + "/api/table/" + self.activeDatabase() + "/" + tableName + "/terms/" + columnName + "/" + (prefixFilter || ""),
+    url: "/" + app + "/api/table/" + self.activeDatabase() + "/" + tableName + "/terms/" + columnName + "/" + (prefixFilter || ""),
     data: {},
     beforeSend: function (xhr) {
       xhr.setRequestHeader("X-Requested-With", "Hue");
@@ -116,60 +114,60 @@ AssistHelper.prototype.fetchTerms = function(tableName, columnName, prefixFilter
   });
 };
 
-AssistHelper.prototype.fetchDatabases = function(successCallback, errorCallback) {
+AssistHelper.prototype.fetchDatabases = function(snippet, successCallback, errorCallback) {
   var self = this;
-  self.fetchAssistData("/" + self.options.app + "/api/autocomplete/", function(data) {
+  self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX, function(data) {
     // Blacklist of system databases
     data.databases = $.grep(data.databases, function(database) { return database !== "_impala_builtins" });
     successCallback(data);
   }, errorCallback);
 };
 
-AssistHelper.prototype.fetchTables = function(successCallback, errorCallback) {
+AssistHelper.prototype.fetchTables = function(snippet, successCallback, errorCallback) {
   var self = this;
-  self.fetchAssistData("/" + self.options.app + "/api/autocomplete/" + self.activeDatabase(), successCallback, errorCallback);
+  self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX + self.activeDatabase(), successCallback, errorCallback);
 };
 
-AssistHelper.prototype.fetchFields = function(tableName, fields, successCallback, errorCallback) {
+AssistHelper.prototype.fetchFields = function(snippet, tableName, fields, successCallback, errorCallback, editor) {
   var self = this;
 
   var fieldPart = fields.length > 0 ? "/" + fields.join("/") : "";
-  self.fetchAssistData("/" + self.options.app + "/api/autocomplete/" + self.activeDatabase() + "/" + tableName + fieldPart, successCallback, errorCallback);
+  self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX + self.activeDatabase() + "/" + tableName + fieldPart, successCallback, errorCallback, editor);
 };
 
-AssistHelper.prototype.clearCache = function() {
+AssistHelper.prototype.clearCache = function(snippet) {
   var self = this;
-  $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(), {});
+  $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(snippet), {});
 };
 
-AssistHelper.prototype.fetchPanelData = function (hierarchy, successCallback, errorCallback) {
+AssistHelper.prototype.fetchPanelData = function (snippet, hierarchy, successCallback, errorCallback) {
   var self = this;
-  self.fetchAssistData("/" + self.options.app + "/api/autocomplete/" + hierarchy.join("/"), successCallback, errorCallback);
+  self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX + hierarchy.join("/"), successCallback, errorCallback);
 };
 
-AssistHelper.prototype.fetchAssistData = function (url, successCallback, errorCallback) {
+AssistHelper.prototype.fetchAssistData = function (snippet, url, successCallback, errorCallback, editor) {
   var self = this;
-  var cachedData = $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix()) || {};
+  var cachedData = $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(snippet)) || {};
 
   if (typeof cachedData[url] == "undefined" || self.hasExpired(cachedData[url].timestamp)) {
-    $.ajax({
-      type: "GET",
-      url: url + "?" + Math.random(),
-      success: function (data) {
-        if (typeof data.code != "undefined" && data.code != null) {
-          errorCallback(data.error);
-        } else {
-          cachedData[url] = {
-            timestamp: (new Date()).getTime(),
-            data: data
-          };
-          $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(), cachedData);
-          successCallback(data);
-        }
-      },
-      error: errorCallback
+    if (editor) {
+      editor.showSpinner();
+    }
+    $.post(url, {
+      notebook: ko.mapping.toJSON(self.notebook.getContext()),
+      snippet: ko.mapping.toJSON(snippet.getContext())
+    }, function (data) {
+      if (data.status == 0) {
+        successCallback(data);
+      } else {
+        errorCallback(data);
+      }
+    }).fail(errorCallback).always(function () {
+      if (editor) {
+        editor.hideSpinner();
+      }
     });
   } else {
     successCallback(cachedData[url].data);
   }
-};
+};

+ 5 - 38
desktop/core/src/desktop/static/desktop/js/autocomplete.js

@@ -46,40 +46,6 @@ Autocompleter.prototype.getCompletions = function (editor, session, pos, prefix,
   }, editor);
 };
 
-Autocompleter.prototype.callAutocompleteApi = function (tableName, nested, success, failure, editor) {
-  var self = this;
-  var path = self.assistHelper.activeDatabase();
-
-  if (tableName) {
-    path += "/" + tableName;
-    $.each(nested, function(index, part) {
-      path += "/" + part;
-    });
-  }
-
-  var self = this;
-
-  // TODO: Use shared cache with assist helper.
-
-  if (editor) {
-    editor.showSpinner();
-  }
-  $.post("/notebook/api/autocomplete/" + path, {
-    notebook: ko.mapping.toJSON(self.notebook.getContext()),
-    snippet: ko.mapping.toJSON(self.snippet.getContext())
-  }, function (data) {
-    if (data.status == 0) {
-      success(data);
-    } else {
-      failure();
-    }
-  }).fail(failure).always(function () {
-    if (editor) {
-      editor.hideSpinner();
-    }
-  });
-};
-
 Autocompleter.prototype.getFromReferenceIndex = function (statement) {
   var result = {
     tables: {},
@@ -303,7 +269,8 @@ Autocompleter.prototype.autocomplete = function(beforeCursor, afterCursor, callb
   var fromAfter = afterMatcher != null && afterMatcher[0] === "FROM";
 
   if (tableNameAutoComplete || (selectBefore && !fromAfter)) {
-    self.callAutocompleteApi(null, null, function (data) {
+
+    self.assistHelper.fetchTables(self.snippet, function (data) {
       var fromKeyword = "";
       if (selectBefore) {
         if (beforeCursor.indexOf("SELECT") > -1) {
@@ -384,7 +351,7 @@ Autocompleter.prototype.autocomplete = function(beforeCursor, afterCursor, callb
 
     var getFields = function (remainingParts, fields) {
       if (remainingParts.length == 0) {
-        self.callAutocompleteApi(tableName, fields, function(data) {
+        self.assistHelper.fetchFields(self.snippet, tableName, fields, function(data) {
           if (fields.length == 0) {
             callback(self.extractFields(data, "", !fieldTermBefore && !impalaFieldRef, viewReferences.allViewReferences));
           } else {
@@ -419,7 +386,7 @@ Autocompleter.prototype.autocomplete = function(beforeCursor, afterCursor, callb
           var mapOrArrayMatch = part.match(/([^\[]*)\[[^\]]*\]$/i);
           if (mapOrArrayMatch !== null) {
             fields.push(mapOrArrayMatch[1]);
-            self.callAutocompleteApi(tableName, fields, function(data) {
+            self.assistHelper.fetchFields(self.snippet, tableName, fields, function(data) {
               if (data.type === "map") {
                 fields.push("value");
                 getFields(remainingParts, fields);
@@ -439,7 +406,7 @@ Autocompleter.prototype.autocomplete = function(beforeCursor, afterCursor, callb
           }
           // For impala we have to fetch info about each field as we don't know
           // whether it's a map or array for hive the [ and ] gives it away...
-          self.callAutocompleteApi(tableName, fields, function(data) {
+          self.assistHelper.fetchFields(self.snippet, tableName, fields, function(data) {
             if (data.type === "map") {
               remainingParts.unshift("value");
             } else if (data.type === "array") {