Pārlūkot izejas kodu

HUE-6301 [autocomplete] Improve filter suggestions around AND and OR

Johan Ahlen 8 gadi atpakaļ
vecāks
revīzija
2117637f4a

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

@@ -1640,9 +1640,6 @@ OptionalSelectConditions_EDIT
      if (parser.yy.result.suggestColumns) {
        parser.yy.result.suggestColumns.source = 'where';
      }
-     if ($1.emptyFilter) {
-       parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
-     }
    }
  | OptionalWhereClause GroupByClause_EDIT OptionalHavingClause OptionalWindowClause OptionalOrderByClause OptionalClusterOrDistributeBy OptionalLimitClause OptionalOffsetClause
    {
@@ -1757,12 +1754,17 @@ WhereClause
 
 WhereClause_EDIT
  : 'WHERE' SearchCondition_EDIT
+   {
+     if ($2.suggestFilters) {
+       parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
+     }
+   }
  | 'WHERE' 'CURSOR'
    {
      parser.suggestFunctions();
      parser.suggestColumns();
      parser.suggestKeywords(['EXISTS', 'NOT EXISTS']);
-     $$ = { emptyFilter: true }
+     parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
    }
  ;
 
@@ -2176,8 +2178,6 @@ ValueExpressionList_EDIT
    }
  | ValueExpressionList ',' ValueExpression_EDIT ',' ValueExpressionList
    {
-     // $3.position = $1.position + 1;
-     // $$ = $3
      $1.position += 1;
    }
  | ValueExpressionList ',' AnyCursor

+ 54 - 49
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_valueExpression.jison

@@ -36,7 +36,7 @@ ValueExpression
  ;
 
 ValueExpression_EDIT
- : 'NOT' ValueExpression_EDIT                           -> { types: [ 'BOOLEAN' ] }
+ : 'NOT' ValueExpression_EDIT                           -> { types: [ 'BOOLEAN' ], suggestFilters: $2.suggestFilters }
  | 'NOT' 'CURSOR'
    {
      parser.suggestFunctions();
@@ -44,14 +44,14 @@ ValueExpression_EDIT
      parser.suggestKeywords(['EXISTS']);
      $$ = { types: [ 'BOOLEAN' ] };
    }
- | '!' ValueExpression_EDIT                             -> { types: [ 'BOOLEAN' ] }
+ | '!' ValueExpression_EDIT                             -> { types: [ 'BOOLEAN' ], suggestFilters: $2.suggestFilters }
  | '!' AnyCursor
    {
      parser.suggestFunctions({ types: [ 'BOOLEAN' ] });
      parser.suggestColumns({ types: [ 'BOOLEAN' ] });
      $$ = { types: [ 'BOOLEAN' ] };
    }
- | '~' ValueExpression_EDIT                             -> { types: [ 'T' ] }
+ | '~' ValueExpression_EDIT                             -> { types: [ 'T' ], suggestFilters: $2.suggestFilters }
  | '~' 'PARTIAL_CURSOR'
    {
      parser.suggestFunctions();
@@ -63,7 +63,7 @@ ValueExpression_EDIT
      if (!$2.typeSet) {
        parser.applyTypeToSuggestions('NUMBER');
      }
-     $$ = { types: [ 'NUMBER' ] };
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $2.suggestFilters };
    }
  | '-' 'PARTIAL_CURSOR' %prec NEGATION
    {
@@ -152,7 +152,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($3.types);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression_EDIT '<' ValueExpression
    {
@@ -160,7 +160,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($3.types);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression_EDIT '>' ValueExpression
    {
@@ -168,7 +168,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($3.types);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression_EDIT 'COMPARISON_OPERATOR' ValueExpression
    {
@@ -176,7 +176,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($3.types);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression '=' PartialBacktickedOrAnyCursor
    {
@@ -208,7 +208,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($1.types);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters }
    }
  | ValueExpression '<' ValueExpression_EDIT
    {
@@ -216,7 +216,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($1.types);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters }
    }
  | ValueExpression '>' ValueExpression_EDIT
    {
@@ -224,7 +224,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($1.types);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters }
    }
  | ValueExpression 'COMPARISON_OPERATOR' ValueExpression_EDIT
    {
@@ -232,7 +232,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions($1.types);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters }
    }
  ;
 
@@ -269,10 +269,10 @@ ValueExpression_EDIT
      }
      $$ = { types: [ 'BOOLEAN' ], typeSet: true  };
    }
- | ValueExpression_EDIT 'NOT' 'IN' '(' ValueExpressionList RightParenthesisOrError  -> { types: [ 'BOOLEAN' ] }
- | ValueExpression_EDIT 'NOT' 'IN' '(' TableSubQueryInner RightParenthesisOrError   -> { types: [ 'BOOLEAN' ] }
- | ValueExpression_EDIT 'IN' '(' ValueExpressionList RightParenthesisOrError        -> { types: [ 'BOOLEAN' ] }
- | ValueExpression_EDIT 'IN' '(' TableSubQueryInner RightParenthesisOrError         -> { types: [ 'BOOLEAN' ] }
+ | ValueExpression_EDIT 'NOT' 'IN' '(' ValueExpressionList RightParenthesisOrError  -> { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
+ | ValueExpression_EDIT 'NOT' 'IN' '(' TableSubQueryInner RightParenthesisOrError   -> { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
+ | ValueExpression_EDIT 'IN' '(' ValueExpressionList RightParenthesisOrError        -> { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
+ | ValueExpression_EDIT 'IN' '(' TableSubQueryInner RightParenthesisOrError         -> { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
  ;
 
 ValueExpressionInSecondPart_EDIT
@@ -294,21 +294,21 @@ ValueExpression_EDIT
      if ($4.types[0] === $6.types[0] && !$1.typeSet) {
        parser.applyTypeToSuggestions($4.types);
      }
-     $$ = { types: [ 'BOOLEAN' ] };
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters };
    }
  | ValueExpression 'NOT' 'BETWEEN' ValueExpression_EDIT 'BETWEEN_AND' ValueExpression
    {
      if ($1.types[0] === $6.types[0] && !$4.typeSet) {
        parser.applyTypeToSuggestions($1.types);
      }
-     $$ = { types: [ 'BOOLEAN' ] };
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $4.suggestFilters };
    }
  | ValueExpression 'NOT' 'BETWEEN' ValueExpression 'BETWEEN_AND' ValueExpression_EDIT
    {
      if ($1.types[0] === $4.types[0] && !$6.typeSet) {
        parser.applyTypeToSuggestions($1.types);
      }
-     $$ = { types: [ 'BOOLEAN' ] };
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $6.suggestFilters };
    }
  | ValueExpression 'NOT' 'BETWEEN' ValueExpression 'BETWEEN_AND' 'CURSOR'
    {
@@ -330,21 +330,21 @@ ValueExpression_EDIT
      if ($1.types[0] === $3.types[0] && !$1.typeSet) {
        parser.applyTypeToSuggestions($1.types)
      }
-     $$ = { types: [ 'BOOLEAN' ] };
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters };
    }
  | ValueExpression 'BETWEEN' ValueExpression_EDIT 'BETWEEN_AND' ValueExpression
    {
      if ($1.types[0] === $3.types[0] && !$3.typeSet) {
        parser.applyTypeToSuggestions($1.types)
      }
-     $$ = { types: [ 'BOOLEAN' ] };
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters };
    }
  | ValueExpression 'BETWEEN' ValueExpression 'BETWEEN_AND' ValueExpression_EDIT
    {
      if ($1.types[0] === $3.types[0] && !$5.typeSet) {
        parser.applyTypeToSuggestions($1.types)
      }
-     $$ = { types: [ 'BOOLEAN' ] };
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $5.suggestFilters };
    }
  | ValueExpression 'BETWEEN' ValueExpression 'BETWEEN_AND' 'CURSOR'
    {
@@ -386,42 +386,42 @@ ValueExpression_EDIT
  : 'CURSOR' 'OR' ValueExpression
    {
      parser.valueExpressionSuggest(undefined, $2);
-     $$ = { types: [ 'BOOLEAN' ], typeSet: true  };
+     $$ = { types: [ 'BOOLEAN' ], typeSet: true, suggestFilters: true };
    }
  | ValueExpression_EDIT 'OR' ValueExpression
    {
      parser.addColRefIfExists($3);
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression 'OR' PartialBacktickedOrAnyCursor
    {
      parser.valueExpressionSuggest(undefined, $2);
-     $$ = { types: [ 'BOOLEAN' ], typeSet: true  };
+     $$ = { types: [ 'BOOLEAN' ], typeSet: true, suggestFilters: true };
    }
  | ValueExpression 'OR' ValueExpression_EDIT
    {
      parser.addColRefIfExists($1);
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters }
    }
  | 'CURSOR' 'AND' ValueExpression
    {
      parser.valueExpressionSuggest(undefined, $2);
-     $$ = { types: [ 'BOOLEAN' ], typeSet: true };
+     $$ = { types: [ 'BOOLEAN' ], typeSet: true, suggestFilters: true };
    }
  | ValueExpression_EDIT 'AND' ValueExpression
    {
      parser.addColRefIfExists($3);
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression 'AND' PartialBacktickedOrAnyCursor
    {
      parser.valueExpressionSuggest(undefined, $2);
-     $$ = { types: [ 'BOOLEAN' ], typeSet: true  };
+     $$ = { types: [ 'BOOLEAN' ], typeSet: true, suggestFilters: true };
    }
  | ValueExpression 'AND' ValueExpression_EDIT
    {
      parser.addColRefIfExists($1);
-     $$ = { types: [ 'BOOLEAN' ] }
+     $$ = { types: [ 'BOOLEAN' ], suggestFilters: $3.suggestFilters }
    }
  ;
 
@@ -467,7 +467,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'NUMBER' ] }
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression_EDIT '*' ValueExpression
    {
@@ -475,7 +475,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'NUMBER' ] }
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression_EDIT 'ARITHMETIC_OPERATOR' ValueExpression
    {
@@ -483,7 +483,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($3);
      }
-     $$ = { types: [ 'NUMBER' ] }
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $1.suggestFilters }
    }
  | ValueExpression '-' PartialBacktickedOrAnyCursor
    {
@@ -509,7 +509,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'NUMBER' ] };
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $3.suggestFilters };
    }
  | ValueExpression '*' ValueExpression_EDIT
    {
@@ -517,7 +517,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'NUMBER' ] };
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $3.suggestFilters };
    }
  | ValueExpression 'ARITHMETIC_OPERATOR' ValueExpression_EDIT
    {
@@ -525,7 +525,7 @@ ValueExpression_EDIT
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($1);
      }
-     $$ = { types: [ 'NUMBER' ] };
+     $$ = { types: [ 'NUMBER' ], suggestFilters: $3.suggestFilters };
    }
  ;
 
@@ -567,8 +567,8 @@ LikeRightPart_EDIT
  ;
 
 ValueExpression_EDIT
- : ValueExpression_EDIT LikeRightPart               -> { types: [ 'BOOLEAN' ] }
- | ValueExpression_EDIT 'NOT' LikeRightPart         -> { types: [ 'BOOLEAN' ] }
+ : ValueExpression_EDIT LikeRightPart               -> { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
+ | ValueExpression_EDIT 'NOT' LikeRightPart         -> { types: [ 'BOOLEAN' ], suggestFilters: $1.suggestFilters }
  | ValueExpression LikeRightPart_EDIT               -> { types: [ 'BOOLEAN' ] }
  | ValueExpression 'NOT' LikeRightPart_EDIT         -> { types: [ 'BOOLEAN' ] }
  | 'CURSOR' LikeRightPart
@@ -606,8 +606,12 @@ ValueExpression_EDIT
      parser.suggestValueExpressionKeywords($2, ['WHEN']);
      $$ = { types: [ 'T' ], typeSet: true };
    }
- | 'CASE' ValueExpression_EDIT CaseRightPart         -> $3
- | 'CASE' ValueExpression_EDIT EndOrError            -> { types: [ 'T' ] }
+ | 'CASE' ValueExpression_EDIT CaseRightPart
+    {
+      $$ = $3;
+      $$.suggestFilters = $2.suggestFilters;
+    }
+ | 'CASE' ValueExpression_EDIT EndOrError            -> { types: [ 'T' ], suggestFilters: $2.suggestFilters }
  | 'CASE' 'CURSOR' CaseRightPart                     -> { types: [ 'T' ] }
  ;
 
@@ -656,6 +660,7 @@ CaseRightPart_EDIT
    {
      $1.caseTypes.push($3);
      $$ = parser.findCaseType($1);
+     $$.suggestFilters = $3.suggestFilters
    }
  | CaseWhenThenList 'ELSE' 'CURSOR' EndOrError
    {
@@ -711,11 +716,11 @@ CaseWhenThenListPartTwo
  ;
 
 CaseWhenThenListPartTwo_EDIT
- : 'WHEN' ValueExpression_EDIT                         -> { caseTypes: [{ types: ['T'] }] }
- | 'WHEN' ValueExpression_EDIT 'THEN'                  -> { caseTypes: [{ types: ['T'] }] }
- | 'WHEN' ValueExpression_EDIT 'THEN' ValueExpression  -> { caseTypes: [$4] }
- | 'WHEN' ValueExpression 'THEN' ValueExpression_EDIT  -> { caseTypes: [$4] }
- | 'WHEN' 'THEN' ValueExpression_EDIT                  -> { caseTypes: [$3] }
+ : 'WHEN' ValueExpression_EDIT                         -> { caseTypes: [{ types: ['T'] }], suggestFilters: $2.suggestFilters }
+ | 'WHEN' ValueExpression_EDIT 'THEN'                  -> { caseTypes: [{ types: ['T'] }], suggestFilters: $2.suggestFilters }
+ | 'WHEN' ValueExpression_EDIT 'THEN' ValueExpression  -> { caseTypes: [$4], suggestFilters: $2.suggestFilters }
+ | 'WHEN' ValueExpression 'THEN' ValueExpression_EDIT  -> { caseTypes: [$4], suggestFilters: $4.suggestFilters }
+ | 'WHEN' 'THEN' ValueExpression_EDIT                  -> { caseTypes: [$3], suggestFilters: $3.suggestFilters }
  | 'CURSOR' ValueExpression 'THEN'
    {
      parser.suggestKeywords(['WHEN']);
@@ -741,23 +746,23 @@ CaseWhenThenListPartTwo_EDIT
  | 'WHEN' 'CURSOR'
    {
      parser.valueExpressionSuggest();
-     $$ = { caseTypes: [{ types: ['T'] }] };
+     $$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
    }
  | 'WHEN' 'CURSOR' ValueExpression
    {
      parser.valueExpressionSuggest();
      parser.suggestKeywords(['THEN']);
-     $$ = { caseTypes: [{ types: ['T'] }] };
+     $$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
    }
  | 'WHEN' 'CURSOR' 'THEN'
    {
      parser.valueExpressionSuggest();
-     $$ = { caseTypes: [{ types: ['T'] }] };
+     $$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
    }
  | 'WHEN' 'CURSOR' 'THEN' ValueExpression
    {
      parser.valueExpressionSuggest();
-     $$ = { caseTypes: [$4] };
+     $$ = { caseTypes: [$4], suggestFilters: true };
    }
  | 'WHEN' ValueExpression 'CURSOR'
    {

+ 82 - 40
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.js

@@ -631,7 +631,7 @@ case 808:
      parser.selectListNoTableSuggest($$[$0-1], $$[$0-2]);
    
 break;
-case 810: case 886: case 917: case 930: case 934: case 972: case 976: case 981: case 1001: case 1023: case 1024: case 1100: case 1102: case 1104: case 1168: case 1178: case 1191: case 1203: case 1302: case 1360: case 1532: case 1533: case 1558: case 1559: case 1560: case 1751: case 1904: case 1918: case 1919:
+case 810: case 886: case 917: case 930: case 934: case 972: case 976: case 981: case 1001: case 1023: case 1024: case 1100: case 1102: case 1168: case 1178: case 1191: case 1203: case 1302: case 1360: case 1532: case 1533: case 1558: case 1559: case 1560: case 1751: case 1904: case 1918: case 1919:
 this.$ = $$[$0];
 break;
 case 813:
@@ -828,9 +828,6 @@ case 838:
      if (parser.yy.result.suggestColumns) {
        parser.yy.result.suggestColumns.source = 'where';
      }
-     if ($$[$0-7].emptyFilter) {
-       parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
-     }
    
 break;
 case 839:
@@ -981,13 +978,20 @@ case 858:
        cursorAtEnd: !$$[$0]
      }
    
+break;
+case 887:
+
+     if ($$[$0].suggestFilters) {
+       parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
+     }
+   
 break;
 case 888:
 
      parser.suggestFunctions();
      parser.suggestColumns();
      parser.suggestKeywords(['EXISTS', 'NOT EXISTS']);
-     this.$ = { emptyFilter: true }
+     parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
    
 break;
 case 891:
@@ -1126,7 +1130,7 @@ case 1002:
      $$[$0].types = ['NUMBER'];
    
 break;
-case 1003: case 1006: case 1007: case 1008: case 1009: case 1010: case 1011: case 1012: case 1013: case 1014: case 1015: case 1021: case 1022: case 1027: case 1029: case 1038: case 1059: case 1060: case 1061: case 1062: case 1094: case 1095: case 1096: case 1097: case 1157:
+case 1003: case 1006: case 1007: case 1008: case 1009: case 1010: case 1011: case 1012: case 1013: case 1014: case 1015: case 1021: case 1022: case 1038: case 1096: case 1097: case 1157:
 this.$ = { types: [ 'BOOLEAN' ] };
 break;
 case 1004:
@@ -1155,6 +1159,9 @@ case 1026:
      parser.suggestKeywords(['BETWEEN', 'EXISTS', 'IN', 'LIKE']);
      this.$ = { types: [ 'BOOLEAN' ] };
    
+break;
+case 1027: case 1029:
+this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters };
 break;
 case 1028:
 
@@ -1171,8 +1178,8 @@ case 1030:
      this.$ = { types: [ 'BOOLEAN' ] };
    
 break;
-case 1031: case 1105: case 1106: case 1413: case 1418: case 1419:
-this.$ = { types: [ 'T' ] };
+case 1031:
+this.$ = { types: [ 'T' ], suggestFilters: $$[$0].suggestFilters };
 break;
 case 1032:
 
@@ -1186,7 +1193,7 @@ case 1033:
      if (!$$[$0].typeSet) {
        parser.applyTypeToSuggestions('NUMBER');
      }
-     this.$ = { types: [ 'NUMBER' ] };
+     this.$ = { types: [ 'NUMBER' ], suggestFilters: $$[$0].suggestFilters };
    
 break;
 case 1034:
@@ -1245,7 +1252,7 @@ case 1045: case 1046: case 1047: case 1048:
        parser.applyTypeToSuggestions($$[$0].types);
        parser.addColRefIfExists($$[$0]);
      }
-     this.$ = { types: [ 'BOOLEAN' ] }
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters }
    
 break;
 case 1049: case 1051:
@@ -1275,7 +1282,7 @@ case 1053: case 1054: case 1055: case 1056:
        parser.applyTypeToSuggestions($$[$0-2].types);
        parser.addColRefIfExists($$[$0-2]);
      }
-     this.$ = { types: [ 'BOOLEAN' ] }
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters }
    
 break;
 case 1057:
@@ -1301,13 +1308,19 @@ case 1058:
      }
      this.$ = { types: [ 'BOOLEAN' ], typeSet: true  };
    
+break;
+case 1059: case 1060:
+this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-5].suggestFilters };
+break;
+case 1061: case 1062:
+this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-4].suggestFilters };
 break;
 case 1063:
 
      if ($$[$0-2].types[0] === $$[$0].types[0] && !$$[$0-5].typeSet) {
        parser.applyTypeToSuggestions($$[$0-2].types);
      }
-     this.$ = { types: [ 'BOOLEAN' ] };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-5].suggestFilters };
    
 break;
 case 1064:
@@ -1315,7 +1328,7 @@ case 1064:
      if ($$[$0-5].types[0] === $$[$0].types[0] && !$$[$0-2].typeSet) {
        parser.applyTypeToSuggestions($$[$0-5].types);
      }
-     this.$ = { types: [ 'BOOLEAN' ] };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters };
    
 break;
 case 1065:
@@ -1323,7 +1336,7 @@ case 1065:
      if ($$[$0-5].types[0] === $$[$0-2].types[0] && !$$[$0].typeSet) {
        parser.applyTypeToSuggestions($$[$0-5].types);
      }
-     this.$ = { types: [ 'BOOLEAN' ] };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters };
    
 break;
 case 1066:
@@ -1349,7 +1362,7 @@ case 1069:
      if ($$[$0-4].types[0] === $$[$0-2].types[0] && !$$[$0-4].typeSet) {
        parser.applyTypeToSuggestions($$[$0-4].types)
      }
-     this.$ = { types: [ 'BOOLEAN' ] };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-4].suggestFilters };
    
 break;
 case 1070:
@@ -1357,7 +1370,7 @@ case 1070:
      if ($$[$0-4].types[0] === $$[$0-2].types[0] && !$$[$0-2].typeSet) {
        parser.applyTypeToSuggestions($$[$0-4].types)
      }
-     this.$ = { types: [ 'BOOLEAN' ] };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters };
    
 break;
 case 1071:
@@ -1365,7 +1378,7 @@ case 1071:
      if ($$[$0-4].types[0] === $$[$0-2].types[0] && !$$[$0].typeSet) {
        parser.applyTypeToSuggestions($$[$0-4].types)
      }
-     this.$ = { types: [ 'BOOLEAN' ] };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters };
    
 break;
 case 1072:
@@ -1382,28 +1395,22 @@ case 1074:
      this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
    
 break;
-case 1075: case 1077: case 1081:
+case 1075: case 1077: case 1079: case 1081:
 
      parser.valueExpressionSuggest(undefined, $$[$0-1]);
-     this.$ = { types: [ 'BOOLEAN' ], typeSet: true  };
+     this.$ = { types: [ 'BOOLEAN' ], typeSet: true, suggestFilters: true };
    
 break;
 case 1076: case 1080:
 
      parser.addColRefIfExists($$[$0]);
-     this.$ = { types: [ 'BOOLEAN' ] }
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters }
    
 break;
 case 1078: case 1082:
 
      parser.addColRefIfExists($$[$0-2]);
-     this.$ = { types: [ 'BOOLEAN' ] }
-   
-break;
-case 1079:
-
-     parser.valueExpressionSuggest(undefined, $$[$0-1]);
-     this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
+     this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters }
    
 break;
 case 1083: case 1084:
@@ -1419,7 +1426,7 @@ case 1085: case 1086: case 1087:
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($$[$0]);
      }
-     this.$ = { types: [ 'NUMBER' ] }
+     this.$ = { types: [ 'NUMBER' ], suggestFilters: $$[$0-2].suggestFilters }
    
 break;
 case 1088: case 1089: case 1090:
@@ -1435,8 +1442,14 @@ case 1091: case 1092: case 1093:
        parser.applyTypeToSuggestions(['NUMBER']);
        parser.addColRefIfExists($$[$0-2]);
      }
-     this.$ = { types: [ 'NUMBER' ] };
+     this.$ = { types: [ 'NUMBER' ], suggestFilters: $$[$0].suggestFilters };
    
+break;
+case 1094:
+this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-1].suggestFilters };
+break;
+case 1095:
+this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters };
 break;
 case 1098:
 
@@ -1464,6 +1477,18 @@ case 1103:
      parser.suggestValueExpressionKeywords($$[$0-2], ['WHEN']);
      this.$ = { types: [ 'T' ], typeSet: true };
    
+break;
+case 1104:
+
+      this.$ = $$[$0];
+      this.$.suggestFilters = $$[$0-1].suggestFilters;
+    
+break;
+case 1105:
+this.$ = { types: [ 'T' ], suggestFilters: $$[$0-1].suggestFilters };
+break;
+case 1106: case 1413: case 1418: case 1419:
+this.$ = { types: [ 'T' ] };
 break;
 case 1107: case 1109:
 
@@ -1488,8 +1513,6 @@ case 1111:
 break;
 case 1112:
 
-     // $$[$0-2].position = $$[$0-4].position + 1;
-     // this.$ = $$[$0-2]
      $$[$0-4].position += 1;
    
 break;
@@ -2413,7 +2436,7 @@ break;
 case 1511: case 1513:
 this.$ = parser.findCaseType($$[$0-1]);
 break;
-case 1512: case 1515: case 1519:
+case 1512: case 1515:
 
      $$[$0-3].caseTypes.push($$[$0-1]);
      this.$ = parser.findCaseType($$[$0-3]);
@@ -2448,6 +2471,13 @@ case 1518:
      }
      this.$ = parser.findCaseType($$[$0-2]);
    
+break;
+case 1519:
+
+     $$[$0-3].caseTypes.push($$[$0-1]);
+     this.$ = parser.findCaseType($$[$0-3]);
+     this.$.suggestFilters = $$[$0-1].suggestFilters
+   
 break;
 case 1520:
 
@@ -2489,11 +2519,17 @@ case 1531:
      parser.suggestValueExpressionKeywords($$[$0-2], ['WHEN']);
    
 break;
-case 1534: case 1535:
-this.$ = { caseTypes: [{ types: ['T'] }] };
+case 1534:
+this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: $$[$0].suggestFilters };
+break;
+case 1535:
+this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: $$[$0-1].suggestFilters };
 break;
-case 1536: case 1537: case 1538:
-this.$ = { caseTypes: [$$[$0]] };
+case 1536:
+this.$ = { caseTypes: [$$[$0]], suggestFilters: $$[$0-2].suggestFilters };
+break;
+case 1537: case 1538:
+this.$ = { caseTypes: [$$[$0]], suggestFilters: $$[$0].suggestFilters };
 break;
 case 1539:
 
@@ -2521,23 +2557,23 @@ case 1542:
       this.$ = { caseTypes: [{ types: ['T'] }] };
     
 break;
-case 1543: case 1545: case 1549: case 1550: case 1551: case 1552:
+case 1543: case 1545:
 
      parser.valueExpressionSuggest();
-     this.$ = { caseTypes: [{ types: ['T'] }] };
+     this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
    
 break;
 case 1544:
 
      parser.valueExpressionSuggest();
      parser.suggestKeywords(['THEN']);
-     this.$ = { caseTypes: [{ types: ['T'] }] };
+     this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
    
 break;
 case 1546:
 
      parser.valueExpressionSuggest();
-     this.$ = { caseTypes: [$$[$0]] };
+     this.$ = { caseTypes: [$$[$0]], suggestFilters: true };
    
 break;
 case 1547:
@@ -2551,6 +2587,12 @@ case 1548:
      parser.suggestValueExpressionKeywords($$[$0-2], ['THEN']);
      this.$ = { caseTypes: [{ types: ['T'] }] };
    
+break;
+case 1549: case 1550: case 1551: case 1552:
+
+     parser.valueExpressionSuggest();
+     this.$ = { caseTypes: [{ types: ['T'] }] };
+   
 break;
 case 1561: case 1562:
 

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

@@ -4379,6 +4379,7 @@
           expectedResult: {
             lowerCase: false,
             suggestFunctions: {},
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }, { identifierChain: [{ name: 'bar' }] }] },
             suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }, { identifierChain: [{ name: 'bar' }] }] },
             suggestIdentifiers: [{ name: 'bla.', type: 'alias' }, { name: 'bar.', type: 'table' }]
           }
@@ -4393,6 +4394,7 @@
           expectedResult: {
             lowerCase: false,
             suggestFunctions: {},
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }] },
             suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }] },
             suggestIdentifiers: [{ name: 'bla.', type: 'alias' }]
           }
@@ -4407,6 +4409,7 @@
           expectedResult: {
             lowerCase: false,
             suggestFunctions: {},
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }] },
             suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }] },
             suggestIdentifiers: [{ name: 'bla.', type: 'alias' }]
           }
@@ -4421,6 +4424,7 @@
           expectedResult: {
             lowerCase: false,
             suggestFunctions: {},
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }] },
             suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'foo' }], alias: 'bla' }] },
             suggestIdentifiers: [{ name: 'bla.', type: 'alias' }]
           }
@@ -4526,6 +4530,62 @@
         });
       });
 
+      it('should suggest columns for "SELECT * FROM testTable WHERE baa = 1 AND |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT * FROM testTable WHERE baa = 1 AND ',
+          afterCursor: '',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'testTable' }] }] },
+            suggestFunctions: {},
+            suggestKeywords: ['CASE', 'EXISTS', 'NOT'],
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'testTable' }] }] }
+          }
+        });
+      });
+
+      it('should suggest columns for "SELECT * FROM testTable WHERE | AND baa = 1"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT * FROM testTable WHERE ',
+          afterCursor: ' AND baa = 1',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'testTable' }] }] },
+            suggestFunctions: {},
+            suggestKeywords: ['CASE', 'EXISTS', 'NOT'],
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'testTable' }] }] }
+          }
+        });
+      });
+
+      it('should suggest columns for "SELECT * FROM testTable WHERE baa = 1 OR |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT * FROM testTable WHERE baa = 1 OR ',
+          afterCursor: '',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'testTable' }] }] },
+            suggestFunctions: {},
+            suggestKeywords: ['CASE', 'EXISTS', 'NOT'],
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'testTable' }] }] }
+          }
+        });
+      });
+
+      it('should suggest columns for "SELECT * FROM testTable WHERE | OR baa = 1"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT * FROM testTable WHERE ',
+          afterCursor: ' OR baa = 1',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'testTable' }] }] },
+            suggestFunctions: {},
+            suggestKeywords: ['CASE', 'EXISTS', 'NOT'],
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'testTable' }] }] }
+          }
+        });
+      });
+
       it('should suggest keywords for "SELECT * FROM testTable WHERE NOT |"', function() {
         assertAutoComplete({
           beforeCursor: 'SELECT * FROM testTable WHERE NOT ',
@@ -4573,6 +4633,7 @@
           expectedResult: {
             lowerCase: false,
             suggestFunctions: {},
+            suggestFilters: { tables: [{ identifierChain: [{ name: 'testTable' }] }] },
             suggestColumns: { source: 'where',  tables: [{ identifierChain: [{ name: 'testTable' }] }] }
           }
         });

+ 2 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecUpdate.js

@@ -177,6 +177,7 @@
           lowerCase: false,
           suggestFunctions: {},
           suggestColumns: { tables: [{ identifierChain: [{ name: 'bar'}, { name: 'foo' }] }] },
+          suggestFilters: { tables: [{ identifierChain: [{ name: 'bar' }, { name: 'foo' }] }] },
           suggestKeywords: ['EXISTS', 'NOT EXISTS'],
           locations: [
             { type: 'statement', location: { first_line: 1, last_line: 1, first_column: 1, last_column: 37 } },
@@ -219,6 +220,7 @@
           lowerCase: false,
           suggestFunctions: {},
           suggestColumns: { tables: [{ identifierChain: [{ name: 'bar'}, { name: 'foo' }] }] },
+          suggestFilters: { tables: [{ identifierChain: [{ name: 'bar'}, { name: 'foo' }] }] },
           locations: [
             { type: 'statement', location: { first_line: 1, last_line: 1, first_column: 1, last_column: 48 } },
             { type: 'database', location: { first_line: 1, last_line: 1, first_column: 8, last_column: 11}, identifierChain: [{ name: 'bar' }] },