浏览代码

HUE-6835 [autocomplete] Add support for Impala IS DISTINCT FROM

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

+ 32 - 7
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_valueExpression.jison

@@ -25,14 +25,15 @@ ValueExpression
      // verifyType($2, 'BOOLEAN');
      $$ = { types: [ 'BOOLEAN' ] };
    }
- | '~' ValueExpression                                                              -> $2
+ | '~' ValueExpression                                                 -> $2
  | '-' ValueExpression %prec NEGATION
    {
      // verifyType($2, 'NUMBER');
      $$ = $2;
      $2.types = ['NUMBER'];
    }
- | ValueExpression 'IS' OptionalNot 'NULL'              -> { types: [ 'BOOLEAN' ] }
+ | ValueExpression 'IS' OptionalNot 'NULL'                             -> { types: [ 'BOOLEAN' ] }
+ | ValueExpression 'IS' OptionalNot 'DISTINCT' 'FROM' ValueExpression  -> { types: [ 'BOOLEAN' ] }
  ;
 
 ValueExpression_EDIT
@@ -71,14 +72,29 @@ ValueExpression_EDIT
      parser.suggestColumns({ types: [ 'NUMBER' ] });
      $$ = { types: [ 'NUMBER' ] };
    }
+ | ValueExpression 'IS' 'CURSOR'
+   {
+     if (parser.isImpala()) {
+       parser.suggestKeywords(['DISTINCT FROM', 'NOT DISTINCT FROM', 'NOT NULL', 'NULL']);
+     } else {
+       parser.suggestKeywords(['NOT NULL', 'NULL']);
+     }
+     $$ = { types: [ 'BOOLEAN' ] };
+   }
  | ValueExpression 'IS' 'NOT' 'CURSOR'
-    {
-      parser.suggestKeywords(['NULL']);
+   {
+     if (parser.isImpala()) {
+       parser.suggestKeywords(['DISTINCT FROM', 'NULL']);
+     } else {
+       parser.suggestKeywords(['NULL']);
+     }
       $$ = { types: [ 'BOOLEAN' ] };
-    }
- | ValueExpression 'IS' 'CURSOR'
+   }
+ | ValueExpression 'IS' OptionalNot 'DISTINCT' 'CURSOR'
    {
-     parser.suggestKeywords(['NOT NULL', 'NULL']);
+     if (parser.isImpala()) {
+       parser.suggestKeywords(['FROM']);
+     }
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression 'IS' 'CURSOR' 'NULL'
@@ -86,6 +102,15 @@ ValueExpression_EDIT
      parser.suggestKeywords(['NOT']);
      $$ = { types: [ 'BOOLEAN' ] };
    }
+ | ValueExpression 'IS' OptionalNot 'DISTINCT' 'FROM' PartialBacktickedOrAnyCursor
+   {
+     parser.valueExpressionSuggest($1, $3 ? 'IS NOT DISTINCT FROM' : 'IS DISTINCT FROM');
+     $$ = { types: [ 'BOOLEAN' ] };
+   }
+ | ValueExpression 'IS' OptionalNot 'DISTINCT' 'FROM' ValueExpression_EDIT
+   {
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $6.suggestFilters }
+   }
  ;
 
 // ------------------  EXISTS and parenthesized ------------------

+ 102 - 4
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSpecSelect.js

@@ -4550,9 +4550,9 @@
         assertAutoComplete({
           beforeCursor: 'SELECT * FROM foo WHERE id IS ',
           afterCursor: '',
+          containsKeywords: ['NOT NULL', 'NULL'],
           expectedResult: {
-            lowerCase: false,
-            suggestKeywords: ['NOT NULL', 'NULL']
+            lowerCase: false
           }
         });
       });
@@ -4561,9 +4561,9 @@
         assertAutoComplete({
           beforeCursor: 'SELECT * FROM foo WHERE id IS NOT ',
           afterCursor: '',
+          containsKeywords: ['NULL'],
           expectedResult: {
-            lowerCase: false,
-            suggestKeywords: ['NULL']
+            lowerCase: false
           }
         });
       });
@@ -4717,6 +4717,104 @@
         });
       });
 
+      describe('Impala specific', function () {
+        it('should handle functions for "SELECT 1 IS DISTINCT FROM 2; |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 IS DISTINCT FROM 2; ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['SELECT'],
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+
+        it('should handle functions for "SELECT 1 IS NOT DISTINCT FROM 2; |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 IS NOT DISTINCT FROM 2; ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['SELECT'],
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+
+        it('should suggest keywords for "SELECT 1 |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['IS DISTINCT FROM'],
+            expectedResult: {
+              lowerCase: false,
+              suggestTables: { prependFrom: true },
+              suggestDatabases: { prependFrom: true, appendDot: true }
+            }
+          });
+        });
+
+        it('should suggest keywords for "SELECT 1 IS |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 IS ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['DISTINCT FROM', 'NOT DISTINCT FROM'],
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+
+        it('should suggest keywords for "SELECT 1 IS NOT |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 IS NOT ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['DISTINCT FROM'],
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+
+        it('should suggest keywords for "SELECT 1 IS DISTINCT |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 IS DISTINCT ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            expectedResult: {
+              lowerCase: false,
+              suggestKeywords: ['FROM']
+            }
+          });
+        });
+
+        it('should suggest columns for "SELECT 1 IS DISTINCT FROM | FROM tbl"', function () {
+          assertAutoComplete({
+            beforeCursor: 'SELECT 1 IS DISTINCT FROM ',
+            afterCursor: ' FROM tbl',
+            dialect: 'impala',
+            noErrors: true,
+            expectedResult: {
+              lowerCase: false,
+              suggestKeywords: ['FROM'],
+              suggestColumns: { types: ['NUMBER'], source: 'select', tables: [{ identifierChain: [{ name: 'tbl' }] }] },
+              suggestFunctions: { types: ['NUMBER'] },
+              suggestKeywords: ['CASE', 'NULL']
+            }
+          });
+        });
+      });
+
       describe('Hive specific', function () {
         it('should suggest functions for "SELECT 100Y = |"', function () {
           assertAutoComplete({

文件差异内容过多而无法显示
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlAutocompleteParser.js


+ 4 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlParseSupport.js

@@ -203,6 +203,10 @@ var SqlParseSupport = (function () {
       var types = valueExpression.lastType ? valueExpression.lastType.types : valueExpression.types;
       // We could have valueExpression.columnReference to suggest based on column type
       var keywords = ['<', '<=', '<=>', '<>', '=', '>', '>=', 'BETWEEN', 'IN', 'IS NOT NULL', 'IS NULL', 'NOT BETWEEN', 'NOT IN'];
+      if (parser.isImpala()) {
+        keywords.push('IS DISTINCT FROM');
+        keywords.push('IS NOT DISTINCT FROM');
+      }
       if (extras) {
         keywords = keywords.concat(extras);
       }

文件差异内容过多而无法显示
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlSyntaxParser.js


部分文件因为文件数量过多而无法显示