Эх сурвалжийг харах

[core] Add HDFS autocomplete to Hive statements

Johan Ahlen 10 жил өмнө
parent
commit
3eb0f033ce

+ 5 - 3
desktop/core/src/desktop/static/desktop/js/autocompleter.js

@@ -37,14 +37,16 @@
     self.snippet = options.snippet;
 
     var initializeAutocompleter = function () {
+      var hdfsAutocompleter = new HdfsAutocompleter({
+        user: options.user
+      });
       if (self.snippet.isSqlDialect()) {
         self.autocompleter = new SqlAutocompleter({
+          hdfsAutocompleter: hdfsAutocompleter,
           snippet: options.snippet
         })
       } else {
-        self.autocompleter = new HdfsAutocompleter({
-          user: options.user
-        });
+        self.autocompleter = hdfsAutocompleter;
       }
     };
     self.snippet.type.subscribe(function () {

+ 29 - 1
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter.js

@@ -22,7 +22,7 @@
   }
 }(this, function () {
 
-  var SQL_TERMS = /\b(FROM|TABLE|STATS|REFRESH|METADATA|DESCRIBE|ORDER BY|JOIN|ON|WHERE|SELECT|LIMIT|GROUP BY|SORT|USE)\b/g;
+  var SQL_TERMS = /\b(FROM|TABLE|STATS|REFRESH|METADATA|DESCRIBE|ORDER BY|JOIN|ON|WHERE|SELECT|LIMIT|GROUP BY|SORT|USE|LOCATION)\b/g;
 
   /**
    * @param options {object}
@@ -33,6 +33,7 @@
   function SqlAutocompleter(options) {
     var self = this;
     self.snippet = options.snippet;
+    self.hdfsAutocompleter = options.hdfsAutocompleter;
 
     var initDatabases = function () {
       if (! self.snippet.getAssistHelper().loaded()) {
@@ -368,6 +369,33 @@
       return;
     }
 
+    if (keywordBeforeCursor === "LOCATION") {
+      var pathMatch = beforeCursor.match(/.*location\s+('[^']*)$/i);
+      if (pathMatch) {
+        var existingPath = pathMatch[1].length == 1 ? pathMatch[1] + "/" : pathMatch[1];
+        self.hdfsAutocompleter.autocomplete(existingPath, "", function (hdfsSuggestions) {
+          var addLeadingSlash = pathMatch[1].length == 1;
+          var addTrailingSlash = afterCursorU.length == 0 || afterCursorU[0] == "'";
+          var addTrailingApostrophe = afterCursorU.length == 0;
+          $.each(hdfsSuggestions, function (idx, hdfsSuggestion) {
+            if (addLeadingSlash) {
+              hdfsSuggestion.value = "/" + hdfsSuggestion.value;
+            }
+            if (addTrailingSlash && hdfsSuggestion.meta === "dir") {
+              hdfsSuggestion.value += "/";
+            }
+            if (addTrailingApostrophe && hdfsSuggestion.meta === "file") {
+              hdfsSuggestion.value += "'";
+            }
+          });
+          callback(hdfsSuggestions);
+        });
+      } else {
+        onFailure();
+      }
+      return;
+    }
+
     var tableNameAutoComplete = (keywordBeforeCursor === "FROM" ||
       keywordBeforeCursor === "TABLE" ||
       keywordBeforeCursor === "STATS" ||

+ 77 - 0
desktop/core/src/desktop/static/desktop/spec/sqlAutocompleterSpec.js

@@ -301,6 +301,83 @@ define([
         ajaxHelper.responseForUrls = {};
       });
 
+      describe("HDFS autocompletion", function () {
+        beforeEach(function() {
+          subject = new SqlAutocompleter({
+            hdfsAutocompleter: {
+              autocomplete: function(before, after, callback) {
+                callback([
+                  {
+                    meta: "file",
+                    score: 1000,
+                    value: "file_one"
+                  },
+                  {
+                    meta: "dir",
+                    score: 999,
+                    value: "folder_one"
+                  }
+                ])
+              }
+            },
+            snippet: snippet
+          });
+        });
+
+        it("should autocomplete hdfs paths in location references without initial /", function () {
+          var beforeCursor = "create external table foo (id int) location '";
+          var afterCursor = "";
+          assertAutoComplete({
+            serverResponses: {},
+            beforeCursor: "CREATE EXTERNAL TABLE foo (id int) LOCATION '",
+            afterCursor: "'",
+            expectedSuggestions: ["/file_one", "/folder_one/"]
+          });
+        });
+
+        it("should autocomplete hdfs paths in location references from root", function () {
+          var beforeCursor = "create external table foo (id int) location '";
+          var afterCursor = "";
+          subject.autocomplete(beforeCursor, afterCursor, function () {
+
+          });
+          assertAutoComplete({
+            serverResponses: {},
+            beforeCursor: "CREATE EXTERNAL TABLE foo (id int) LOCATION '/",
+            afterCursor: "'",
+            expectedSuggestions: ["file_one", "folder_one/"]
+          });
+        });
+
+        it("should autocomplete hdfs paths and suggest trailing apostrophe if empty after cursor", function () {
+          var beforeCursor = "create external table foo (id int) location '";
+          var afterCursor = "";
+          subject.autocomplete(beforeCursor, afterCursor, function () {
+
+          });
+          assertAutoComplete({
+            serverResponses: {},
+            beforeCursor: "CREATE EXTERNAL TABLE foo (id int) LOCATION '/",
+            afterCursor: "",
+            expectedSuggestions: ["file_one'", "folder_one/"]
+          });
+        });
+
+        it("should autocomplete hdfs paths in location references from inside a path", function () {
+          var beforeCursor = "create external table foo (id int) location '";
+          var afterCursor = "";
+          subject.autocomplete(beforeCursor, afterCursor, function () {
+
+          });
+          assertAutoComplete({
+            serverResponses: {},
+            beforeCursor: "CREATE EXTERNAL TABLE foo (id int) LOCATION '/",
+            afterCursor: "/bar'",
+            expectedSuggestions: ["file_one", "folder_one"]
+          });
+        });
+      });
+
       it("should suggest struct from map values", function() {
         assertAutoComplete({
           serverResponses: {