Explorar o código

HUE-9099 [frontend] Extend the Hive parser ORDER BY clause

Johan Ahlen %!s(int64=6) %!d(string=hai) anos
pai
achega
b0c1815872

+ 2 - 0
desktop/core/src/desktop/js/parse/jison/sql/hive/sql.jisonlex

@@ -96,6 +96,7 @@
 'NONE'                               { return 'NONE'; }
 'NOT'                                { return 'NOT'; }
 'NULL'                               { return 'NULL'; }
+'NULLS'                              { return 'NULLS'; }
 'OF'                                 { return 'OF'; }
 'ON'                                 { return 'ON'; }
 'OPTION'                             { return 'OPTION'; }
@@ -213,6 +214,7 @@ DOUBLE\s+PRECISION                   { return 'DOUBLE_PRECISION'; }
 'JSONFILE'                           { return 'JSONFILE'; }
 'KEY'                                { return 'KEY'; }
 'KEYS'                               { return 'KEYS'; }
+'LAST'                               { return 'LAST'; }
 'LITERAL'                            { return 'LITERAL'; }
 'LINES'                              { return 'LINES'; }
 'LOAD'                               { parser.determineCase(yytext); return 'LOAD'; }

+ 31 - 7
desktop/core/src/desktop/js/parse/jison/sql/hive/sql_main.jison

@@ -388,6 +388,7 @@ NonStartingToken
  | 'JSONFILE'
  | 'KEY'
  | 'KEYS'
+ | 'LAST'
  | 'LATERAL'
  | 'LEFT'
  | 'LIKE'
@@ -412,6 +413,7 @@ NonStartingToken
  | 'NOVALIDATE'
  | 'NTILE'
  | 'NULL'
+ | 'NULLS'
  | 'OF'
  | 'ON'
  | 'OPTION'
@@ -1986,32 +1988,54 @@ OrderByColumnList_EDIT
  ;
 
 OrderByIdentifier
- : ValueExpression OptionalAscOrDesc  -> parser.mergeSuggestKeywords($2)
+ : ValueExpression OptionalAscOrDesc OptionalNullsFirstOrLast
+   {
+     if ($2.suggestKeywords && $3.suggestKeywords) {
+       $$ = parser.mergeSuggestKeywords($2, $3);
+     } else {
+       $$ = parser.mergeSuggestKeywords($3);
+     }
+   }
  ;
 
 OrderByIdentifier_EDIT
- : ValueExpression_EDIT OptionalAscOrDesc
+ : ValueExpression_EDIT OptionalAscOrDesc OptionalNullsFirstOrLast
    {
      parser.suggestSelectListAliases();
    }
- | AnyCursor OptionalAscOrDesc
+ | AnyCursor OptionalAscOrDesc OptionalNullsFirstOrLast
    {
      $$ = { emptyOrderBy: true }
      parser.valueExpressionSuggest();
      parser.suggestAnalyticFunctions();
      parser.suggestSelectListAliases();
    }
+ | ValueExpression OptionalAscOrDesc NullsFirstOrLast_EDIT
  ;
 
 OptionalAscOrDesc
- :
-  {
-    $$ = { suggestKeywords: ['ASC', 'DESC'] };
-  }
+ :                          -> { suggestKeywords: ['ASC', 'DESC'] };
  | 'ASC'
  | 'DESC'
  ;
 
+OptionalNullsFirstOrLast
+ :                          -> { suggestKeywords: ['NULLS FIRST', 'NULLS LAST'] }
+ | NullsFirstOrLast
+ ;
+
+NullsFirstOrLast
+ : 'NULLS' 'FIRST'
+ | 'NULLS' 'LAST'
+ ;
+
+NullsFirstOrLast_EDIT
+ : 'NULLS' 'CURSOR'
+   {
+     parser.suggestKeywords(['FIRST', 'LAST']);
+   }
+ ;
+
 OptionalClusterOrDistributeBy
  :
  | ClusterOrDistributeBy

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
desktop/core/src/desktop/js/parse/sql/hive/hiveAutocompleteParser.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
desktop/core/src/desktop/js/parse/sql/hive/hiveSyntaxParser.js


+ 12 - 1
desktop/core/src/desktop/js/parse/sql/hive/test/hiveAutocompleteParser.Select.test.js

@@ -5613,12 +5613,23 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT * FROM database_two.testTable ORDER BY foo DESC, bar ',
         afterCursor: ', bla',
-        containsKeywords: ['ASC', 'DESC'],
+        containsKeywords: ['ASC', 'DESC', 'NULLS FIRST', 'NULLS LAST'],
         expectedResult: {
           lowerCase: false
         }
       });
     });
+
+    it('should suggest keywords for "SELECT * FROM database_two.testTable ORDER BY foo DESC, bar NULLS |, bla"', () => {
+      assertAutoComplete({
+        beforeCursor: 'SELECT * FROM database_two.testTable ORDER BY foo DESC, bar NULLS ',
+        afterCursor: ', bla',
+        expectedResult: {
+          lowerCase: false,
+          suggestKeywords: ['FIRST', 'LAST']
+        }
+      });
+    });
   });
 
   describe('CLUSTER BY, DISTRIBUTE BY and SORT BY', () => {

+ 10 - 2
desktop/core/src/desktop/js/parse/sql/sqlParserRepository.js

@@ -20,19 +20,27 @@
  */
 const AUTOCOMPLETE_MODULES = {
   calcite: () => import(/* webpackChunkName: "calcite-parser" */ 'parse/sql/calcite/calciteAutocompleteParser'),
+  druid: () => import(/* webpackChunkName: "druid-parser" */ 'parse/sql/druid/druidAutocompleteParser'),
+  elasticsearch: () => import(/* webpackChunkName: "elasticsearch-parser" */ 'parse/sql/elasticsearch/elasticsearchAutocompleteParser'),
   flink: () => import(/* webpackChunkName: "flink-parser" */ 'parse/sql/flink/flinkAutocompleteParser'),
   generic: () => import(/* webpackChunkName: "generic-parser" */ 'parse/sql/generic/genericAutocompleteParser'),
   hive: () => import(/* webpackChunkName: "hive-parser" */ 'parse/sql/hive/hiveAutocompleteParser'),
   impala: () => import(/* webpackChunkName: "impala-parser" */ 'parse/sql/impala/impalaAutocompleteParser'),
-  ksql: () => import(/* webpackChunkName: "ksql-parser" */ 'parse/sql/ksql/ksqlAutocompleteParser')
+  ksql: () => import(/* webpackChunkName: "ksql-parser" */ 'parse/sql/ksql/ksqlAutocompleteParser'),
+  phoenix: () => import(/* webpackChunkName: "phoenix-parser" */ 'parse/sql/phoenix/phoenixAutocompleteParser'),
+  presto: () => import(/* webpackChunkName: "presto-parser" */ 'parse/sql/presto/prestoAutocompleteParser')
 };
 const SYNTAX_MODULES = {
   calcite: () => import(/* webpackChunkName: "calcite-parser" */ 'parse/sql/calcite/calciteSyntaxParser'),
+  druid: () => import(/* webpackChunkName: "druid-parser" */ 'parse/sql/druid/druidSyntaxParser'),
+  elasticsearch: () => import(/* webpackChunkName: "elasticsearch-parser" */ 'parse/sql/elasticsearch/elasticsearchSyntaxParser'),
   flink: () => import(/* webpackChunkName: "flink-parser" */ 'parse/sql/flink/flinkSyntaxParser'),
   generic: () => import(/* webpackChunkName: "generic-parser" */ 'parse/sql/generic/genericSyntaxParser'),
   hive: () => import(/* webpackChunkName: "hive-parser" */ 'parse/sql/hive/hiveSyntaxParser'),
   impala: () => import(/* webpackChunkName: "impala-parser" */ 'parse/sql/impala/impalaSyntaxParser'),
-  ksql: () => import(/* webpackChunkName: "ksql-parser" */ 'parse/sql/ksql/ksqlSyntaxParser')
+  ksql: () => import(/* webpackChunkName: "ksql-parser" */ 'parse/sql/ksql/ksqlSyntaxParser'),
+  phoenix: () => import(/* webpackChunkName: "phoenix-parser" */ 'parse/sql/phoenix/phoenixSyntaxParser'),
+  presto: () => import(/* webpackChunkName: "presto-parser" */ 'parse/sql/presto/prestoSyntaxParser')
 };
 /* eslint-enable */
 

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio