浏览代码

HUE-5736 [autocomplete] Cancel any running API requests when closing the autocompleter

Johan Ahlen 8 年之前
父节点
当前提交
96a64df21f

+ 13 - 13
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -397,7 +397,7 @@ var ApiHelper = (function () {
         self.assistErrorCallback(options)({ status: -1 });
         return;
       }
-      $.ajax({
+      return $.ajax({
         dataType: "json",
         url: url,
         timeout: options.timeout,
@@ -420,7 +420,7 @@ var ApiHelper = (function () {
       });
     };
 
-    fetchCached.bind(self)($.extend({}, options, {
+    return fetchCached.bind(self)($.extend({}, options, {
       sourceType: 'hdfs',
       url: url,
       fetchFunction: fetchFunction
@@ -1206,7 +1206,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchTables = function (options) {
     var self = this;
-    fetchAssistData.bind(self)($.extend({}, options, {
+    return fetchAssistData.bind(self)($.extend({}, options, {
       url: AUTOCOMPLETE_API_PREFIX + options.databaseName,
       errorCallback: self.assistErrorCallback(options),
       cacheCondition: genericCacheCondition
@@ -1229,7 +1229,7 @@ var ApiHelper = (function () {
   ApiHelper.prototype.fetchFields = function (options) {
     var self = this;
     var fieldPart = options.fields.length > 0 ? "/" + options.fields.join("/") : "";
-    fetchAssistData.bind(self)($.extend({}, options, {
+    return fetchAssistData.bind(self)($.extend({}, options, {
       url: AUTOCOMPLETE_API_PREFIX + options.databaseName + "/" + options.tableName + fieldPart,
       errorCallback: self.assistErrorCallback(options),
       cacheCondition: genericCacheCondition
@@ -1596,7 +1596,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchNavOptTopTables = function (options) {
     var self = this;
-    self.fetchNavOptCached(NAV_OPT_URLS.TOP_TABLES, options, function (data) {
+    return self.fetchNavOptCached(NAV_OPT_URLS.TOP_TABLES, options, function (data) {
       return data.status === 0;
     });
   };
@@ -1617,7 +1617,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchNavOptTopColumns = function (options) {
     var self = this;
-    self.fetchNavOptCached(NAV_OPT_URLS.TOP_COLUMNS, options, function (data) {
+    return self.fetchNavOptCached(NAV_OPT_URLS.TOP_COLUMNS, options, function (data) {
       return data.status === 0;
     });
   };
@@ -1638,7 +1638,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchNavOptPopularJoins = function (options) {
     var self = this;
-    self.fetchNavOptCached(NAV_OPT_URLS.TOP_JOINS, options, function (data) {
+    return self.fetchNavOptCached(NAV_OPT_URLS.TOP_JOINS, options, function (data) {
       return data.status === 0;
     });
   };
@@ -1659,7 +1659,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchNavOptTopFilters = function (options) {
     var self = this;
-    self.fetchNavOptCached(NAV_OPT_URLS.TOP_FILTERS, options, function (data) {
+    return self.fetchNavOptCached(NAV_OPT_URLS.TOP_FILTERS, options, function (data) {
       return data.status === 0;
     });
   };
@@ -1681,7 +1681,7 @@ var ApiHelper = (function () {
    */
   ApiHelper.prototype.fetchNavOptTopAggs = function (options) {
     var self = this;
-    self.fetchNavOptCached(NAV_OPT_URLS.TOP_AGGS, options, function (data) {
+    return self.fetchNavOptCached(NAV_OPT_URLS.TOP_AGGS, options, function (data) {
       return data.status === 0;
     });
   };
@@ -1725,7 +1725,7 @@ var ApiHelper = (function () {
         return;
       }
 
-      $.ajax({
+      return $.ajax({
         type: 'post',
         url: url,
         data: data,
@@ -1744,7 +1744,7 @@ var ApiHelper = (function () {
       .fail(promise.reject);
     };
 
-    fetchCached.bind(self)($.extend({}, options, {
+    return fetchCached.bind(self)($.extend({}, options, {
       url: url,
       hash: hash,
       cacheType: 'optimizer',
@@ -1869,7 +1869,7 @@ var ApiHelper = (function () {
       return;
     }
 
-    $.ajax({
+    return $.ajax({
       type: 'POST',
       url: options.url,
       data: {
@@ -1925,7 +1925,7 @@ var ApiHelper = (function () {
       if (typeof options.editor !== 'undefined' && options.editor !== null) {
         options.editor.showSpinner();
       }
-      options.fetchFunction(function (data) {
+      return options.fetchFunction(function (data) {
         cachedData[cachedId] = {
           timestamp: (new Date()).getTime(),
           data: data

+ 20 - 11
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -101,6 +101,7 @@ var AutocompleteResults = (function () {
 
     self.entries = ko.observableArray();
 
+    self.lastKnownRequests = {};
     self.activeDeferrals = [];
 
     self.loadingKeywords = ko.observable(false);
@@ -242,6 +243,14 @@ var AutocompleteResults = (function () {
     }).extend({ rateLimit: 200 });
   }
 
+  AutocompleteResults.prototype.cancelRequests = function () {
+    var self = this;
+
+    Object.keys(self.lastKnownRequests).forEach(function (key) {
+      self.apiHelper.cancelActiveRequest(self.lastKnownRequests[key]);
+    });
+  };
+
   AutocompleteResults.prototype.update = function (parseResult) {
     var self = this;
 
@@ -558,7 +567,7 @@ var AutocompleteResults = (function () {
         }
 
         var database = suggestTables.identifierChain && suggestTables.identifierChain.length === 1 ? suggestTables.identifierChain[0].name : self.activeDatabase;
-        self.apiHelper.fetchTables({
+        self.lastKnownRequests.fetchTables = self.apiHelper.fetchTables({
           sourceType: self.snippet.type(),
           databaseName: database,
           successCallback: function (data) {
@@ -1050,7 +1059,7 @@ var AutocompleteResults = (function () {
       // Last one is either partial name or empty
       parts.pop();
 
-      self.apiHelper.fetchHdfsPath({
+      self.lastKnownRequests.fetchHdfsPath = self.apiHelper.fetchHdfsPath({
         pathParts: parts,
         successCallback: function (data) {
           if (!data.error) {
@@ -1088,7 +1097,7 @@ var AutocompleteResults = (function () {
       initLoading(self.loadingJoins, joinsDeferred);
       joinsDeferred.done(self.appendEntries);
 
-      self.apiHelper.fetchNavOptPopularJoins({
+      self.lastKnownRequests.fetchNavOptPopularJoins = self.apiHelper.fetchNavOptPopularJoins({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1165,7 +1174,7 @@ var AutocompleteResults = (function () {
       initLoading(self.loadingJoinConditions, joinConditionsDeferred);
       joinConditionsDeferred.done(self.appendEntries);
 
-      self.apiHelper.fetchNavOptPopularJoins({
+      self.lastKnownRequests.fetchNavOptPopularJoins = self.apiHelper.fetchNavOptPopularJoins({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1220,7 +1229,7 @@ var AutocompleteResults = (function () {
       initLoading(self.loadingAggregateFunctions, aggregateFunctionsDeferred);
       aggregateFunctionsDeferred.done(self.appendEntries);
 
-      self.apiHelper.fetchNavOptTopAggs({
+      self.lastKnownRequests.fetchNavOptTopAggs = self.apiHelper.fetchNavOptTopAggs({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1301,7 +1310,7 @@ var AutocompleteResults = (function () {
       initLoading(self.loadingGroupBys, groupBysDeferred);
       groupBysDeferred.done(self.appendEntries);
 
-      self.apiHelper.fetchNavOptTopColumns({
+      self.lastKnownRequests.fetchNavOptTopColumns = self.apiHelper.fetchNavOptTopColumns({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1343,7 +1352,7 @@ var AutocompleteResults = (function () {
       initLoading(self.loadingOrderBys, orderBysDeferred);
       orderBysDeferred.done(self.appendEntries);
 
-      self.apiHelper.fetchNavOptTopColumns({
+      self.lastKnownRequests.fetchNavOptTopColumns = self.apiHelper.fetchNavOptTopColumns({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1384,7 +1393,7 @@ var AutocompleteResults = (function () {
       initLoading(self.loadingFilters, filtersDeferred);
       filtersDeferred.done(self.appendEntries);
 
-      self.apiHelper.fetchNavOptTopFilters({
+      self.lastKnownRequests.fetchNavOptTopFilters = self.apiHelper.fetchNavOptTopFilters({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1446,7 +1455,7 @@ var AutocompleteResults = (function () {
         && self.parseResult.suggestTables.identifierChain.length === 1
         && self.parseResult.suggestTables.identifierChain[0].name ? self.parseResult.suggestTables.identifierChain[0].name : self.activeDatabase;
 
-      self.apiHelper.fetchNavOptTopTables({
+      self.lastKnownRequests.fetchNavOptTopTables = self.apiHelper.fetchNavOptTopTables({
         database: db,
         sourceType: self.snippet.type(),
         silenceErrors: true,
@@ -1498,7 +1507,7 @@ var AutocompleteResults = (function () {
     if (HAS_OPTIMIZER && suggestColumns && suggestColumns.source !== 'undefined') {
       initLoading(self.loadingPopularColumns, popularColumnsDeferred);
 
-      self.apiHelper.fetchNavOptTopColumns({
+      self.lastKnownRequests.fetchNavOptTopColumns = self.apiHelper.fetchNavOptTopColumns({
         sourceType: self.snippet.type(),
         timeout: AUTOCOMPLETE_TIMEOUT,
         defaultDatabase: self.activeDatabase,
@@ -1676,7 +1685,7 @@ var AutocompleteResults = (function () {
         identifierChain = identifierChain.slice(1);
       }
 
-      self.apiHelper.fetchFields({
+      self.lastKnownRequests.fetchFields = self.apiHelper.fetchFields({
         sourceType: self.snippet.type(),
         databaseName: database,
         tableName: table,

+ 2 - 1
desktop/core/src/desktop/templates/hue_ace_autocompleter.mako

@@ -364,7 +364,7 @@ from desktop.views import _ko
         self.changeListener = function () {
           window.clearTimeout(changeTimeout);
           var cursor = self.editor().selection.lead;
-          if (cursor.row != self.base.row || cursor.column < self.base.column) {
+          if (cursor.row !== self.base.row || cursor.column < self.base.column) {
             self.detach();
           } else {
             changeTimeout = window.setTimeout(function () {
@@ -403,6 +403,7 @@ from desktop.views import _ko
         };
 
         self.detach = function () {
+          self.suggestions.cancelRequests();
           disposeEventHanders();
           if (!self.active()) {
             return;