瀏覽代碼

HUE-6495 [autocomplete] Add support for the Hive extract date function

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

+ 10 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql.jisonlex

@@ -86,6 +86,8 @@
 <hive>'CONCATENATE'                        { return '<hive>CONCATENATE'; }
 <hive>'DATA'                               { return '<hive>DATA'; }
 <hive>'DATABASES'                          { return '<hive>DATABASES'; }
+<hive>'DAY'                                { return '<hive>DAY'; }
+<hive>'DAYOFWEEK'                          { return '<hive>DAYOFWEEK'; }
 <hive>'DEFERRED'                           { return '<hive>DEFERRED'; }
 <hive>'DEFINED'                            { return '<hive>DEFINED'; }
 <hive>'DELIMITED'                          { return '<hive>DELIMITED'; }
@@ -107,6 +109,7 @@
 <hive>'FORMATTED'                          { return '<hive>FORMATTED'; }
 <hive>'FUNCTION'                           { return '<hive>FUNCTION'; }
 <hive>'FUNCTIONS'                          { return '<hive>FUNCTIONS'; }
+<hive>'HOUR'                               { return '<hive>HOUR'; }
 <hive>'IDXPROPERTIES'                      { return '<hive>IDXPROPERTIES'; }
 <hive>'INDEX'                              { return '<hive>INDEX'; }
 <hive>'INDEXES'                            { return '<hive>INDEXES'; }
@@ -121,6 +124,8 @@
 <hive>'LOCK'                               { return '<hive>LOCK'; }
 <hive>'LOCKS'                              { return '<hive>LOCKS'; }
 <hive>'METADATA'                           { return '<hive>METADATA'; }
+<hive>'MINUTE'                             { return '<hive>MINUTE'; }
+<hive>'MONTH'                              { return '<hive>MONTH'; }
 <hive>'MSCK'                               { return '<hive>MSCK'; }
 <hive>'NOSCAN'                             { return '<hive>NOSCAN'; }
 <hive>'NO_DROP'                            { return '<hive>NO_DROP'; }
@@ -134,6 +139,7 @@
 <hive>'PARTITIONS'                         { return '<hive>PARTITIONS'; }
 <hive>'PRIVILEGES'                         { return '<hive>PRIVILEGES'; }
 <hive>'PURGE'                              { return '<hive>PURGE'; }
+<hive>'QUARTER'                            { return '<hive>QUARTER'; }
 <hive>'RCFILE'                             { return '<hive>RCFILE'; }
 <hive>'REBUILD'                            { return '<hive>REBUILD'; }
 <hive>'RELOAD'                             { parser.determineCase(yytext); return '<hive>RELOAD'; }
@@ -145,6 +151,7 @@
 <hive>'RESTRICT'                           { return '<hive>RESTRICT'; }
 <hive>'ROLE'                               { return '<hive>ROLE'; }
 <hive>'ROLES'                              { return '<hive>ROLES'; }
+<hive>'SECOND'                             { return '<hive>SECOND'; }
 <hive>'SCHEMA'                             { return '<hive>SCHEMA'; }
 <hive>'SCHEMAS'                            { return '<hive>SCHEMAS'; }
 <hive>'SEQUENCEFILE'                       { return '<hive>SEQUENCEFILE'; }
@@ -175,7 +182,9 @@
 <hive>'UNIONTYPE'                          { return '<hive>UNIONTYPE'; }
 <hive>'USE'                                { parser.determineCase(yytext); return '<hive>USE'; }
 <hive>'VIEW'                               { return '<hive>VIEW'; }
+<hive>'WEEK'                               { return '<hive>WEEK'; }
 <hive>'WINDOW'                             { return '<hive>WINDOW'; }
+<hive>'YEAR'                               { return '<hive>YEAR'; }
 
 <hive>'.'                                  { return '<hive>.'; }
 <hive>'['                                  { return '<hive>['; }
@@ -386,6 +395,7 @@ VAR_SAMP\s*\(                              { yy.lexer.unput('('); yytext = 'var_
 <hive>CORR\s*\(                            { yy.lexer.unput('('); yytext = 'corr'; parser.addFunctionLocation(yylloc, yytext); return '<hive>CORR'; }
 <hive>COVAR_POP\s*\(                       { yy.lexer.unput('('); yytext = 'covar_pop'; parser.addFunctionLocation(yylloc, yytext); return '<hive>COVAR_POP'; }
 <hive>COVAR_SAMP\s*\(                      { yy.lexer.unput('('); yytext = 'covar_samp'; parser.addFunctionLocation(yylloc, yytext); return '<hive>COVAR_SAMP'; }
+<hive>EXTRACT\s*\(                         { yy.lexer.unput('('); yytext = 'extract'; parser.addFunctionLocation(yylloc, yytext); return '<hive>EXTRACT'; }
 <hive>HISTOGRAM_NUMERIC\s*\(               { yy.lexer.unput('('); yytext = 'histogram_numeric'; parser.addFunctionLocation(yylloc, yytext); return '<hive>HISTOGRAM_NUMERIC'; }
 <hive>NTILE\s*\(                           { yy.lexer.unput('('); yytext = 'ntile'; parser.addFunctionLocation(yylloc, yytext); return '<hive>NTILE'; }
 <hive>PERCENTILE\s*\(                      { yy.lexer.unput('('); yytext = 'percentile'; parser.addFunctionLocation(yylloc, yytext); return '<hive>PERCENTILE'; }

+ 61 - 5
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_main.jison

@@ -125,6 +125,15 @@ NonReservedKeyword
  | '<hive>UNIONTYPE'
  | '<hive>USE'
  | '<hive>VIEW'
+ | '<hive>DAY'
+ | '<hive>DAYOFWEEK'
+ | '<hive>HOUR'
+ | '<hive>MINUTE'
+ | '<hive>MONTH'
+ | '<hive>QUARTER'
+ | '<hive>SECOND'
+ | '<hive>WEEK'
+ | '<hive>YEAR'
 // | '<hive>ASC'      // These cause conflicts, we could use a separate lexer state for DESCRIBE, ALTER, GRANT, REVOKE and SHOW
 // | '<hive>CLUSTER'
 // | '<hive>DESC'
@@ -310,7 +319,7 @@ NonStartingToken
  | '<impala>AGGREGATE' | '<impala>AVRO' | '<impala>CACHED' | '<impala>CLOSE_FN' | '<impala>COLUMN' | '<impala>COMMENT' | '<impala>DATA' | '<impala>DATABASES' | '<impala>DELIMITED' | '<impala>ESCAPED' | '<impala>EXTENDED' |'<impala>EXTERNAL' | '<impala>FIELDS' | '<impala>FINALIZE_FN' | '<impala>FIRST' | '<impala>FORMAT' | '<impala>FORMATTED' | '<impala>FUNCTION' | '<impala>FUNCTIONS' | '<impala>GROUP' | '<impala>HASH' | '<impala>INCREMENTAL' | '<impala>INTERVAL' | '<impala>INIT_FN' | '<impala>INPATH' | '<impala>KEY' | '<impala>KUDU' | '<impala>LAST' | '<impala>LIMIT' | '<impala>LINES' | '<impala>LOCATION' | '<impala>MERGE_FN' | '<impala>NULLS' | '<impala>PARTITIONS' | '<impala>PREPARE_FN' | '<impala>PRIMARY' | '<impala>REAL' | '<impala>RETURNS' | '<impala>SCHEMAS' | '<impala>SERIALIZE_FN' | '<impala>SERVER' | '<impala>STATS' | '<impala>STRAIGHT_JOIN' | '<impala>SYMBOL' | '<impala>TABLE' | '<impala>TABLES' | '<impala>URI' | '<impala>USING' | '<impala>ANALYTIC' | '<impala>ANTI' | '<impala>CURRENT' | '<impala>GRANT' | '<impala>NOSHUFFLE' | '<impala>PARQUET' | '<impala>PARTITIONED' | '<impala>RCFILE' | '<impala>ROLE' | '<impala>ROLES' | '<impala>SEQUENCEFILE' | '<impala>SERDEPROPERTIES' | '<impala>SHUFFLE' | '<impala>STORED' | '<impala>TBLPROPERTIES' | '<impala>TERMINATED' | '<impala>TEXTFILE' | '<impala>UPDATE_FN' | '<impala>BROADCAST' | '<impala>...' | '<impala>.' | '<impala>[' | '<impala>]'
  | 'ALL' | 'AS' | 'ASC' | 'BETWEEN' | 'BIGINT' | 'BOOLEAN' | 'BY' | 'CASE' | 'CHAR' | 'CURRENT' | 'DATABASE' | 'DECIMAL' | 'DISTINCT' | 'DOUBLE' | 'DESC' | 'ELSE' | 'END' | 'EXISTS' | 'FALSE' | 'FLOAT' | 'FOLLOWING' | 'FROM' | 'FULL' | 'GROUP' | 'HAVING' | 'IF' | 'IN' | 'INNER' | 'INSERT' | 'INT' | 'INTO' | 'IS' | 'JOIN' | 'LEFT' | 'LIKE' | 'LIMIT' | 'NOT' | 'NULL' | 'ON' | 'OPTION' | 'ORDER' | 'OUTER' | 'OVER' | 'PARTITION' | 'PRECEDING' | 'RANGE' | 'REGEXP' | 'RIGHT' | 'RLIKE' | 'ROW' | 'ROWS' | 'SCHEMA' | 'SEMI' | 'SET' | 'SMALLINT' | 'STRING' | 'TABLE' | 'THEN' | 'TIMESTAMP' | 'TINYINT' | 'TRUE' | 'UNION' | 'VALUES' | 'VARCHAR' | 'WHEN' | 'WHERE' | 'WITH' | 'ROLE'
  | 'AVG' | 'CAST' | 'COUNT' | 'MAX' | 'MIN' | 'STDDEV_POP' | 'STDDEV_SAMP' | 'SUM' | 'VARIANCE' | 'VAR_POP' | 'VAR_SAMP'
- | '<hive>COLLECT_SET' | '<hive>COLLECT_LIST' | '<hive>CORR' | '<hive>COVAR_POP' | '<hive>COVAR_SAMP' | '<hive>HISTOGRAM_NUMERIC' | '<hive>NTILE' | '<hive>PERCENTILE' | '<hive>PERCENTILE_APPROX'
+ | '<hive>COLLECT_SET' | '<hive>COLLECT_LIST' | '<hive>CORR' | '<hive>COVAR_POP' | '<hive>COVAR_SAMP' | '<hive>DAY' | '<hive>DAYOFWEEK' | '<hive>HISTOGRAM_NUMERIC' | '<hive>HOUR' | '<hive>MINUTE' | '<hive>MONTH' | '<hive>NTILE' | '<hive>PERCENTILE' | '<hive>PERCENTILE_APPROX' | '<hive>QUARTER' | '<hive>SECOND' | '<hive>WEEK' | '<hive>YEAR'
  | '<impala>APPX_MEDIAN' | '<impala>EXTRACT' | '<impala>GROUP_CONCAT' | '<impala>STDDEV' | '<impala>VARIANCE_POP' | '<impala>VARIANCE_SAMP'
  | 'ANALYTIC'
  | 'UNSIGNED_INTEGER' | 'UNSIGNED_INTEGER_E' | 'REGULAR_IDENTIFIER' | 'HDFS_START_QUOTE' | 'AND' | 'OR' | '=' | '<' | '>' | 'COMPARISON_OPERATOR' | '-' | '*' | 'ARITHMETIC_OPERATOR' | ',' | '.' | '~' | '!' | '(' | ')' | '[' | ']' | 'VARIABLE_REFERENCE' | 'BACKTICK' | 'SINGLE_QUOTE' | 'DOUBLE_QUOTE'
@@ -2950,7 +2959,8 @@ UserDefinedFunction
    }
  | AnalyticFunction OverClause
  | CastFunction
- | ExtractFunction
+ | HiveExtractFunction
+ | ImpalaExtractFunction
  ;
 
 UserDefinedFunction_EDIT
@@ -2965,7 +2975,8 @@ UserDefinedFunction_EDIT
    }
  | AnalyticFunction OverClause_EDIT
  | CastFunction_EDIT
- | ExtractFunction_EDIT
+ | HiveExtractFunction_EDIT
+ | ImpalaExtractFunction_EDIT
  ;
 
 ArbitraryFunction
@@ -3402,6 +3413,51 @@ CountFunction_EDIT
    }
  ;
 
+HiveExtractFunction
+ : '<hive>EXTRACT' '(' HiveDateField 'FROM' ValueExpression ')'  -> { types: ['INT'] }
+ ;
+
+HiveExtractFunction_EDIT
+ : '<hive>EXTRACT' '(' AnyCursor RightParenthesisOrError
+   {
+     parser.suggestKeywords(['DAY', 'DAYOFWEEK', 'HOUR', 'MINUTE', 'MONTH', 'QUARTER', 'SECOND', 'WEEK', 'YEAR']);
+     $$ = { types: ['INT'] }
+   }
+ | '<hive>EXTRACT' '(' HiveDateField 'CURSOR' RightParenthesisOrError
+   {
+     parser.suggestKeywords(['FROM']);
+     $$ = { types: ['INT'] }
+   }
+ | '<hive>EXTRACT' '(' HiveDateField 'FROM' 'CURSOR' RightParenthesisOrError
+   {
+     parser.valueExpressionSuggest();
+     $$ = { types: ['INT'] }
+   }
+ | '<hive>EXTRACT' '(' HiveDateField 'FROM' ValueExpression_EDIT RightParenthesisOrError  -> { types: ['INT'] }
+ | '<hive>EXTRACT' '(' AnyCursor 'FROM' ValueExpression RightParenthesisOrError
+   {
+      parser.suggestKeywords(['DAY', 'DAYOFWEEK', 'HOUR', 'MINUTE', 'MONTH', 'QUARTER', 'SECOND', 'WEEK', 'YEAR']);
+      $$ = { types: ['INT'] }
+   }
+ | '<hive>EXTRACT' '(' HiveDateField 'CURSOR' ValueExpression RightParenthesisOrError
+   {
+     parser.suggestKeywords(['FROM']);
+     $$ = { types: ['INT'] }
+   }
+ ;
+
+HiveDateField
+ : '<hive>DAY'
+ | '<hive>DAYOFWEEK'
+ | '<hive>HOUR'
+ | '<hive>MINUTE'
+ | '<hive>MONTH'
+ | '<hive>QUARTER'
+ | '<hive>SECOND'
+ | '<hive>WEEK'
+ | '<hive>YEAR'
+ ;
+
 OtherAggregateFunction
  : OtherAggregateFunction_Type '(' OptionalAllOrDistinct ')'                      -> { types: parser.findReturnTypes($1) }
  | OtherAggregateFunction_Type '(' OptionalAllOrDistinct ValueExpressionList ')'  -> { types: parser.findReturnTypes($1) }
@@ -3481,12 +3537,12 @@ OtherAggregateFunction_Type
  | 'VAR_SAMP'
  ;
 
-ExtractFunction
+ImpalaExtractFunction
  : '<impala>EXTRACT' '(' ValueExpression FromOrComma ValueExpression ')'
  | '<impala>EXTRACT' '(' ')'
  ;
 
-ExtractFunction_EDIT
+ImpalaExtractFunction_EDIT
  : '<impala>EXTRACT' '(' AnyCursor FromOrComma ValueExpression RightParenthesisOrError
    {
      parser.valueExpressionSuggest();

文件差異過大導致無法顯示
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.js


+ 7 - 0
desktop/core/src/desktop/static/desktop/js/sqlFunctions.js

@@ -1362,6 +1362,13 @@ var SqlFunctions = (function () {
 				draggable: 'dayofmonth()',
         description: 'Returns the day part of a date or a timestamp string: dayofmonth(\'1970-11-01 00:00:00\') = 1, dayofmonth(\'1970-11-01\') = 1.'
       },
+      extract: {
+        returnTypes: ['INT'],
+        arguments: [[{type: 'T'}], [{type: 'T'}]],
+        signature: 'extract(field FROM source)',
+        draggable: 'extract()',
+        description: 'Retrieve fields such as days or hours from source (as of Hive 2.2.0). Source must be a date, timestamp, interval or a string that can be converted into either a date or timestamp. Supported fields include: day, dayofweek, hour, minute, month, quarter, second, week and year.'
+      },
       from_unixtime: {
         returnTypes: ['BIGINT'],
         arguments: [[{type: 'BIGINT'}], [{type: 'STRING', optional: true}]],

+ 41 - 5
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecSelect.js

@@ -1767,16 +1767,52 @@
         });
       });
 
-      it('should suggest columns for "SELECT extract(bla FROM | FROM bar;"', function() {
+      it('should suggest keywords for "SELECT extract(| FROM bar;"', function() {
         assertAutoComplete({
-          beforeCursor: 'SELECT extract(bla FROM ',
+          beforeCursor: 'SELECT extract( ',
           afterCursor: ' FROM bar;',
-          dialect: 'impala',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['DAY', 'DAYOFWEEK', 'HOUR', 'MINUTE', 'MONTH', 'QUARTER', 'SECOND', 'WEEK', 'YEAR']
+          }
+        });
+      });
+
+      it('should suggest keywords for "SELECT extract(month | FROM bar"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT extract(month ',
+          afterCursor: ' FROM bar;',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['FROM']
+          }
+        });
+      });
+
+      it('should suggest columns for "SELECT extract(month FROM | FROM bar;"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT extract(month FROM ',
+          afterCursor: ' FROM bar;',
+          dialect: 'hive',
           containsKeywords: ['CASE'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['TIMESTAMP'] },
-            suggestColumns: { source: 'select',  types: ['TIMESTAMP'], tables: [{ identifierChain: [{ name: 'bar' }] }] }
+            suggestFunctions: { },
+            suggestColumns: { source: 'select', tables: [{ identifierChain: [{ name: 'bar' }] }] }
+          }
+        });
+      });
+
+      it('should suggest keywords for "SELECT extract(| FROM boo) FROM bar;"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT extract( ',
+          afterCursor: ' FROM boo) FROM bar;',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['DAY', 'DAYOFWEEK', 'HOUR', 'MINUTE', 'MONTH', 'QUARTER', 'SECOND', 'WEEK', 'YEAR']
           }
         });
       });

部分文件因文件數量過多而無法顯示