Просмотр исходного кода

HUE-5448 [editor] The autocompleter should fetch columns in parallel to top columns

Johan Ahlen 9 лет назад
Родитель
Сommit
f5a184d
1 измененных файлов с 49 добавлено и 50 удалено
  1. 49 50
      desktop/core/src/desktop/static/desktop/js/sqlAutocompleter2.js

+ 49 - 50
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter2.js

@@ -452,6 +452,55 @@ var SqlAutocompleter2 = (function () {
     if (parseResult.suggestColumns) {
       var topColumnsDeferral = $.Deferred();
       deferrals.push(topColumnsDeferral);
+      var suggestColumnsDeferral = $.Deferred();
+      deferrals.push(suggestColumnsDeferral);
+      var mergeNavOptColDeferral = $.Deferred();
+      deferrals.push(mergeNavOptColDeferral);
+
+      $.when(topColumnsDeferral, suggestColumnsDeferral).then(function (topColumns, suggestions) {
+        if (topColumns.length > 0) {
+          suggestions.forEach(function (suggestion) {
+            var path = '';
+            if (!self.snippet.getApiHelper().isDatabase(suggestion.table.identifierChain[0].name, self.snippet.type())) {
+              path = database + '.';
+            }
+            path += $.map(suggestion.table.identifierChain, function (identifier) { return identifier.name }).join('.') + '.' + suggestion.value.replace(/[\[\]]/g, '');
+            for (var i = 0; i < topColumns.length; i++) {
+              // TODO: Switch to map once nav opt API is stable
+              if (path.toLowerCase().indexOf(topColumns[i].path.toLowerCase()) !== -1) {
+                suggestion.weight += Math.min(topColumns[i].columnCount, 99);
+                suggestion.meta = suggestion.meta + ' *';
+                suggestion.docHTML = self.createTopHtml(topColumns[i]);
+                break;
+              }
+            }
+          });
+        }
+        mergeNavOptColDeferral.resolve();
+      });
+
+      if (self.snippet.type() === 'hive' && /[^\.]$/.test(beforeCursor)) {
+        completions.push({value: 'BLOCK__OFFSET__INSIDE__FILE', meta: 'virtual', weight: DEFAULT_WEIGHTS.VIRTUAL_COLUMN});
+        completions.push({value: 'INPUT__FILE__NAME', meta: 'virtual', weight: DEFAULT_WEIGHTS.VIRTUAL_COLUMN});
+      }
+      if (parseResult.suggestColumns.types && parseResult.suggestColumns.types[0] === 'COLREF') {
+        colRefDeferral.done(function () {
+          parseResult.suggestColumns.tables.forEach(function (table) {
+            if (colRef !== null) {
+              deferrals.push(self.addColumns(parseResult, table, database, [colRef.type.toUpperCase()], columnSuggestions));
+            } else {
+              deferrals.push(self.addColumns(parseResult, table, database, ['T'], columnSuggestions));
+            }
+          });
+          suggestColumnsDeferral.resolve(columnSuggestions);
+        });
+      } else {
+        parseResult.suggestColumns.tables.forEach(function (table) {
+          deferrals.push(self.addColumns(parseResult, table, database, parseResult.suggestColumns.types || ['T'], columnSuggestions));
+        });
+        suggestColumnsDeferral.resolve(columnSuggestions);
+      }
+
       if (HAS_OPTIMIZER && typeof parseResult.suggestColumns.source !== 'undefined') {
         self.snippet.getApiHelper().fetchNavOptTopColumns({
           sourceType: self.snippet.type(),
@@ -488,56 +537,6 @@ var SqlAutocompleter2 = (function () {
       } else {
         topColumnsDeferral.resolve([]);
       }
-
-      var adjustNavWeights = function (suggestions, topColumns) {
-        if (topColumns.length === 0) {
-          return;
-        }
-        suggestions.forEach(function (suggestion) {
-          var path = '';
-          if (!self.snippet.getApiHelper().isDatabase(suggestion.table.identifierChain[0].name, self.snippet.type())) {
-            path = database + '.';
-          }
-          path += $.map(suggestion.table.identifierChain, function (identifier) { return identifier.name }).join('.') + '.' + suggestion.value.replace(/[\[\]]/g, '');
-          for (var i = 0; i < topColumns.length; i++) {
-            // TODO: Switch to map once nav opt API is stable
-            if (path.toLowerCase().indexOf(topColumns[i].path.toLowerCase()) !== -1) {
-              suggestion.weight += Math.min(topColumns[i].columnCount, 99);
-              suggestion.meta = suggestion.meta + ' *';
-              suggestion.docHTML = self.createTopHtml(topColumns[i]);
-              break;
-            }
-          }
-        });
-      };
-
-      var suggestColumnsDeferral = $.Deferred();
-      deferrals.push(suggestColumnsDeferral);
-      topColumnsDeferral.done(function (topColumns) {
-        if (self.snippet.type() === 'hive' && /[^\.]$/.test(beforeCursor)) {
-          completions.push({value: 'BLOCK__OFFSET__INSIDE__FILE', meta: 'virtual', weight: DEFAULT_WEIGHTS.VIRTUAL_COLUMN});
-          completions.push({value: 'INPUT__FILE__NAME', meta: 'virtual', weight: DEFAULT_WEIGHTS.VIRTUAL_COLUMN});
-        }
-        if (parseResult.suggestColumns.types && parseResult.suggestColumns.types[0] === 'COLREF') {
-          colRefDeferral.done(function () {
-            parseResult.suggestColumns.tables.forEach(function (table) {
-              if (colRef !== null) {
-                deferrals.push(self.addColumns(parseResult, table, database, [colRef.type.toUpperCase()], columnSuggestions));
-              } else {
-                deferrals.push(self.addColumns(parseResult, table, database, ['T'], columnSuggestions));
-              }
-            });
-            adjustNavWeights(columnSuggestions, topColumns);
-            suggestColumnsDeferral.resolve();
-          });
-        } else {
-          parseResult.suggestColumns.tables.forEach(function (table) {
-            deferrals.push(self.addColumns(parseResult, table, database, parseResult.suggestColumns.types || ['T'], columnSuggestions));
-          });
-          adjustNavWeights(columnSuggestions, topColumns);
-          suggestColumnsDeferral.resolve();
-        }
-      });
     }
 
     if (parseResult.suggestDatabases) {