瀏覽代碼

HUE-4031 [editor] Prevent duplicate syntax suggestions when a dialect is specified

Johan Ahlen 8 年之前
父節點
當前提交
362c27ef27

+ 3 - 3
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSyntaxParserSpec.js

@@ -15,7 +15,7 @@
 // limitations under the License.
 
 (function () {
-  describe('sqlSyntaxParser.js', function() {
+  fdescribe('sqlSyntaxParser.js', function() {
 
     var expectedToStrings = function (expected) {
       return $.map(expected, function(ex) { return ex.text; })
@@ -103,7 +103,7 @@
       it('should suggest expected words for "SLELECT "', function() {
         var result = sqlSyntaxParser.parseSyntax('SLELECT ', '', 'hive');
         expect(result).toBeTruthy();
-        expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'DELETE', 'SET', 'ALTER', 'INSERT', 'INSERT', 'RELOAD', 'ANALYZE', 'CREATE', 'CREATE', 'EXPLAIN', 'EXPORT', 'GRANT', 'IMPORT', 'LOAD', 'MSCK', 'REVOKE', 'SHOW', 'SHOW', 'USE', 'USE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH', 'DESCRIBE']);
+        expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'DELETE', 'SET', 'ALTER', 'INSERT', 'RELOAD', 'ANALYZE', 'CREATE', 'EXPLAIN', 'EXPORT', 'GRANT', 'IMPORT', 'LOAD', 'MSCK', 'REVOKE', 'SHOW', 'USE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH', 'DESCRIBE']);
       });
     });
 
@@ -111,7 +111,7 @@
       it('should suggest expected words for "SLELECT "', function() {
         var result = sqlSyntaxParser.parseSyntax('SLELECT ', '', 'impala');
         expect(result).toBeTruthy();
-        expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'SET', 'ALTER', 'INSERT', 'INSERT', 'CREATE', 'CREATE', 'EXPLAIN', 'GRANT', 'LOAD', 'REFRESH', 'REVOKE', 'SHOW', 'USE', 'COMPUTE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH', 'DESCRIBE', 'INVALIDATE']);
+        expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'SET', 'ALTER', 'INSERT', 'CREATE', 'EXPLAIN', 'GRANT', 'LOAD', 'REFRESH', 'REVOKE', 'SHOW', 'USE', 'COMPUTE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH', 'DESCRIBE', 'INVALIDATE']);
       });
     })
 

+ 10 - 6
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlParseSupport.js

@@ -1619,22 +1619,26 @@ var SqlParseSupport = (function () {
       if (parser.yy.error && (parser.yy.error.loc.last_column < beforeCursor.length || !beforeCursor.endsWith(parser.yy.error.text))) {
         var weightedExpected = [];
 
+        var addedExpected = {};
+
         var isLowerCase = parser.yy.caseDetermined && parser.yy.lowerCase || parser.yy.error.text.toLowerCase() === parser.yy.error.text;
         parser.yy.error.expected.forEach(function (expected) {
           // Strip away the surrounding ' chars
           expected = expected.substring(1, expected.length - 1);
           // TODO: Only suggest alphanumeric?
           if (!IGNORED_EXPECTED[expected] && /[a-z_]+/i.test(expected)) {
+            var text = null;
             if (expected.length > 0 && expected.indexOf('<') !== 0) {
-              weightedExpected.push({
-                text: isLowerCase ? expected.toLowerCase() : expected,
-                distance: stringDistance(parser.yy.error.text, expected, true)
-              });
+              text = isLowerCase ? expected.toLowerCase() : expected;
             } else if (dialect && expected.indexOf('<' + dialect + '>') == 0) {
               var dialectTrimmed = expected.substring(dialect.length + 2);
+              text = isLowerCase ? dialectTrimmed.toLowerCase() : dialectTrimmed;
+            }
+            if (text && !addedExpected[text]) {
+              addedExpected[text] = true;
               weightedExpected.push({
-                text: isLowerCase ? dialectTrimmed.toLowerCase() : dialectTrimmed,
-                distance: stringDistance(parser.yy.error.text, dialectTrimmed, true)
+                text: text,
+                distance: stringDistance(parser.yy.error.text, text, true)
               });
             }
           }