浏览代码

HUE-8655 [editor] Have the location handler wait for a compute and namespace to be set

Johan Ahlen 7 年之前
父节点
当前提交
b3ea40d

+ 13 - 7
desktop/core/src/desktop/static/desktop/js/ko.hue-bindings.js

@@ -5104,18 +5104,24 @@
         locationWorkerSub.remove();
         locationWorkerSub.remove();
       });
       });
 
 
+      var lastContextRequest;
       var statementSubscription = huePubSub.subscribe('editor.active.statement.changed', function (statementDetails) {
       var statementSubscription = huePubSub.subscribe('editor.active.statement.changed', function (statementDetails) {
         if (statementDetails.id !== self.editorId) {
         if (statementDetails.id !== self.editorId) {
           return;
           return;
         }
         }
         if (self.snippet.type() === 'hive' || self.snippet.type() === 'impala') {
         if (self.snippet.type() === 'hive' || self.snippet.type() === 'impala') {
-          huePubSub.publish('ace.sql.location.worker.post', {
-            id: self.snippet.id(),
-            statementDetails: statementDetails,
-            type: self.snippet.type(),
-            namespace: self.snippet.namespace(),
-            compute: self.snippet.compute(),
-            defaultDatabase: self.snippet.database()
+          if (lastContextRequest) {
+            lastContextRequest.dispose();
+          }
+          lastContextRequest = self.snippet.whenContextSet().done(function () {
+            huePubSub.publish('ace.sql.location.worker.post', {
+              id: self.snippet.id(),
+              statementDetails: statementDetails,
+              type: self.snippet.type(),
+              namespace: self.snippet.namespace(),
+              compute: self.snippet.compute(),
+              defaultDatabase: self.snippet.database()
+            })
           });
           });
         }
         }
       });
       });

+ 4 - 50
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -1688,55 +1688,6 @@ var SqlAutocompleter3 = (function () {
     }
     }
   };
   };
 
 
-  /**
-   * Waits for the snippet to have a compute and namespace set, this prevents js exceptions and garbled editor
-   * output when autocomplete is triggered while loading the context.
-   *
-   * @return {Promise}
-   */
-  SqlAutocompleter3.prototype.whenContextSet = function () {
-    var self = this;
-
-    // Fail any queued requests, only the last update should succeed
-    if (self.computeDeferred) {
-      self.computeDeferred.reject();
-    }
-    if (self.namespaceDeferred) {
-      self.namespaceDeferred.reject();
-    }
-    if (self.waitForNamespaceSub) {
-      self.waitForNamespaceSub.dispose();
-    }
-    if (self.waitForComputeSub) {
-      self.waitForComputeSub.dispose();
-    }
-
-    self.computeDeferred = $.Deferred();
-    if (self.snippet.compute()) {
-      self.computeDeferred.resolve();
-    } else {
-      self.waitForComputeSub = self.snippet.compute.subscribe(function (newVal) {
-        if (newVal) {
-          self.computeDeferred.resolve();
-          self.waitForComputeSub.dispose();
-        }
-      })
-    }
-
-    self.namespaceDeferred = $.Deferred();
-    if (self.snippet.namespace()) {
-      self.namespaceDeferred.resolve();
-    } else {
-      self.waitForNamespaceSub = self.snippet.namespace.subscribe(function (newVal) {
-        if (newVal) {
-          self.namespaceDeferred.resolve();
-          self.waitForNamespaceSub.dispose();
-        }
-      })
-    }
-    return $.when(self.computeDeferred, self.namespaceDeferred);
-  };
-
   SqlAutocompleter3.prototype.autocomplete = function () {
   SqlAutocompleter3.prototype.autocomplete = function () {
     var self = this;
     var self = this;
     var parseResult;
     var parseResult;
@@ -1776,7 +1727,10 @@ var SqlAutocompleter3 = (function () {
       huePubSub.publish('hue.ace.autocompleter.done');
       huePubSub.publish('hue.ace.autocompleter.done');
     } else {
     } else {
       try {
       try {
-        self.whenContextSet().done(function () {
+        if (self.lastContextRequest) {
+          self.lastContextRequest.dispose();
+        }
+        self.lastContextRequest = self.snippet.whenContextSet().done(function () {
           self.suggestions.update(parseResult);
           self.suggestions.update(parseResult);
         }).fail(function () {
         }).fail(function () {
           huePubSub.publish('hue.ace.autocompleter.done');
           huePubSub.publish('hue.ace.autocompleter.done');

+ 6 - 0
desktop/core/src/desktop/static/desktop/spec/sqlAutocompleter3Spec.js

@@ -34,6 +34,9 @@
           },
           },
           compute: function () {
           compute: function () {
             return { id: 'defaultCompute' }
             return { id: 'defaultCompute' }
+          },
+          whenContextSet: function () {
+            return $.Deferred().resolve();
           }
           }
         },
         },
         editor: function () {
         editor: function () {
@@ -431,6 +434,9 @@
             compute: function () {
             compute: function () {
               return { id: 'defaultCompute' }
               return { id: 'defaultCompute' }
             },
             },
+            whenContextSet: function () {
+              return $.Deferred().resolve();
+            },
             positionStatement: ko.observable(positionStatement)
             positionStatement: ko.observable(positionStatement)
           },
           },
           editor: function () {
           editor: function () {

+ 42 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -388,6 +388,48 @@ var EditorViewModel = (function() {
     self.namespace = ko.observable(snippet.namespace && snippet.namespace.id ? snippet.namespace : undefined);
     self.namespace = ko.observable(snippet.namespace && snippet.namespace.id ? snippet.namespace : undefined);
     self.compute = ko.observable(snippet.compute && snippet.compute.id ? snippet.compute : undefined);
     self.compute = ko.observable(snippet.compute && snippet.compute.id ? snippet.compute : undefined);
 
 
+    self.whenContextSet = function () {
+      var namespaceSub;
+      var namespaceDeferred = $.Deferred();
+      if (self.namespace()) {
+        namespaceDeferred.resolve(self.namespace());
+      } else {
+        namespaceSub = self.namespace.subscribe(function (newVal) {
+          if (newVal) {
+            namespaceDeferred.resolve(newVal);
+            namespaceSub.dispose();
+          }
+        })
+      }
+      var computeSub;
+      var computeDeferred = $.Deferred();
+      if (self.compute()) {
+        computeDeferred.resolve(self.compute());
+      } else {
+        computeSub = self.compute.subscribe(function (newVal) {
+          if (newVal) {
+            computeDeferred.resolve(newVal);
+            computeSub.dispose();
+          }
+        })
+      }
+
+      var result = $.when(namespaceDeferred, computeDeferred);
+
+      result.dispose = function () {
+        if (namespaceSub) {
+          namespaceSub.dispose();
+        }
+        if (computeSub) {
+          computeSub.dispose();
+        }
+        namespaceDeferred.reject();
+        computeDeferred.reject();
+      };
+
+      return result;
+    };
+
     self.availableDatabases = ko.observableArray();
     self.availableDatabases = ko.observableArray();
     self.database = ko.observable();
     self.database = ko.observable();
     var previousDatabase = null;
     var previousDatabase = null;