Эх сурвалжийг харах

HUE-7463 [autocomplete] Improve location handling for map and array column references in Hive

Johan Ahlen 8 жил өмнө
parent
commit
b5ecaf3ad1

+ 13 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_alter.jison

@@ -370,6 +370,9 @@ OptionalPartitionOperations
  | '<hive>COMPACT' QuotedValue OptionalAndWait OptionalWithOverwriteTblProperties
  | HiveEnableOrDisable HiveNoDropOrOffline
  | AnyChange OptionalHiveColumn ColumnIdentifier ColumnSpecification OptionalHiveFirstOrAfter OptionalHiveCascadeOrRestrict
+   {
+     parser.addColumnLocation($3.location, [ $3.identifier ]);
+   }
  ;
 
 OptionalPartitionOperations_EDIT
@@ -382,6 +385,9 @@ OptionalPartitionOperations_EDIT
      parser.suggestColumns();
    }
  | AnyChange OptionalHiveColumn ColumnIdentifier ColumnSpecification_EDIT OptionalHiveFirstOrAfter OptionalHiveCascadeOrRestrict
+   {
+     parser.addColumnLocation($3.location, [ $3.identifier ]);
+   }
  | AnyChange OptionalHiveColumn ColumnIdentifier ColumnSpecification OptionalHiveFirstOrAfter OptionalHiveCascadeOrRestrict 'CURSOR'
    {
      if (parser.isHive() && !$5 && !$6) {
@@ -395,8 +401,12 @@ OptionalPartitionOperations_EDIT
      } else if (parser.isHive() && $5 && !$6) {
        parser.suggestKeywords(['CASCADE', 'RESTRICT']);
      }
+     parser.addColumnLocation($3.location, [ $3.identifier ]);
    }
  | AnyChange OptionalHiveColumn ColumnIdentifier ColumnSpecification OptionalHiveFirstOrAfter_EDIT OptionalHiveCascadeOrRestrict
+   {
+     parser.addColumnLocation($3.location, [ $3.identifier ]);
+   }
  | '<hive>COMPACT' QuotedValue OptionalAndWait OptionalWithOverwriteTblProperties 'CURSOR'
    {
      if (!$3 && !$4) {
@@ -535,6 +545,9 @@ DropOperations
  | 'DROP' OptionalIfExists '<impala>RANGE' 'PARTITION' RangePartitionSpec
  | 'DROP' OptionalIfExists '<impala>RANGE' '<impala>PARTITION_VALUE' '=' UnsignedValueSpecification
  | 'DROP' '<impala>COLUMN' ColumnIdentifier
+   {
+     parser.addColumnLocation($3.location, [ $3.identifier ]);
+   }
  ;
 
 DropOperations_EDIT

+ 22 - 18
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_main.jison

@@ -1026,8 +1026,8 @@ ColumnReference_EDIT
 BasicIdentifierChain
  : ColumnIdentifier
    {
-     $$ = [$1];
-     parser.yy.firstChainLocation = parser.addUnknownLocation(@1, [$1]);
+     $$ = [ $1.identifier ];
+     parser.yy.firstChainLocation = parser.addUnknownLocation($1.location, [ $1.identifier ]);
    }
  | BasicIdentifierChain AnyDot ColumnIdentifier
    {
@@ -1035,8 +1035,8 @@ BasicIdentifierChain
        parser.yy.firstChainLocation.firstInChain = true;
        delete parser.yy.firstChainLocation;
      }
-     $1.push($3);
-     parser.addUnknownLocation(@3, $1.concat());
+     $1.push($3.identifier);
+     parser.addUnknownLocation($3.location, $1.concat());
    }
  ;
 
@@ -1045,7 +1045,7 @@ BasicIdentifierChain_EDIT
  : ColumnIdentifier_EDIT
    {
      if ($1.insideKey) {
-       parser.suggestKeyValues({ identifierChain: [{ name: $1.name }] });
+       parser.suggestKeyValues({ identifierChain: [ $1.identifier ] });
        parser.suggestColumns();
        parser.suggestFunctions();
      }
@@ -1053,7 +1053,7 @@ BasicIdentifierChain_EDIT
  | BasicIdentifierChain AnyDot ColumnIdentifier_EDIT
    {
      if ($3.insideKey) {
-       parser.suggestKeyValues({ identifierChain: $1.concat({ name: $3.name }) });
+       parser.suggestKeyValues({ identifierChain: $1.concat([ $3.identifier ]) });
        parser.suggestColumns();
        parser.suggestFunctions();
      }
@@ -1077,10 +1077,10 @@ BasicIdentifierChain_EDIT
  ;
 
 DerivedColumnChain
- : ColumnIdentifier  -> [ $1 ]
+ : ColumnIdentifier  -> [ $1.identifier ]
  | DerivedColumnChain AnyDot ColumnIdentifier
    {
-     $1.push($3);
+     $1.push($3.identifier);
    }
  ;
 
@@ -1088,7 +1088,7 @@ DerivedColumnChain_EDIT
  : ColumnIdentifier_EDIT
    {
      if ($1.insideKey) {
-       parser.suggestKeyValues({ identifierChain: [{ name: $1.name }] });
+       parser.suggestKeyValues({ identifierChain: [ $1.identifier ] });
        parser.suggestColumns();
        parser.suggestFunctions();
      }
@@ -1096,7 +1096,7 @@ DerivedColumnChain_EDIT
  | DerivedColumnChain AnyDot ColumnIdentifier_EDIT
    {
      if ($3.insideKey) {
-       parser.suggestKeyValues({ identifierChain: $1.concat({ name: $3.name }) });
+       parser.suggestKeyValues({ identifierChain: $1.concat([ $3.identifier ]) });
        parser.suggestColumns();
        parser.suggestFunctions();
      }
@@ -1104,7 +1104,7 @@ DerivedColumnChain_EDIT
  | DerivedColumnChain AnyDot ColumnIdentifier_EDIT AnyDot DerivedColumnChain
    {
      if ($3.insideKey) {
-       parser.suggestKeyValues({ identifierChain: $1.concat({ name: $3.name }) });
+       parser.suggestKeyValues({ identifierChain: $1.concat([ $3.identifier ]) });
        parser.suggestColumns();
        parser.suggestFunctions();
      }
@@ -1112,7 +1112,7 @@ DerivedColumnChain_EDIT
  | ColumnIdentifier_EDIT AnyDot DerivedColumnChain
    {
      if ($1.insideKey) {
-       parser.suggestKeyValues({ identifierChain: [{ name: $1.name }] });
+       parser.suggestKeyValues({ identifierChain: [ $1.identifier ] });
        parser.suggestColumns();
        parser.suggestFunctions();
      }
@@ -1136,14 +1136,14 @@ DerivedColumnChain_EDIT
  ;
 
 ColumnIdentifier
- : RegularOrBacktickedIdentifier                                                                               -> { name: $1 };
- | RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket ValueExpression HiveOrImpalaRightSquareBracket  -> { name: $1, keySet: true }
- | RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket HiveOrImpalaRightSquareBracket                  -> { name: $1, keySet: true }
+ : RegularOrBacktickedIdentifier                                                                               -> { identifier: { name: $1 }, location: @1 };
+ | RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket ValueExpression HiveOrImpalaRightSquareBracket  -> { identifier: { name: $1, keySet: true }, location: @1 }
+ | RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket HiveOrImpalaRightSquareBracket                  -> { identifier: { name: $1, keySet: true }, location: @1 }
  ;
 
 ColumnIdentifier_EDIT
- : RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket AnyCursor HiveOrImpalaRightSquareBracketOrError             -> { name: $1, insideKey: true }
- | RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket ValueExpression_EDIT HiveOrImpalaRightSquareBracketOrError  -> { name: $1 };
+ : RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket AnyCursor HiveOrImpalaRightSquareBracketOrError             -> { identifier: { name: $1 }, insideKey: true }
+ | RegularOrBacktickedIdentifier HiveOrImpalaLeftSquareBracket ValueExpression_EDIT HiveOrImpalaRightSquareBracketOrError  -> { identifier: { name: $1 }};
  ;
 
 PartialBacktickedIdentifierOrPartialCursor
@@ -2266,7 +2266,11 @@ SortByList_EDIT
  ;
 
 SortByIdentifier
- : ColumnIdentifier OptionalAscOrDesc  -> $2
+ : ColumnIdentifier OptionalAscOrDesc
+   {
+     parser.addColumnLocation($1.location, [ $1.identifier ]);
+     $$ = $2;
+   }
  ;
 
 SortByIdentifier_EDIT

+ 18 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSpecLocations.js

@@ -35,6 +35,24 @@
       });
     };
 
+    it('should report locations for "SELECT * FROM tbl WHERE tbl.mp[\'key\'].bla;"', function () {
+      assertLocations({
+        beforeCursor: 'SELECT * FROM tbl WHERE tbl.mp[\'key\'].bla; ',
+        dialect: 'hive',
+        expectedLocations: [
+          { type: 'statement', location: { first_line: 1, last_line: 1, first_column: 1, last_column: 42 } },
+          { type: 'selectList', missing: false, location: { first_line: 1, last_line: 1, first_column: 8, last_column: 9 } },
+          { type: 'asterisk', location: { first_line: 1, last_line: 1, first_column: 8, last_column: 9 }, tables: [{ identifierChain: [{ name: 'tbl' }] }] },
+          { type: 'table', location: { first_line: 1, last_line: 1, first_column: 15, last_column: 18 }, identifierChain: [{ name: 'tbl' }] },
+          { type: 'whereClause', missing: false, location: { first_line: 1, last_line: 1, first_column: 19, last_column: 42 } },
+          { type: 'table', location: { first_line: 1, last_line: 1, first_column: 25, last_column: 28 }, identifierChain: [{ name: 'tbl' }] },
+          { type: 'column', location: { first_line: 1, last_line: 1, first_column: 29, last_column: 31 }, identifierChain: [{ name: 'mp', keySet: true }], qualified: true, tables: [{ identifierChain: [{ name: 'tbl' }] }] },
+          { type: 'complex', location: { first_line: 1, last_line: 1, first_column: 39, last_column: 42 }, identifierChain: [{ name: 'mp', keySet: true }, { name: 'bla' }], qualified: true, tables: [{ identifierChain: [{ name: 'tbl' }] }] },
+          { type: 'limitClause', missing: true, location: { first_line: 1, last_line: 1, first_column: 42, last_column: 42 } }
+        ]
+      });
+    });
+
     it('should report locations for "WITH boo AS (SELECT * FROM tbl) SELECT * FROM boo; |"', function() {
       assertLocations({
         beforeCursor: 'WITH boo AS (SELECT * FROM tbl) SELECT * FROM boo; ',

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlAutocompleteParser.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlSyntaxParser.js


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно