浏览代码

HUE-1206 [beeswax] Table aliasing autocomplete

Support for magic table autocompletion
Enrico Berti 12 年之前
父节点
当前提交
94bb710

+ 11 - 0
apps/beeswax/src/beeswax/templates/execute.mako

@@ -729,7 +729,16 @@ ${layout.menubar(section='query')}
         var AUTOCOMPLETE_SET = CodeMirror.hiveQLHint;
       % endif
 
+      CodeMirror.onAutocomplete = function (data, from, to) {
+        if (CodeMirror.tableFieldMagic) {
+          codeMirror.replaceRange(" ", from, from);
+          codeMirror.setCursor(from);
+          codeMirror.execCommand("autocomplete");
+        }
+      };
+
       CodeMirror.commands.autocomplete = function (cm) {
+        tableMagic = false;
         if ($.totalStorage('tables_' + $("#id_query-database").val()) == null) {
           CodeMirror.showHint(cm, AUTOCOMPLETE_SET);
           getTables(function () {}); // if preload didn't work, tries again
@@ -739,6 +748,7 @@ ${layout.menubar(section='query')}
             CodeMirror.catalogTables = tables;
             var _before = codeMirror.getRange({line: 0, ch: 0}, {line: codeMirror.getCursor().line, ch: codeMirror.getCursor().ch}).replace(/(\r\n|\n|\r)/gm, " ");
             CodeMirror.possibleTable = false;
+            CodeMirror.tableFieldMagic = false;
             if (_before.toUpperCase().indexOf(" FROM ") > -1 && _before.toUpperCase().indexOf(" ON ") == -1 && _before.toUpperCase().indexOf(" WHERE ") == -1) {
               CodeMirror.possibleTable = true;
             }
@@ -772,6 +782,7 @@ ${layout.menubar(section='query')}
                 }
               }
               else {
+                CodeMirror.tableFieldMagic = true;
                 CodeMirror.showHint(cm, CodeMirror.hiveQLHint);
               }
             }

+ 8 - 0
desktop/core/static/js/Source/jHue/codemirror-hql-hint.js

@@ -60,6 +60,7 @@
   CodeMirror.catalogFields = "";
   CodeMirror.possibleTable = false;
   CodeMirror.possibleSoloField = false;
+  CodeMirror.tableFieldMagic = false;
 
   CodeMirror.hiveQLHint = function (editor) {
     return scriptHint(editor, hiveQLKeywordsU, function (e, cur) {
@@ -103,6 +104,13 @@
       }
       else {
         if (!CodeMirror.possibleTable) {
+          if (CodeMirror.tableFieldMagic) {
+            var _specialCatalogTablesL = CodeMirror.catalogTables.toLowerCase().split(" ");
+            for (var i = 0; i < _specialCatalogTablesL.length; i++) {
+              _specialCatalogTablesL[i] = "<i class='icon-magic'></i> FROM " + _specialCatalogTablesL[i];
+            }
+            forEach(_specialCatalogTablesL, maybeAddToExtra);
+          }
           if (CodeMirror.possibleSoloField) {
             forEach(catalogFieldsL, maybeAddToExtra);
           }

+ 8 - 0
desktop/core/static/js/Source/jHue/codemirror-isql-hint.js

@@ -60,6 +60,7 @@
   CodeMirror.catalogFields = "";
   CodeMirror.possibleTable = false;
   CodeMirror.possibleSoloField = false;
+  CodeMirror.tableFieldMagic = false;
 
   CodeMirror.impalaSQLHint = function (editor) {
     return scriptHint(editor, impalaSQLKeywordsU, function (e, cur) {
@@ -103,6 +104,13 @@
       }
       else {
         if (!CodeMirror.possibleTable) {
+          if (CodeMirror.tableFieldMagic) {
+            var _specialCatalogTablesL = CodeMirror.catalogTables.toLowerCase().split(" ");
+            for (var i = 0; i < _specialCatalogTablesL.length; i++) {
+              _specialCatalogTablesL[i] = "<i class='icon-magic'></i> FROM " + _specialCatalogTablesL[i];
+            }
+            forEach(_specialCatalogTablesL, maybeAddToExtra);
+          }
           if (CodeMirror.possibleSoloField) {
             forEach(catalogFieldsL, maybeAddToExtra);
           }

+ 3 - 0
desktop/core/static/js/Source/jHue/codemirror-show-hint.js

@@ -148,6 +148,9 @@ CodeMirror.showHint = function(cm, getHints, options) {
         }
       }
       cm.replaceRange(_insertion, data.from, data.to);
+      if (CodeMirror.onAutocomplete !== "undefined" && CodeMirror.onAutocomplete != null) {
+        CodeMirror.onAutocomplete(_insertion, data.from, data.to);
+      }
       close();
     }
     function strip(html){