Browse Source

HUE-6835 [autocomplete] Add support for Impala STRAIGHT_JOIN keyword in select statements

Johan Ahlen 8 years ago
parent
commit
8a528ba6b8

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

@@ -33,16 +33,16 @@ SqlStatement_EDIT
  ;
  ;
 
 
 SelectStatement
 SelectStatement
- : 'SELECT' OptionalAllOrDistinct SelectList_ERROR TableExpression
- | 'SELECT' OptionalAllOrDistinct SelectList TableExpression_ERROR
+ : 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList_ERROR TableExpression
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList TableExpression_ERROR
  ;
  ;
 
 
 SelectStatement_EDIT
 SelectStatement_EDIT
- : 'SELECT' OptionalAllOrDistinct SelectList_ERROR_EDIT TableExpression
+ : 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList_ERROR_EDIT TableExpression
    {
    {
-     parser.selectListNoTableSuggest($3, $2);
+     parser.selectListNoTableSuggest($4, $2);
    }
    }
- | 'SELECT' OptionalAllOrDistinct SelectList_ERROR TableExpression_EDIT
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList_ERROR TableExpression_EDIT
  ;
  ;
 
 
 SelectList_ERROR
 SelectList_ERROR

+ 14 - 17
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_insert.jison

@@ -327,35 +327,32 @@ OptionalInsertRowFormat_EDIT
  ;
  ;
 
 
 SelectWithoutTableExpression
 SelectWithoutTableExpression
- : 'SELECT' OptionalAllOrDistinct SelectList  -> { selectList: $3 }
+ : 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList  -> { selectList: $4 }
  ;
  ;
 
 
 SelectWithoutTableExpression_EDIT
 SelectWithoutTableExpression_EDIT
- : 'SELECT' OptionalAllOrDistinct SelectList 'CURSOR'
+ : 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList 'CURSOR'
    {
    {
-     $$ = $3;
+     $$ = $4;
      $$.cursorAtEnd = true;
      $$.cursorAtEnd = true;
    }
    }
- | 'SELECT' OptionalAllOrDistinct SelectList_EDIT
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList_EDIT
    {
    {
-     parser.selectListNoTableSuggest($3, $2);
+     parser.selectListNoTableSuggest($4, $2);
    }
    }
- | 'SELECT' OptionalAllOrDistinct 'CURSOR'
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin 'CURSOR'
    {
    {
-     var keywords = [];
-     if ($2) {
-       keywords = [{ value: '*', weight: 1000 }];
-       if ($2 === 'ALL') {
-         parser.suggestAggregateFunctions();
-         parser.suggestAnalyticFunctions();
-       }
-     } else {
-       keywords = [{ value: '*', weight: 1000 }, 'ALL', 'DISTINCT'];
+     var keywords = [{ value: '*', weight: 10000 }];
+     if (!$2 || $2 === 'ALL') {
        parser.suggestAggregateFunctions();
        parser.suggestAggregateFunctions();
        parser.suggestAnalyticFunctions();
        parser.suggestAnalyticFunctions();
      }
      }
-     if (parser.isImpala()) {
-       keywords.push('STRAIGHT_JOIN');
+     if (!$3 && !$2) {
+       keywords.push({ value: 'ALL', weight: 2 });
+       keywords.push({ value: 'DISTINCT', weight: 2 });
+     }
+     if (parser.isImpala() && !$3) {
+       keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
      }
      }
      parser.suggestKeywords(keywords);
      parser.suggestKeywords(keywords);
      parser.suggestFunctions();
      parser.suggestFunctions();

+ 48 - 50
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_main.jison

@@ -1278,8 +1278,8 @@ QuerySpecification_EDIT
  ;
  ;
 
 
 SelectStatement
 SelectStatement
- : 'SELECT' OptionalAllOrDistinct SelectList                  -> { selectList: $3 }
- | 'SELECT' OptionalAllOrDistinct SelectList TableExpression  -> { selectList: $3, tableExpression: $4 }
+ : 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList                  -> { selectList: $4 }
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList TableExpression  -> { selectList: $4, tableExpression: $5 }
  ;
  ;
 
 
 OptionalUnions
 OptionalUnions
@@ -1320,55 +1320,51 @@ UnionClause_EDIT
  ;
  ;
 
 
 SelectStatement_EDIT
 SelectStatement_EDIT
- : 'SELECT' OptionalAllOrDistinct SelectList_EDIT
+ : 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList_EDIT
    {
    {
-     if ($3.cursorAtStart) {
-       var keywords = [];
-       if ($2) {
-         keywords = [{ value: '*', weight: 10000 }];
-       } else {
-         keywords = [{ value: '*', weight: 10000 }, 'ALL', 'DISTINCT'];
+     if ($4.cursorAtStart) {
+       var keywords = [{ value: '*', weight: 10000 }];
+       if (!$3 && !$2) {
+         keywords.push({ value: 'ALL', weight: 2 });
+         keywords.push({ value: 'DISTINCT', weight: 2 });
        }
        }
-       if (parser.isImpala()) {
-         keywords.push('STRAIGHT_JOIN');
+       if (parser.isImpala() && !$3) {
+         keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
        }
        }
        parser.suggestKeywords(keywords);
        parser.suggestKeywords(keywords);
      } else {
      } else {
-       parser.checkForSelectListKeywords($3);
+       parser.checkForSelectListKeywords($4);
      }
      }
-     if ($3.suggestFunctions) {
+     if ($4.suggestFunctions) {
        parser.suggestFunctions();
        parser.suggestFunctions();
      }
      }
-     if ($3.suggestColumns) {
+     if ($4.suggestColumns) {
        parser.suggestColumns({ identifierChain: [], source: 'select' });
        parser.suggestColumns({ identifierChain: [], source: 'select' });
      }
      }
-     if ($3.suggestTables) {
+     if ($4.suggestTables) {
        parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
        parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
      }
      }
-     if ($3.suggestDatabases) {
+     if ($4.suggestDatabases) {
        parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
        parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
      }
      }
-     if ($3.suggestAggregateFunctions && (!$2 || $2 === 'ALL')) {
+     if ($4.suggestAggregateFunctions && (!$2 || $2 === 'ALL')) {
        parser.suggestAggregateFunctions();
        parser.suggestAggregateFunctions();
        parser.suggestAnalyticFunctions();
        parser.suggestAnalyticFunctions();
      }
      }
    }
    }
- | 'SELECT' OptionalAllOrDistinct 'CURSOR'
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin 'CURSOR'
    {
    {
-     var keywords = [];
-     if ($2) {
-       keywords = [{ value: '*', weight: 10000 }];
-       if ($2 === 'ALL') {
-         parser.suggestAggregateFunctions();
-         parser.suggestAnalyticFunctions();
-       }
-     } else {
-       keywords = [{ value: '*', weight: 10000 }, 'ALL', 'DISTINCT'];
+     var keywords = [{ value: '*', weight: 10000 }];
+     if (!$2 || $2 === 'ALL') {
        parser.suggestAggregateFunctions();
        parser.suggestAggregateFunctions();
        parser.suggestAnalyticFunctions();
        parser.suggestAnalyticFunctions();
      }
      }
-     if (parser.isImpala()) {
-       keywords.push('STRAIGHT_JOIN');
+     if (!$3 && !$2) {
+       keywords.push({ value: 'ALL', weight: 2 });
+       keywords.push({ value: 'DISTINCT', weight: 2 });
+     }
+     if (parser.isImpala() && !$3) {
+       keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
      }
      }
      parser.suggestKeywords(keywords);
      parser.suggestKeywords(keywords);
      parser.suggestFunctions();
      parser.suggestFunctions();
@@ -1376,30 +1372,27 @@ SelectStatement_EDIT
      parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
      parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
      parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
      parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
    }
    }
- | 'SELECT' OptionalAllOrDistinct SelectList TableExpression_EDIT
- | 'SELECT' OptionalAllOrDistinct SelectList_EDIT TableExpression
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList TableExpression_EDIT
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList_EDIT TableExpression
    {
    {
-     parser.selectListNoTableSuggest($3, $2);
+     parser.selectListNoTableSuggest($4, $2);
      if (parser.yy.result.suggestColumns) {
      if (parser.yy.result.suggestColumns) {
        parser.yy.result.suggestColumns.source = 'select';
        parser.yy.result.suggestColumns.source = 'select';
      }
      }
    }
    }
- | 'SELECT' OptionalAllOrDistinct 'CURSOR' TableExpression
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin 'CURSOR' TableExpression
    {
    {
-     var keywords = [];
-     if ($2) {
-       keywords = [{ value: '*', weight: 10000 }];
-       if ($2 === 'ALL') {
-         parser.suggestAggregateFunctions();
-         parser.suggestAnalyticFunctions();
-       }
-     } else {
-       keywords = [{ value: '*', weight: 10000 }, 'ALL', 'DISTINCT'];
+     var keywords = [{ value: '*', weight: 10000 }];
+     if (!$2 || $2 === 'ALL') {
        parser.suggestAggregateFunctions();
        parser.suggestAggregateFunctions();
        parser.suggestAnalyticFunctions();
        parser.suggestAnalyticFunctions();
      }
      }
-     if (parser.isImpala()) {
-       keywords.push('STRAIGHT_JOIN');
+     if (!$3 && !$2) {
+       keywords.push({ value: 'ALL', weight: 2 });
+       keywords.push({ value: 'DISTINCT', weight: 2 });
+     }
+     if (parser.isImpala() && !$3) {
+       keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
      }
      }
      parser.suggestKeywords(keywords);
      parser.suggestKeywords(keywords);
      parser.suggestFunctions();
      parser.suggestFunctions();
@@ -1407,17 +1400,17 @@ SelectStatement_EDIT
      parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
      parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
      parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
      parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
    }
    }
- | 'SELECT' OptionalAllOrDistinct SelectList 'CURSOR' TableExpression
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList 'CURSOR' TableExpression
    {
    {
-     parser.checkForSelectListKeywords($3);
+     parser.checkForSelectListKeywords($4);
    }
    }
- | 'SELECT' OptionalAllOrDistinct SelectList 'CURSOR' ',' TableExpression
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList 'CURSOR' ',' TableExpression
    {
    {
-     parser.checkForSelectListKeywords($3);
+     parser.checkForSelectListKeywords($4);
    }
    }
- | 'SELECT' OptionalAllOrDistinct SelectList 'CURSOR'
+ | 'SELECT' OptionalAllOrDistinct OptionalStraightJoin SelectList 'CURSOR'
    {
    {
-     parser.checkForSelectListKeywords($3);
+     parser.checkForSelectListKeywords($4);
      var keywords = ['FROM'];
      var keywords = ['FROM'];
      if (parser.yy.result.suggestKeywords) {
      if (parser.yy.result.suggestKeywords) {
        keywords = parser.yy.result.suggestKeywords.concat(keywords);
        keywords = parser.yy.result.suggestKeywords.concat(keywords);
@@ -1428,6 +1421,11 @@ SelectStatement_EDIT
    }
    }
  ;
  ;
 
 
+OptionalStraightJoin
+ :
+ | '<impala>STRAIGHT_JOIN'
+ ;
+
 CommonTableExpression
 CommonTableExpression
  : 'WITH' WithQueries  -> $2
  : 'WITH' WithQueries  -> $2
  ;
  ;

+ 25 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSpecSelect.js

@@ -515,6 +515,31 @@
         });
         });
       });
       });
 
 
+      it('should suggest tables for "SELECT STRAIGHT_JOIN |"', function () {
+        assertAutoComplete({
+          beforeCursor: 'SELECT STRAIGHT_JOIN ',
+          afterCursor: '',
+          dialect: 'impala',
+          containsKeywords: ['*'],
+          doesNotContainKeywords: ['ALL', 'DISTINCT'],
+          expectedResult: {
+            lowerCase: false,
+            suggestAggregateFunctions: { tables: [] },
+            suggestAnalyticFunctions: true,
+            suggestFunctions: {},
+            suggestTables: {
+              prependQuestionMark: true,
+              prependFrom: true
+            },
+            suggestDatabases: {
+              prependQuestionMark: true,
+              prependFrom: true,
+              appendDot: true
+            }
+          }
+        });
+      });
+
       it('should suggest tables for "SELECT DISTINCT |"', function () {
       it('should suggest tables for "SELECT DISTINCT |"', function () {
         assertAutoComplete({
         assertAutoComplete({
           beforeCursor: 'SELECT DISTINCT ',
           beforeCursor: 'SELECT DISTINCT ',

File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlAutocompleteParser.js


File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlSyntaxParser.js


Some files were not shown because too many files changed in this diff