浏览代码

HUE-6825 [autocomplete] Prevent exception when there's no identifierChain given for a table

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

+ 8 - 10
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -746,7 +746,7 @@ var AutocompleteResults = (function () {
         addSubQueryColumns(foundSubQuery.columns);
       }
       addColumnsDeferred.resolve();
-    } else {
+    } else if (typeof table.identifierChain !== 'undefined') {
       var callback = function (data) {
         if (data.extended_columns) {
           data.extended_columns.forEach(function (column) {
@@ -954,15 +954,13 @@ var AutocompleteResults = (function () {
         addColumnsDeferred.resolve();
       };
 
-      try {
-        if (self.parseResult.suggestColumns && self.parseResult.suggestColumns.identifierChain) {
-          self.fetchFieldsForIdentifiers(table.identifierChain.concat(self.parseResult.suggestColumns.identifierChain), callback, addColumnsDeferred.resolve);
-        } else {
-          self.fetchFieldsForIdentifiers(table.identifierChain, callback, addColumnsDeferred.resolve);
-        }
-      } catch (e) {
-        addColumnsDeferred.resolve();
-      } // TODO: Ignore for subqueries
+      if (self.parseResult.suggestColumns && self.parseResult.suggestColumns.identifierChain) {
+        self.fetchFieldsForIdentifiers(table.identifierChain.concat(self.parseResult.suggestColumns.identifierChain), callback, addColumnsDeferred.resolve);
+      } else {
+        self.fetchFieldsForIdentifiers(table.identifierChain, callback, addColumnsDeferred.resolve);
+      }
+    } else {
+      addColumnsDeferred.resolve();
     }
     return addColumnsDeferred;
   };

+ 19 - 1
desktop/core/src/desktop/static/desktop/spec/sqlAutocompleter3Spec.js

@@ -46,7 +46,6 @@
           AUTOCOMPLETE_TIMEOUT = 1;
           jasmine.Ajax.install();
 
-
           var failResponse = {
             status: 500
           };
@@ -385,6 +384,25 @@
         subject.autocomplete();
         expect(subject.suggestions.filtered().length).toBeGreaterThan(0);
       });
+
+      it('should suggest columns from subqueries', function () {
+        var subject = createSubject('hive', 'SELECT ', ' FROM customers, (SELECT app FROM web_logs) AS subQ;');
+        expect(subject.suggestions.filtered().length).toBe(0);
+        subject.autocomplete();
+        expect(subject.suggestions.filtered().length).toBeGreaterThan(0);
+
+        var appFound = false;
+
+        subject.suggestions.filtered().every(function (suggestion) {
+          if (suggestion.isColumn && suggestion.value === 'app') {
+            appFound = true;
+            return false;
+          }
+          return true;
+        });
+
+        expect(appFound).toBeTruthy();
+      })
     });
   });
 })();