ソースを参照

[notebook] Improved multi-snippet autocomplete

This takes care of an issue where all autocompleters are called for all snippets when editing a single snippet. With the Ace support for session autocompleters it will now only call the completer that belongs to the snippet.

This also allows us to drop some of the odd work-arounds, and I'v dropped the extraCompleters from the binding as it doesn't seem to be in use anymore.
Johan Ahlen 10 年 前
コミット
127332c

+ 14 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete.js

@@ -31,6 +31,20 @@ function Autocompleter(options) {
   self.assistHelper = options.assistHelper;
 }
 
+// ACE Format for autocompleter
+Autocompleter.prototype.getCompletions = function (editor, session, pos, prefix, callback) {
+  var self = this;
+
+  var before = editor.getTextBeforeCursor(";");
+  var after = editor.getTextAfterCursor(";");
+
+  editor.showSpinner();
+  self.autocomplete(before, after, function(result) {
+    editor.hideSpinner();
+    callback(null, result);
+  });
+};
+
 Autocompleter.prototype.callAutocompleteApi = function (tableName, nested, success, failure) {
   var self = this;
   var path = self.assistHelper.activeDatabase();

+ 4 - 55
desktop/core/src/desktop/static/desktop/js/ko.hue-bindings.js

@@ -1653,7 +1653,6 @@ ko.bindingHandlers.aceEditor = {
     var onPaste = options.onPaste || function () {};
     var onAfterExec = options.onAfterExec || function () {};
     var onExecute = options.onExecute || function () {};
-    var autocompleter = options.autocompleter;
     var assistHelper = options.assistHelper;
 
     $el.text(options.value());
@@ -1698,6 +1697,10 @@ ko.bindingHandlers.aceEditor = {
 
     editor.setOptions(editorOptions);
 
+    if (options.autocompleter) {
+      editor.session.setCompleters([options.autocompleter]);
+    }
+
     var placeHolderElement = null;
     var placeHolderVisible = false;
     if (options.placeholder) {
@@ -1907,53 +1910,6 @@ ko.bindingHandlers.aceEditor = {
       }
     });
 
-    function newCompleter(items) {
-      return {
-        getCompletions: function (editor, session, pos, prefix, callback) {
-          callback(null, items);
-        }
-      }
-    }
-
-    var originalCompleters = editor.completers.slice();
-
-    var sql_terms = /\b(FROM|TABLE|STATS|REFRESH|METADATA|DESCRIBE|ORDER BY|ON|WHERE|SELECT|LIMIT|GROUP|SORT)\b/g;
-
-    var refreshAutoComplete = function (callback) {
-      editor.completers = originalCompleters.slice();
-      if (options.extraCompleters && options.extraCompleters().length > 0) {
-        options.extraCompleters().forEach(function (complete) {
-          editor.completers.push(complete);
-        });
-      }
-
-      if (typeof autocompleter != "undefined" && autocompleter != null && (
-          editor.session.getMode().$id == "ace/mode/hive" ||
-          editor.session.getMode().$id == "ace/mode/impala" ||
-          editor.session.getMode().$id == "ace/mode/sql")) {
-        var before = editor.getTextBeforeCursor(";");
-        var after = editor.getTextAfterCursor(";");
-        editor.showSpinner();
-        autocompleter.autocomplete(before, after, function(result) {
-          editor.hideSpinner();
-          if (result.length > 0) {
-            editor.completers.push(newCompleter(result));
-          }
-          callback();
-        });
-      } else {
-        callback();
-      }
-    };
-
-    var originalExec = editor.commands.byName.startAutocomplete.exec;
-
-    editor.commands.byName.startAutocomplete.exec = function (editor) {
-      refreshAutoComplete(function() {
-        originalExec(editor);
-      });
-    };
-
     editor.previousSize = 0;
 
     window.setInterval(function(){
@@ -2063,7 +2019,6 @@ ko.bindingHandlers.aceEditor = {
     });
 
     editor.$blockScrolling = Infinity
-    element.originalCompleters = editor.completers;
     options.aceInstance(editor);
   },
   update: function (element, valueAccessor) {
@@ -2071,12 +2026,6 @@ ko.bindingHandlers.aceEditor = {
     if (options.aceInstance()) {
       var editor = options.aceInstance();
       editor.session.setMode(options.mode);
-      editor.completers = element.originalCompleters.slice();
-      if (options.extraCompleters && options.extraCompleters().length > 0) {
-        options.extraCompleters().forEach(function (complete) {
-          editor.completers.push(complete);
-        });
-      }
     }
   }
 };

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

@@ -143,7 +143,6 @@ var Snippet = function (vm, notebook, snippet) {
 
   //Ace stuff
   self.ace = ko.observable(null);
-  self.completers = ko.observableArray([]);
   self.errors = ko.observableArray([]);
 
   self.statement_raw = ko.observable(typeof snippet.statement_raw != "undefined" && snippet.statement_raw != null ? snippet.statement_raw : '');

+ 0 - 1
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -469,7 +469,6 @@ from desktop.views import _ko
           onExecute: execute,
           aceInstance: ace,
           mode: viewSettings().aceMode,
-          extraCompleters: completers,
           errors: errors,
           autocompleter: autocompleter,
           assistHelper: assistHelper,