|
|
@@ -23,208 +23,241 @@
|
|
|
}(this, function (ko) {
|
|
|
|
|
|
var TIME_TO_LIVE_IN_MILLIS = 86400000; // 1 day
|
|
|
- var NOTEBOOK_API_PREFIX = "/notebook/api/autocomplete/";
|
|
|
+ var API_PREFIX = "/notebook/api/autocomplete/";
|
|
|
|
|
|
/**
|
|
|
- * @param options {object}
|
|
|
- * @param options.notebook
|
|
|
- * @param options.user
|
|
|
- * @param options.activeDatabase
|
|
|
+ * @param {Object} i18n
|
|
|
+ * @param {string} i18n.errorLoadingDatabases
|
|
|
+ * @param {string} user
|
|
|
*
|
|
|
* @constructor
|
|
|
*/
|
|
|
- function AssistHelper (options, i18n) {
|
|
|
+ function AssistHelper (i18n, user) {
|
|
|
var self = this;
|
|
|
self.i18n = i18n;
|
|
|
- self.activeDatabase = ko.observable();
|
|
|
- self.initialDatabase = options.activeDatabase;
|
|
|
- self.notebook = options.notebook;
|
|
|
- self.user = options.user;
|
|
|
- self.availableDatabases = ko.observableArray();
|
|
|
- self.loaded = ko.observable(false);
|
|
|
- self.loading = ko.observable(false);
|
|
|
- self.type = null;
|
|
|
- self.activeDatabase.subscribe(function (newValue) {
|
|
|
- if (self.loaded()) {
|
|
|
- $.totalStorage("hue.assist.lastSelectedDb." + self.getTotalStorageUserPrefix(), newValue);
|
|
|
- }
|
|
|
- });
|
|
|
+ self.user = user;
|
|
|
+ self.lastKnownDatabases = [];
|
|
|
}
|
|
|
|
|
|
- AssistHelper.prototype.load = function (snippet, callback) {
|
|
|
+ AssistHelper.prototype.hasExpired = function (timestamp) {
|
|
|
+ return (new Date()).getTime() - timestamp > TIME_TO_LIVE_IN_MILLIS;
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param {string} sourceType
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.getTotalStorageUserPrefix = function (sourceType) {
|
|
|
+ var self = this;
|
|
|
+ return sourceType + "_" + self.user;
|
|
|
+ };
|
|
|
+
|
|
|
+ AssistHelper.prototype.clearCache = function (sourceType) {
|
|
|
var self = this;
|
|
|
- if (self.loading()) {
|
|
|
- return;
|
|
|
- }
|
|
|
- self.type = snippet.type();
|
|
|
- self.loading(true);
|
|
|
- self.loaded(false);
|
|
|
- self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX, function(data) {
|
|
|
+ $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(sourceType), {});
|
|
|
+ };
|
|
|
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {function} options.callback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.loadDatabases = function (options) {
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ self.fetchAssistData(options.sourceType, API_PREFIX, function(data) {
|
|
|
var databases = data.databases || [];
|
|
|
// Blacklist of system databases
|
|
|
- self.availableDatabases($.grep(databases, function(database) { return database !== "_impala_builtins" }));
|
|
|
-
|
|
|
- if ($.inArray(self.activeDatabase(), self.availableDatabases()) === -1) {
|
|
|
- // Defer this, select2 will update the activeDatabase to undefined when loading so this should make sure we set
|
|
|
- // it afterwards.
|
|
|
- window.setTimeout(function() {
|
|
|
- var lastSelectedDb = $.totalStorage("hue.assist.lastSelectedDb." + self.getTotalStorageUserPrefix());
|
|
|
- if ($.inArray(self.initialDatabase, self.availableDatabases()) > -1) {
|
|
|
- self.activeDatabase(self.initialDatabase);
|
|
|
- } else if ($.inArray(lastSelectedDb, self.availableDatabases()) > -1) {
|
|
|
- self.activeDatabase(lastSelectedDb);
|
|
|
- } else if ($.inArray("default", self.availableDatabases()) > -1) {
|
|
|
- self.activeDatabase("default");
|
|
|
- } else if (self.availableDatabases().length > 0) {
|
|
|
- self.activeDatabase(self.availableDatabases()[0]);
|
|
|
- }
|
|
|
- }, 1);
|
|
|
- }
|
|
|
-
|
|
|
- self.loaded(true);
|
|
|
- self.loading(false);
|
|
|
- if (callback) {
|
|
|
- callback();
|
|
|
- }
|
|
|
+ self.lastKnownDatabases = $.grep(databases, function(database) {
|
|
|
+ return database !== "_impala_builtins";
|
|
|
+ });
|
|
|
+ options.callback(self.lastKnownDatabases);
|
|
|
}, function (message) {
|
|
|
- self.loaded(true);
|
|
|
- self.loading(false);
|
|
|
if (message.status == 401) {
|
|
|
- $(document).trigger("showAuthModal", {'type': self.type, 'callback': function() { self.load(snippet, callback) }});
|
|
|
+ $(document).trigger("showAuthModal", {'type': options.sourceType, 'callback': function() {
|
|
|
+ self.loadDatabases(options);
|
|
|
+ }});
|
|
|
} else if (message.statusText) {
|
|
|
$(document).trigger("error", self.i18n.errorLoadingDatabases + ":" + message.statusText);
|
|
|
+ } else if (message.message) {
|
|
|
+ $(document).trigger("error", self.i18n.errorLoadingDatabases + ":" + message.message);
|
|
|
} else if (message) {
|
|
|
$(document).trigger("error", message);
|
|
|
} else {
|
|
|
$(document).trigger("error", self.i18n.errorLoadingDatabases + ".");
|
|
|
}
|
|
|
- if (callback) {
|
|
|
- callback();
|
|
|
- }
|
|
|
+ self.lastKnownDatabases = [];
|
|
|
+ options.callback([]);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.hasExpired = function (timestamp) {
|
|
|
- return (new Date()).getTime() - timestamp > TIME_TO_LIVE_IN_MILLIS;
|
|
|
- };
|
|
|
-
|
|
|
- AssistHelper.prototype.getTotalStorageUserPrefix = function () {
|
|
|
- var self = this;
|
|
|
- return self.type + "_" + self.user;
|
|
|
- };
|
|
|
-
|
|
|
- AssistHelper.prototype.fetchTableHtmlPreview = function(snippet, tableName, successCallback, errorCallback) {
|
|
|
- var self = this;
|
|
|
- var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string} options.databaseName
|
|
|
+ * @param {string} options.tableName
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchTableHtmlPreview = function (options) {
|
|
|
$.ajax({
|
|
|
- url: "/" + app + "/api/table/" + self.activeDatabase() + "/" + tableName,
|
|
|
+ url: "/" + options.sourceType + "/api/table/" + options.databaseName + "/" + options.tableName,
|
|
|
data: { "sample": true },
|
|
|
beforeSend: function (xhr) {
|
|
|
xhr.setRequestHeader("X-Requested-With", "Hue");
|
|
|
},
|
|
|
dataType: "html",
|
|
|
- success: successCallback,
|
|
|
- error: errorCallback
|
|
|
+ success: options.successCallback,
|
|
|
+ error: options.errorCallback
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.refreshTableStats = function(snippet, tableName, columnName, successCallback, errorCallback) {
|
|
|
- var self = this;
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string} options.databaseName
|
|
|
+ * @param {string} options.tableName
|
|
|
+ * @param {string} options.columnName
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.refreshTableStats = function (options) {
|
|
|
var pollRefresh = function (url) {
|
|
|
$.post(url, function (data) {
|
|
|
if (data.isSuccess) {
|
|
|
- successCallback(data);
|
|
|
+ options.successCallback(data);
|
|
|
} else if (data.isFailure) {
|
|
|
- errorCallback(data.message);
|
|
|
+ options.errorCallback(data.message);
|
|
|
} else {
|
|
|
window.setTimeout(function () {
|
|
|
pollRefresh(url);
|
|
|
}, 1000);
|
|
|
}
|
|
|
- }).fail(errorCallback);
|
|
|
+ }).fail(options.errorCallback);
|
|
|
};
|
|
|
|
|
|
- var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
|
|
|
- $.post("/" + app + "/api/analyze/" + self.activeDatabase() + "/" + tableName + "/" + (columnName || ""), function (data) {
|
|
|
+ $.post("/" + options.sourceType + "/api/analyze/" + options.databaseName + "/" + options.tableName + "/" + (options.columnName || ""), function (data) {
|
|
|
if (data.status == 0 && data.watch_url) {
|
|
|
pollRefresh(data.watch_url);
|
|
|
} else {
|
|
|
- errorCallback(data.message);
|
|
|
+ options.errorCallback(data.message);
|
|
|
}
|
|
|
- }).fail(errorCallback);
|
|
|
+ }).fail(options.errorCallback);
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.fetchStats = function(snippet, tableName, columnName, successCallback, errorCallback) {
|
|
|
- var self = this;
|
|
|
- var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string} options.databaseName
|
|
|
+ * @param {string} options.tableName
|
|
|
+ * @param {string} options.columnName
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchStats = function (options) {
|
|
|
$.ajax({
|
|
|
- url: "/" + app + "/api/table/" + self.activeDatabase() + "/" + tableName + "/stats/" + (columnName || ""),
|
|
|
+ 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: successCallback,
|
|
|
- error: errorCallback
|
|
|
+ success: options.successCallback,
|
|
|
+ error: options.errorCallback
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.fetchTerms = function(snippet, tableName, columnName, prefixFilter, successCallback, errorCallback) {
|
|
|
- var self = this;
|
|
|
- var app = snippet.type() == "hive" ? "beeswax" : snippet.type();
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {Object} [options.prefixFilter]
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string} options.databaseName
|
|
|
+ * @param {string} options.tableName
|
|
|
+ * @param {string} options.columnName
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchTerms = function (options) {
|
|
|
$.ajax({
|
|
|
- url: "/" + app + "/api/table/" + self.activeDatabase() + "/" + tableName + "/terms/" + columnName + "/" + (prefixFilter || ""),
|
|
|
+ url: "/" + options.sourceType + "/api/table/" + options.databaseName + "/" + options.tableName + "/terms/" + options.columnName + "/" + (options.prefixFilter || ""),
|
|
|
data: {},
|
|
|
beforeSend: function (xhr) {
|
|
|
xhr.setRequestHeader("X-Requested-With", "Hue");
|
|
|
},
|
|
|
dataType: "json",
|
|
|
- success: successCallback,
|
|
|
- error: errorCallback
|
|
|
+ success: options.successCallback,
|
|
|
+ error: options.errorCallback
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.fetchTables = function(snippet, database, successCallback, errorCallback) {
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string} options.databaseName
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchTables = function (options) {
|
|
|
var self = this;
|
|
|
- self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX + database, successCallback, errorCallback);
|
|
|
+ self.fetchAssistData(options.sourceType, API_PREFIX + options.databaseName, options.successCallback, options.errorCallback);
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.fetchFields = function(snippet, database, tableName, fields, successCallback, errorCallback, editor) {
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string} options.databaseName
|
|
|
+ * @param {string} options.tableName
|
|
|
+ * @param {string[]} options.fields
|
|
|
+ * @param {Object} [options.editor] - Ace editor
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchFields = function (options) {
|
|
|
var self = this;
|
|
|
-
|
|
|
var fieldPart = fields.length > 0 ? "/" + fields.join("/") : "";
|
|
|
- self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX + database + "/" + tableName + fieldPart, successCallback, errorCallback, editor);
|
|
|
+ self.fetchAssistData(options.sourceType, API_PREFIX + options.databaseName + "/" + options.tableName + fieldPart, options.successCallback, options.errorCallback, options.editor);
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.clearCache = function(snippet) {
|
|
|
- var self = this;
|
|
|
- $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(), {});
|
|
|
- };
|
|
|
-
|
|
|
- AssistHelper.prototype.fetchPanelData = function (snippet, hierarchy, successCallback, errorCallback) {
|
|
|
+ /**
|
|
|
+ * @param {Object} options
|
|
|
+ * @param {string} options.sourceType
|
|
|
+ * @param {string[]} options.hierarchy
|
|
|
+ * @param {function} options.successCallback
|
|
|
+ * @param {function} options.errorCallback
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchPanelData = function (options) {
|
|
|
var self = this;
|
|
|
- self.fetchAssistData(snippet, NOTEBOOK_API_PREFIX + hierarchy.join("/"), successCallback, errorCallback);
|
|
|
+ self.fetchAssistData(options.sourceType, API_PREFIX + options.hierarchy.join("/"), options.successCallback, options.errorCallback);
|
|
|
};
|
|
|
|
|
|
- AssistHelper.prototype.fetchAssistData = function (snippet, url, successCallback, errorCallback, editor) {
|
|
|
+ /**
|
|
|
+ * @param {string} sourceType
|
|
|
+ * @param {string} url
|
|
|
+ * @param {function} successCallback
|
|
|
+ * @param {function} errorCallback
|
|
|
+ * @param {Object} [editor] - Ace editor
|
|
|
+ */
|
|
|
+ AssistHelper.prototype.fetchAssistData = function (sourceType, url, successCallback, errorCallback, editor) {
|
|
|
var self = this;
|
|
|
- var cachedData = $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix()) || {};
|
|
|
+ if (!sourceType) { return };
|
|
|
+ var cachedData = $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(sourceType)) || {};
|
|
|
|
|
|
if (typeof cachedData[url] == "undefined" || self.hasExpired(cachedData[url].timestamp)) {
|
|
|
if (editor) {
|
|
|
editor.showSpinner();
|
|
|
}
|
|
|
$.post(url, {
|
|
|
- notebook: ko.mapping.toJSON(self.notebook.getContext()),
|
|
|
- snippet: ko.mapping.toJSON(snippet.getContext())
|
|
|
+ notebook: {},
|
|
|
+ snippet: ko.mapping.toJSON({
|
|
|
+ type: sourceType
|
|
|
+ })
|
|
|
}, function (data) {
|
|
|
if (data.status == 0) {
|
|
|
cachedData[url] = {
|
|
|
timestamp: (new Date()).getTime(),
|
|
|
data: data
|
|
|
};
|
|
|
- $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(), cachedData);
|
|
|
+ $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(sourceType), cachedData);
|
|
|
successCallback(data);
|
|
|
} else {
|
|
|
errorCallback(data);
|