瀏覽代碼

HUE-4031 [editor] Pre-calculate distances to improve performance

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

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

@@ -17,6 +17,10 @@
 (function () {
   describe('sqlSyntaxParser.js', function() {
 
+    var expectedToStrings = function (expected) {
+      return $.map(expected, function(ex) { return ex.text; })
+    };
+
     it('should not find errors for ""', function () {
       var result = sqlSyntaxParser.parseSyntax('', '');
       expect(result).toBeFalsy();
@@ -57,14 +61,14 @@
     it('should suggest expected words for "SLELECT "', function() {
       var result = sqlSyntaxParser.parseSyntax('SLELECT ', '');
       expect(result).toBeTruthy();
-      expect(result.expected).toEqual(['SELECT', 'SET', 'INSERT', 'ALTER', 'CREATE', 'SHOW', 'USE', 'WITH', 'FROM', 'DROP', 'TRUNCATE', 'UPDATE']);
+      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');
         expect(result).toBeTruthy();
-        expect(result.expected).toEqual(['SELECT', 'SET', 'DELETE', 'RELOAD', 'INSERT', 'ALTER', 'INSERT', 'CREATE', 'EXPORT', 'GRANT', 'SHOW', 'LOAD', 'IMPORT', 'EXPLAIN', 'CREATE', 'REVOKE', 'MSCK', 'ANALYZE', 'SHOW', 'USE', 'USE', 'TRUNCATE', 'DROP', 'UPDATE', 'WITH', 'FROM', 'DESCRIBE']);
+        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']);
       });
     });
 
@@ -72,7 +76,7 @@
       it('should suggest expected words for "SLELECT "', function() {
         var result = sqlSyntaxParser.parseSyntax('SLELECT ', '', 'impala');
         expect(result).toBeTruthy();
-        expect(result.expected).toEqual(['SELECT', 'SET', 'INSERT', 'ALTER', 'INSERT', 'GRANT', 'CREATE', 'CREATE', 'REVOKE', 'EXPLAIN', 'SHOW', 'USE', 'REFRESH', 'LOAD', 'COMPUTE', 'TRUNCATE', 'UPDATE', 'WITH', 'FROM', 'DROP', 'INVALIDATE', 'DESCRIBE']);
+        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']);
       });
     })
 

+ 13 - 8
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlParseSupport.js

@@ -1589,24 +1589,29 @@ var SqlParseSupport = (function () {
         }
       }
       if (parser.yy.error && !beforeCursor.endsWith(parser.yy.error.text)) {
-
-        var cleanExpected = [];
+        var weightedExpected = [];
         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) {
-              cleanExpected.push(expected);
+              weightedExpected.push({
+                text: expected,
+                distance: stringDistance(parser.yy.error.text, expected, true)
+              });
             } else if (dialect && expected.indexOf('<' + dialect + '>') == 0) {
-              cleanExpected.push(expected.substring(dialect.length + 2));
+              var dialectTrimmed = expected.substring(dialect.length + 2);
+              weightedExpected.push({
+                text: dialectTrimmed,
+                distance: stringDistance(parser.yy.error.text, dialectTrimmed, true)
+              });
             }
           }
         });
-        cleanExpected.sort(function (a, b) {
-          // TODO: Possible performance boost when initializing the distances algorithm given parser.yy.error.text
-          return stringDistance(parser.yy.error.text, a, true) - stringDistance(parser.yy.error.text, b, true);
+        weightedExpected.sort(function (a, b) {
+          return a.distance - b.distance
         });
-        parser.yy.error.expected = cleanExpected;
+        parser.yy.error.expected = weightedExpected;
         return parser.yy.error;
       }
       return false;

+ 1 - 1
desktop/core/src/desktop/static/desktop/js/ko.hue-bindings.js

@@ -4147,7 +4147,7 @@
                 }, 500);
               } else if (token !== null && token.syntaxError) {
                 tooltipTimeout = window.setTimeout(function () {
-                  var tooltipText = 'Did you mean "' + token.syntaxError.expected[0] + '"?';
+                  var tooltipText = 'Did you mean "' + token.syntaxError.expected[0].text + '"?';
                   var endCoordinates = editor.renderer.textToScreenCoordinates(pointerPosition.row, token.start);
                   contextTooltip.show(tooltipText, endCoordinates.pageX, endCoordinates.pageY + editor.renderer.lineHeight + 3);
                 }, 500);