Jelajahi Sumber

HUE-4031 [editor] Follow case when suggesting syntax error corrections

Johan Ahlen 8 tahun lalu
induk
melakukan
2d06dce

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

@@ -58,12 +58,23 @@
       expect(result.expected.length).toBeGreaterThan(0);
     });
 
+    it ('should find errors for "select * form ', function () {
+      var result = sqlSyntaxParser.parseSyntax('select * form ', '', 'hive', true);
+      expect(result).toBeTruthy();
+    });
+
     it('should suggest expected words for "SLELECT "', function() {
       var result = sqlSyntaxParser.parseSyntax('SLELECT ', '');
       expect(result).toBeTruthy();
       expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'SET', 'ALTER', 'INSERT', 'CREATE', 'SHOW', 'USE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH']);
     });
 
+    it('should suggest expected words for "slelect "', function() {
+      var result = sqlSyntaxParser.parseSyntax('slelect ', '');
+      expect(result).toBeTruthy();
+      expect(expectedToStrings(result.expected)).toEqual(['select', 'set', 'alter', 'insert', 'create', 'show', 'use', 'drop', 'from', 'truncate', 'update', 'with']);
+    });
+
     describe('Hive specific', function () {
       it('should suggest expected words for "SLELECT "', function() {
         var result = sqlSyntaxParser.parseSyntax('SLELECT ', '', 'hive');

+ 12 - 2
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlParseSupport.js

@@ -1548,6 +1548,13 @@ var SqlParseSupport = (function () {
       // Empty for compatibility with the autocomplete parser
     };
 
+    parser.determineCase = function (text) {
+      if (!parser.yy.caseDetermined) {
+        parser.yy.lowerCase = text.toLowerCase() === text;
+        parser.yy.caseDetermined = true;
+      }
+    };
+
     var lexerModified = false;
 
     parser.yy.parseError = function (str, hash) {
@@ -1560,6 +1567,7 @@ var SqlParseSupport = (function () {
     };
 
     parser.parseSyntax = function (beforeCursor, afterCursor, dialect, debug) {
+      parser.yy.caseDetermined = false;
       parser.yy.error = undefined;
 
       parser.yy.activeDialect = (dialect !== 'hive' && dialect !== 'impala') ? undefined : dialect;
@@ -1590,19 +1598,21 @@ var SqlParseSupport = (function () {
       }
       if (parser.yy.error && !beforeCursor.endsWith(parser.yy.error.text)) {
         var weightedExpected = [];
+
+        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);
           if (!IGNORED_EXPECTED[expected]) {
             if (expected.length > 0 && expected.indexOf('<') !== 0) {
               weightedExpected.push({
-                text: expected,
+                text: isLowerCase ? expected.toLowerCase() : expected,
                 distance: stringDistance(parser.yy.error.text, expected, true)
               });
             } else if (dialect && expected.indexOf('<' + dialect + '>') == 0) {
               var dialectTrimmed = expected.substring(dialect.length + 2);
               weightedExpected.push({
-                text: dialectTrimmed,
+                text: isLowerCase ? dialectTrimmed.toLowerCase() : dialectTrimmed,
                 distance: stringDistance(parser.yy.error.text, dialectTrimmed, true)
               });
             }