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

HUE-4513 [editor] Use weights for keyword autocompletion

Keywords are now sorted by weights based on the context and where order matters (like for the keywords WHERE, GROUP BY, ORDER BY and LIMIT)
Johan Ahlen 9 жил өмнө
parent
commit
6e55ce9480

+ 11 - 10
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_alter.jison

@@ -55,12 +55,12 @@ AlterTable_EDIT
    {
    {
      if (isHive()) {
      if (isHive()) {
        if (!$3) {
        if (!$3) {
-         suggestKeywords(['COLUMNS', 'IF NOT EXISTS', 'PARTITION']);
+         suggestKeywords([{ value: 'IF NOT EXISTS', weight: 3 }, { value: 'COLUMNS', weight: 2 }, { value: 'PARTITION', weight: 1 }]);
        } else {
        } else {
          suggestKeywords(['PARTITION']);
          suggestKeywords(['PARTITION']);
        }
        }
      } else if (isImpala()) {
      } else if (isImpala()) {
-       suggestKeywords(['COLUMNS', 'PARTITION']);
+       suggestKeywords([{ value: 'COLUMNS', weight: 2 }, { value: 'PARTITION', weight: 1 }]);
      }
      }
    }
    }
  | AlterTableLeftSide AnyReplace 'CURSOR'
  | AlterTableLeftSide AnyReplace 'CURSOR'
@@ -76,7 +76,9 @@ AlterTable_EDIT
        if (!$5 && !$6) {
        if (!$5 && !$6) {
          suggestKeywords(['LOCATION', 'PARTITION']);
          suggestKeywords(['LOCATION', 'PARTITION']);
        } else if ($6 && $6.suggestKeywords) {
        } else if ($6 && $6.suggestKeywords) {
-         suggestKeywords($6.suggestKeywords.concat(['PARTITION']));
+         var keywords = createWeightedKeywords($6.suggestKeywords, 2);
+         keywords.push({ value: 'PARTITION', weight: 1 });
+         suggestKeywords(keywords);
        } else {
        } else {
          suggestKeywords(['PARTITION']);
          suggestKeywords(['PARTITION']);
        }
        }
@@ -244,9 +246,11 @@ OptionalPartitionOperations_EDIT
    {
    {
      if (isHive() && !$5 && !$6) {
      if (isHive() && !$5 && !$6) {
        if ($4.suggestKeywords) {
        if ($4.suggestKeywords) {
-         suggestKeywords($4.suggestKeywords.concat(['AFTER', 'CASCADE', 'FIRST', 'RESTRICT']));
+         var keywords = createWeightedKeywords($4.suggestKeywords, 3);
+         keywords = keywords.concat([{ value: 'AFTER', weight: 2 }, { value: 'FIRST', weight: 2 }, { value: 'CASCADE', weight: 1 }, { value: 'RESTRICT', weight: 1 }]);
+         suggestKeywords(keywords);
        } else {
        } else {
-         suggestKeywords(['AFTER', 'CASCADE', 'FIRST', 'RESTRICT']);
+         suggestKeywords([{ value: 'AFTER', weight: 2 }, { value: 'FIRST', weight: 2 }, { value: 'CASCADE', weight: 1 }, { value: 'RESTRICT', weight: 1 }]);
        }
        }
      } else if (isHive() && $5 && !$6) {
      } else if (isHive() && $5 && !$6) {
        suggestKeywords(['CASCADE', 'RESTRICT']);
        suggestKeywords(['CASCADE', 'RESTRICT']);
@@ -347,7 +351,7 @@ DropOperations
  : 'DROP' 'CURSOR'
  : 'DROP' 'CURSOR'
    {
    {
      if (isHive()) {
      if (isHive()) {
-       suggestKeywords(['PARTITION', 'IF EXISTS']);
+       suggestKeywords([{ value: 'PARTITION', weight: 1}, { value: 'IF EXISTS', weight: 2 }]);
      } else if (isImpala()) {
      } else if (isImpala()) {
        suggestKeywords(['COLUMN', 'PARTITION']);
        suggestKeywords(['COLUMN', 'PARTITION']);
        suggestColumns();
        suggestColumns();
@@ -446,7 +450,6 @@ OptionalHiveFirstOrAfter_EDIT
  | HiveAfterOrFirst ColumnIdentifier_EDIT
  | HiveAfterOrFirst ColumnIdentifier_EDIT
  ;
  ;
 
 
-
 OptionalHiveColumn
 OptionalHiveColumn
  :
  :
  | '<hive>COLUMN'
  | '<hive>COLUMN'
@@ -472,7 +475,6 @@ HiveOrImpalaSerdeproperties
  | '<impala>SERDEPROPERTIES'
  | '<impala>SERDEPROPERTIES'
  ;
  ;
 
 
-
 HiveArchiveOrUnArchive
 HiveArchiveOrUnArchive
  : '<hive>ARCHIVE'
  : '<hive>ARCHIVE'
  | '<hive>UNARCHIVE'
  | '<hive>UNARCHIVE'
@@ -598,9 +600,8 @@ OptionalStoredAsDirectories_EDIT
    }
    }
  ;
  ;
 
 
-
 OptionalCascadeOrRestrict
 OptionalCascadeOrRestrict
  :
  :
  | '<hive>CASCADE'
  | '<hive>CASCADE'
  | '<hive>RESTRICT'
  | '<hive>RESTRICT'
- ;
+ ;

+ 44 - 45
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_create.jison

@@ -239,47 +239,47 @@ TableDefinitionRightPart_EDIT
      // TODO: Don't always sort the keywords as order is important
      // TODO: Don't always sort the keywords as order is important
      var keywords = [];
      var keywords = [];
      if (!$1 && !$2 && !$3 && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
      if (!$1 && !$2 && !$3 && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
-       keywords.push('LIKE');
+       keywords.push({ value: 'LIKE', weight: 1 });
        if (isImpala()) {
        if (isImpala()) {
-         keywords.push('LIKE PARQUET');
+         keywords.push({ value: 'LIKE PARQUET', weight: 1 });
        }
        }
      } else {
      } else {
-       keywords.push('AS');
        if (!$2 && !$3 && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
        if (!$2 && !$3 && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
-         keywords.push('COMMENT');
+         keywords.push({ value: 'COMMENT', weight: 10 });
        }
        }
        if (!$3 && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
        if (!$3 && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
-         keywords.push('PARTITIONED BY');
+         keywords.push({ value: 'PARTITIONED BY', weight: 9 });
        }
        }
        if (isImpala() && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
        if (isImpala() && !$4 && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
-         keywords.push('WITH SERDEPROPERTIES');
+         keywords.push({ value: 'WITH SERDEPROPERTIES', weight: 8 });
        }
        }
        if (isHive() && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
        if (isHive() && !$5 && !$6 && !$7 && !$8 && !$9 && !$10) {
-         keywords.push('CLUSTERED BY');
+         keywords.push({ value: 'CLUSTERED BY', weight: 7 });
        }
        }
        if (isHive() && !$6 && !$7 && !$8 && !$9 && !$10) {
        if (isHive() && !$6 && !$7 && !$8 && !$9 && !$10) {
-         keywords.push('SKEWED BY');
+         keywords.push({ value: 'SKEWED BY', weight: 6 });
        } else if (isHive() && $6 && $6.suggestKeywords && !$7 && !$8 && !$9 && !$10) {
        } else if (isHive() && $6 && $6.suggestKeywords && !$7 && !$8 && !$9 && !$10) {
-         keywords = keywords.concat($6.suggestKeywords); // Get the last optional from SKEWED BY
+         keywords = keywords.concat(createWeightedKeywords($6.suggestKeywords, 6)); // Get the last optional from SKEWED BY
        }
        }
        if (!$7 && !$8 && !$9 && !$10) {
        if (!$7 && !$8 && !$9 && !$10) {
-         keywords.push('ROW FORMAT');
-         keywords.push('STORED AS');
+         keywords.push({ value: 'ROW FORMAT', weight: 5 });
+         keywords.push({ value: 'STORED AS', weight: 5 });
          if (isHive()) {
          if (isHive()) {
-          keywords.push('STORED BY');
+           keywords.push({ value: 'STORED BY', weight: 5 });
          }
          }
        } else if ($7 && $7.suggestKeywords && !$8 && !$9 && !$10) {
        } else if ($7 && $7.suggestKeywords && !$8 && !$9 && !$10) {
-         keywords = keywords.concat($7.suggestKeywords);
+         keywords = keywords.concat(createWeightedKeywords($7.suggestKeywords, 5));
        }
        }
        if (!$8 && !$9 && !$10) {
        if (!$8 && !$9 && !$10) {
-         keywords.push('LOCATION');
+         keywords.push({ value: 'LOCATION', weight: 4 });
        }
        }
        if (!$9 && !$10) {
        if (!$9 && !$10) {
-         keywords.push('TBLPROPERTIES');
+         keywords.push({ value: 'TBLPROPERTIES', weight: 3 });
        }
        }
        if (isImpala() && !$10) {
        if (isImpala() && !$10) {
-         keywords.push('CACHED IN');
+         keywords.push({ value: 'CACHED IN', weight: 2 });
        }
        }
+       keywords.push({ value: 'AS', weight: 1 });
      }
      }
 
 
      if (keywords.length > 0) {
      if (keywords.length > 0) {
@@ -559,7 +559,7 @@ HiveClusteredBy_EDIT
  | '<hive>CLUSTERED' 'BY' ParenthesizedColumnList OptionalHiveSortedBy 'CURSOR'
  | '<hive>CLUSTERED' 'BY' ParenthesizedColumnList OptionalHiveSortedBy 'CURSOR'
    {
    {
      if (!$4) {
      if (!$4) {
-       suggestKeywords(['INTO', 'SORTED BY']);
+       suggestKeywords([{ value: 'INTO', weight: 1 }, { value: 'SORTED BY', weight: 2 }]);
      } else {
      } else {
        suggestKeywords(['INTO']);
        suggestKeywords(['INTO']);
      }
      }
@@ -739,23 +739,23 @@ HiveRowFormat
    OptionalLinesTerminatedBy OptionalNullDefinedAs
    OptionalLinesTerminatedBy OptionalNullDefinedAs
    {
    {
      if (!$2 && !$3 && !$4 && !$5 && !$6) {
      if (!$2 && !$3 && !$4 && !$5 && !$6) {
-       $$ = { suggestKeywords: ['COLLECTION ITEMS TERMINATED BY', 'FIELDS TERMINATED BY', 'LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS'] };
+       $$ = { suggestKeywords: [{ value: 'FIELDS TERMINATED BY', weight: 5 }, { value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }]};
      } else if ($2 && $2.suggestKeywords && !$3 && !$4 && !$5 && !$6) {
      } else if ($2 && $2.suggestKeywords && !$3 && !$4 && !$5 && !$6) {
-       $$ = { suggestKeywords: $2.suggestKeywords.concat(['COLLECTION ITEMS TERMINATED BY', 'LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS']) };
+       $$ = { suggestKeywords: createWeightedKeywords($2.suggestKeywords, 5).concat([{ value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }]) };
      } else if (!$3 && !$4 && !$5 && !$6) {
      } else if (!$3 && !$4 && !$5 && !$6) {
-       $$ = { suggestKeywords: ['COLLECTION ITEMS TERMINATED BY', 'LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS'] };
+       $$ = { suggestKeywords: [{ value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
      } else if (!$4 && !$5 && !$6) {
      } else if (!$4 && !$5 && !$6) {
-       $$ = { suggestKeywords: ['LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS'] };
+       $$ = { suggestKeywords: [{ value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
      } else if (!$5 && !$6) {
      } else if (!$5 && !$6) {
-       $$ = { suggestKeywords: ['LINES TERMINATED BY', 'NULL DEFINED AS'] };
+       $$ = { suggestKeywords: [{ value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
      } else if (!$6) {
      } else if (!$6) {
-       $$ = { suggestKeywords: ['NULL DEFINED AS'] };
+       $$ = { suggestKeywords: [{ value: 'NULL DEFINED AS', weight: 1 }] };
      }
      }
    }
    }
  | '<hive>SERDE' QuotedValue OptionalHiveWithSerdeproperties
  | '<hive>SERDE' QuotedValue OptionalHiveWithSerdeproperties
    {
    {
      if (!$3) {
      if (!$3) {
-       $$ = { suggestKeywords: ['WITH SERDEPROPERTIES'] };
+       $$ = { suggestKeywords: [{ value: 'WITH SERDEPROPERTIES', weight: 1 }] };
      }
      }
    }
    }
  ;
  ;
@@ -777,11 +777,11 @@ ImpalaRowFormat
  : '<impala>DELIMITED' OptionalFieldsTerminatedBy OptionalLinesTerminatedBy
  : '<impala>DELIMITED' OptionalFieldsTerminatedBy OptionalLinesTerminatedBy
    {
    {
      if (!$2 && !$3) {
      if (!$2 && !$3) {
-       $$ = { suggestKeywords: ['FIELDS TERMINATED BY', 'LINES TERMINATED BY'] };
+       $$ = { suggestKeywords: [{ value: 'FIELDS TERMINATED BY', weight: 2 }, { value: 'LINES TERMINATED BY', weight: 1 }] };
      } else if ($2 && $2.suggestKeywords && !$3) {
      } else if ($2 && $2.suggestKeywords && !$3) {
-       $$ = { suggestKeywords: $2.suggestKeywords.concat(['LINES TERMINATED BY']) };
+       $$ = { suggestKeywords: createWeightedKeywords($2.suggestKeywords, 2).concat(['LINES TERMINATED BY']) };
      } else if (!$3) {
      } else if (!$3) {
-       $$ = { suggestKeywords: ['LINES TERMINATED BY'] };
+       $$ = { suggestKeywords: [{ value: 'LINES TERMINATED BY', weight: 1 }] };
      }
      }
    }
    }
  ;
  ;
@@ -981,11 +981,11 @@ ViewDefinition_EDIT
  | AnyCreate AnyView OptionalIfNotExists SchemaQualifiedTableIdentifier OptionalParenthesizedViewColumnList OptionalComment OptionalHiveTblproperties 'CURSOR'
  | AnyCreate AnyView OptionalIfNotExists SchemaQualifiedTableIdentifier OptionalParenthesizedViewColumnList OptionalComment OptionalHiveTblproperties 'CURSOR'
    {
    {
      if (isHive() && !$6 && !$7) {
      if (isHive() && !$6 && !$7) {
-       suggestKeywords(['AS', 'COMMENT', 'TBLPROPERTIES']);
+       suggestKeywords([{ value: 'COMMENT', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, {value: 'AS', weight: 1 }]);
      } else if (isHive() && !$7) {
      } else if (isHive() && !$7) {
-       suggestKeywords(['AS', 'TBLPROPERTIES']);
+       suggestKeywords([{ value: 'TBLPROPERTIES', weight: 2 }, {value: 'AS', weight: 1 }]);
      } else {
      } else {
-       suggestKeywords(['AS']);
+       suggestKeywords([{value: 'AS', weight: 1 }]);
      }
      }
    }
    }
  | AnyCreate AnyView OptionalIfNotExists SchemaQualifiedTableIdentifier OptionalParenthesizedViewColumnList OptionalComment OptionalHiveTblproperties AnyAs 'CURSOR'
  | AnyCreate AnyView OptionalIfNotExists SchemaQualifiedTableIdentifier OptionalParenthesizedViewColumnList OptionalComment OptionalHiveTblproperties AnyAs 'CURSOR'
@@ -1093,9 +1093,9 @@ ImpalaAggregateFunctionDefinition
    HdfsLocation OptionalImpalaInitFn 'CURSOR'
    HdfsLocation OptionalImpalaInitFn 'CURSOR'
    {
    {
      if (!$9) {
      if (!$9) {
-       suggestKeywords(['INIT_FN', 'UPDATE_FN']);
+       suggestKeywords([{value: 'INIT_FN', weight: 2 }, {value: 'UPDATE_FN', weight: 1 }]);
      } else {
      } else {
-       suggestKeywords(['UPDATE_FN']);
+       suggestKeywords([{value: 'UPDATE_FN', weight: 1 }]);
      }
      }
    }
    }
  | AnyCreate '<impala>AGGREGATE' '<impala>FUNCTION' OptionalIfNotExists SchemaQualifiedTableIdentifier ParenthesizedImpalaArgumentList ImpalaReturns
  | AnyCreate '<impala>AGGREGATE' '<impala>FUNCTION' OptionalIfNotExists SchemaQualifiedTableIdentifier ParenthesizedImpalaArgumentList ImpalaReturns
@@ -1107,13 +1107,13 @@ ImpalaAggregateFunctionDefinition
    HdfsLocation OptionalImpalaInitFn ImpalaUpdateFn ImpalaMergeFn OptionalImpalaPrepareFn OptionalImpalaCloseFn OptionalImpalaSerializeFn OptionalImpalaFinalizeFn 'CURSOR'
    HdfsLocation OptionalImpalaInitFn ImpalaUpdateFn ImpalaMergeFn OptionalImpalaPrepareFn OptionalImpalaCloseFn OptionalImpalaSerializeFn OptionalImpalaFinalizeFn 'CURSOR'
    {
    {
      if (!$12 && !$13 && !$14 && !$15) {
      if (!$12 && !$13 && !$14 && !$15) {
-       suggestKeywords(['CLOSE_FN', 'FINALIZE_FN', 'PREPARE_FN', 'SERIALIZE_FN']);
+       suggestKeywords([{value: 'PREPARE_FN', weight: 4 }, {value: 'CLOSE_FN', weight: 3 }, {value: 'SERIALIZE_FN', weight: 2 }, {value: 'FINALIZE_FN', weight: 1 }]);
      } else if ($12 && !$13 && !$14 && !$15) {
      } else if ($12 && !$13 && !$14 && !$15) {
-       suggestKeywords(['CLOSE_FN', 'FINALIZE_FN', 'SERIALIZE_FN']);
+       suggestKeywords([{value: 'CLOSE_FN', weight: 3 }, {value: 'SERIALIZE_FN', weight: 2 }, {value: 'FINALIZE_FN', weight: 1 }]);
      } else if ($13 && !$14 && !$15) {
      } else if ($13 && !$14 && !$15) {
-       suggestKeywords(['FINALIZE_FN', 'SERIALIZE_FN']);
+       suggestKeywords([{value: 'SERIALIZE_FN', weight: 2 }, {value: 'FINALIZE_FN', weight: 1 }]);
      } else if ($14 && !$15) {
      } else if ($14 && !$15) {
-       suggestKeywords(['FINALIZE_FN']);
+       suggestKeywords([{value: 'FINALIZE_FN', weight: 1 }]);
      }
      }
    }
    }
  | AnyCreate '<impala>AGGREGATE' '<impala>FUNCTION' OptionalIfNotExists SchemaQualifiedTableIdentifier ParenthesizedImpalaArgumentList ImpalaReturns_EDIT
  | AnyCreate '<impala>AGGREGATE' '<impala>FUNCTION' OptionalIfNotExists SchemaQualifiedTableIdentifier ParenthesizedImpalaArgumentList ImpalaReturns_EDIT
@@ -1422,26 +1422,25 @@ IndexDefinition_EDIT
    OptionalTblproperties OptionalComment 'CURSOR'
    OptionalTblproperties OptionalComment 'CURSOR'
    {
    {
      if (!$10 && !$11 && !$12 && !$13 && !$14 && !$15 && !$16) {
      if (!$10 && !$11 && !$12 && !$13 && !$14 && !$15 && !$16) {
-       suggestKeywords(['WITH DEFERRED REBUILD', 'IDXPROPERTIES', 'IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'WITH DEFERRED REBUILD', weight: 7 }, { value: 'IDXPROPERTIES', weight: 6 }, { value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$11 && !$12 && !$13 && !$14 && !$15 && !$16) {
      } else if (!$11 && !$12 && !$13 && !$14 && !$15 && !$16) {
-       suggestKeywords(['IDXPROPERTIES', 'IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'IDXPROPERTIES', weight: 6 }, { value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$12 && !$13 && !$14 && !$15 && !$16) {
      } else if (!$12 && !$13 && !$14 && !$15 && !$16) {
-       suggestKeywords(['IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$13 && !$14 && !$15 && !$16) {
      } else if (!$13 && !$14 && !$15 && !$16) {
-       suggestKeywords(['ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if ($13 && $13.suggestKeywords && !$14 && !$15 && !$16) {
      } else if ($13 && $13.suggestKeywords && !$14 && !$15 && !$16) {
-       suggestKeywords($13.suggestKeywords.concat(['LOCATION', 'TBLPROPERTIES', 'COMMENT']));
+       suggestKeywords(createWeightedKeywords($13.suggestKeywords, 4).concat([{ value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]));
      } else if (!$14 && !$15 && !$16) {
      } else if (!$14 && !$15 && !$16) {
-       suggestKeywords(['LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$15 && !$16) {
      } else if (!$15 && !$16) {
-       suggestKeywords(['TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$16) {
      } else if (!$16) {
-       suggestKeywords(['COMMENT']);
+       suggestKeywords([{ value: 'COMMENT', weight: 1 }]);
      }
      }
    }
    }
  ;
  ;
 
 
-// TODO: find index types https://cwiki.apache.org/confluence/display/Hive/IndexDev#IndexDev-CREATEINDEX
 IndexType
 IndexType
  : QuotedValue
  : QuotedValue
  ;
  ;

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

@@ -1169,28 +1169,28 @@ TableExpression_EDIT
      if (!$2) {
      if (!$2) {
        var keywords = [];
        var keywords = [];
        if (typeof $1.hasJoinCondition !== 'undefined' && ! $1.hasJoinCondition) {
        if (typeof $1.hasJoinCondition !== 'undefined' && ! $1.hasJoinCondition) {
-         keywords.push('ON');
+         keywords.push({ value: 'ON', weight: 8 });
          if (isImpala()) {
          if (isImpala()) {
-           keywords.push('USING');
+           keywords.push({ value: 'USING', weight: 8 });
          }
          }
        }
        }
        if (isHive()) {
        if (isHive()) {
          if ($4 && $4.joinType.toUpperCase() === 'JOIN') {
          if ($4 && $4.joinType.toUpperCase() === 'JOIN') {
            keywords = keywords.concat(['CROSS', 'FULL', 'FULL OUTER', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT', 'RIGHT OUTER']);
            keywords = keywords.concat(['CROSS', 'FULL', 'FULL OUTER', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT', 'RIGHT OUTER']);
          } else {
          } else {
-           keywords = keywords.concat(['CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE', 'WINDOW']);
+           keywords = keywords.concat([{ value: 'LATERAL VIEW', weight: 1 }, { value: 'CROSS JOIN', weight: 1 }, { value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'LEFT SEMI JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'WHERE', weight: 6 }, { value: 'GROUP BY', weight: 5 }, { value: 'WINDOW', weight: 4 }, { value: 'ORDER BY', weight: 3 }, { value: 'LIMIT', weight: 2 }]);
          }
          }
        } else if (isImpala()) {
        } else if (isImpala()) {
          if ($4 && $4.joinType.toUpperCase() === 'JOIN') {
          if ($4 && $4.joinType.toUpperCase() === 'JOIN') {
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT ANTI', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT ANTI', 'RIGHT', 'RIGHT OUTER', 'RIGHT SEMI']);
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT ANTI', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT ANTI', 'RIGHT', 'RIGHT OUTER', 'RIGHT SEMI']);
          } else {
          } else {
-           keywords = keywords.concat(['FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'INNER JOIN', 'JOIN', 'LEFT ANTI JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT ANTI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'RIGHT SEMI JOIN', 'WHERE']);
+           keywords = keywords.concat([{ value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'INNER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT ANTI JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'LEFT SEMI JOIN', weight: 1 }, { value: 'RIGHT ANTI JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'RIGHT SEMI JOIN', weight: 1 }, { value: 'WHERE', weight: 5 }, { value: 'GROUP BY', weight: 4 }, { value: 'ORDER BY', weight: 3 }, { value: 'LIMIT', weight: 2 }]);
          }
          }
        } else {
        } else {
          if ($4 && $4.joinType.toUpperCase() === 'JOIN') {
          if ($4 && $4.joinType.toUpperCase() === 'JOIN') {
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT', 'LEFT OUTER', 'RIGHT', 'RIGHT OUTER']);
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT', 'LEFT OUTER', 'RIGHT', 'RIGHT OUTER']);
          } else {
          } else {
-           keywords = keywords.concat(['FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'INNER JOIN', 'JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE']);
+           keywords = keywords.concat([{ value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'INNER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'WHERE', weight: 5 }, { value: 'GROUP BY', weight: 4 }, { value: 'ORDER BY', weight: 3 }, { value: 'LIMIT', weight: 2 }]);
          }
          }
        }
        }
        if ($1.suggestKeywords) {
        if ($1.suggestKeywords) {
@@ -1232,24 +1232,24 @@ OptionalSelectConditions
    {
    {
      if ($1 && !$2 && !$3 && !$4 && !$5) {
      if ($1 && !$2 && !$3 && !$4 && !$5) {
        if (isHive()) {
        if (isHive()) {
-         $$ = getValueExpressionKeywords($1, ['GROUP BY', 'WINDOW', 'ORDER BY', 'LIMIT']);
+         $$ = getValueExpressionKeywords($1, [{ value: 'GROUP BY', weight: 4 }, { value: 'WINDOW', weight: 3 }, { value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }]);
        } else {
        } else {
-         $$ = getValueExpressionKeywords($1, ['GROUP BY', 'ORDER BY', 'LIMIT']);
+         $$ = getValueExpressionKeywords($1, [{ value: 'GROUP BY', weight: 3 }, { value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }]);
        }
        }
        if ($1.columnReference) {
        if ($1.columnReference) {
          $$.columnReference = $1.columnReference
          $$.columnReference = $1.columnReference
        }
        }
      } else if ($2 && !$3 && !$4 && !$5) {
      } else if ($2 && !$3 && !$4 && !$5) {
        if (isHive()) {
        if (isHive()) {
-         $$ = { suggestKeywords: ['WINDOW', 'ORDER BY', 'LIMIT'] };
+         $$ = { suggestKeywords: [{ value: 'WINDOW', weight: 3 }, { value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }] };
        } else {
        } else {
-         $$ = { suggestKeywords: ['ORDER BY', 'LIMIT'] };
+         $$ = { suggestKeywords: [{ value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }] };
        }
        }
      } else if ($3 && !$4 && !$5) {
      } else if ($3 && !$4 && !$5) {
-       $$ = { suggestKeywords: ['ORDER BY', 'LIMIT'] };
+       $$ = { suggestKeywords: [{ value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }] };
      } else if ($4 && !$5) {
      } else if ($4 && !$5) {
        if ($4.suggestKeywords) {
        if ($4.suggestKeywords) {
-         $$ = { suggestKeywords: $4.suggestKeywords.concat(['LIMIT']) };
+         $$ = { suggestKeywords: $4.suggestKeywords.concat([{ value: 'LIMIT', weight: -2 }]) };
        } else {
        } else {
          $$ = { suggestKeywords: ['LIMIT'] };
          $$ = { suggestKeywords: ['LIMIT'] };
        }
        }
@@ -1337,7 +1337,7 @@ OrderByClause
  ;
  ;
 
 
 OrderByClause_EDIT
 OrderByClause_EDIT
- :'ORDER' 'BY' OrderByColumnList_EDIT
+ : 'ORDER' 'BY' OrderByColumnList_EDIT
  | 'ORDER' 'CURSOR'
  | 'ORDER' 'CURSOR'
    {
    {
      suggestKeywords(['BY']);
      suggestKeywords(['BY']);
@@ -2258,7 +2258,7 @@ WindowExpression_EDIT
  : '(' OptionalPartitionBy_EDIT  RightParenthesisOrError
  : '(' OptionalPartitionBy_EDIT  RightParenthesisOrError
  | '(' AnyCursor RightParenthesisOrError
  | '(' AnyCursor RightParenthesisOrError
    {
    {
-     suggestKeywords(['PARTITION BY', 'ORDER BY']);
+     suggestKeywords([{ value: 'PARTITION BY', weight: 2 }, { value: 'ORDER BY', weight: 1 }]);
    }
    }
  | '(' OptionalPartitionBy OptionalOrderByAndWindow_EDIT RightParenthesisOrError
  | '(' OptionalPartitionBy OptionalOrderByAndWindow_EDIT RightParenthesisOrError
  ;
  ;
@@ -2295,7 +2295,7 @@ OptionalOrderByAndWindow_EDIT
     {
     {
       if (!$2) {
       if (!$2) {
         if ($1.suggestKeywords) {
         if ($1.suggestKeywords) {
-          suggestKeywords($1.suggestKeywords.concat(['RANGE BETWEEN', 'ROWS BETWEEN']));
+          suggestKeywords(createWeightedKeywords($1.suggestKeywords, 2).concat([{ value: 'RANGE BETWEEN', weight: 1 }, { value: 'ROWS BETWEEN', weight: 1 }]));
         } else {
         } else {
           suggestKeywords(['RANGE BETWEEN', 'ROWS BETWEEN']);
           suggestKeywords(['RANGE BETWEEN', 'ROWS BETWEEN']);
         }
         }
@@ -2434,12 +2434,12 @@ CastFunction_EDIT
  | 'CAST' '(' ValueExpression_EDIT RightParenthesisOrError                      -> { types: [ 'T' ] }
  | 'CAST' '(' ValueExpression_EDIT RightParenthesisOrError                      -> { types: [ 'T' ] }
  | 'CAST' '(' ValueExpression 'CURSOR' PrimitiveType RightParenthesisOrError
  | 'CAST' '(' ValueExpression 'CURSOR' PrimitiveType RightParenthesisOrError
    {
    {
-     suggestValueExpressionKeywords($3, ['AS']);
+     suggestValueExpressionKeywords($3, [{ value: 'AS', weight: 2 }]);
      $$ =  { types: [ $5.toUpperCase() ] };
      $$ =  { types: [ $5.toUpperCase() ] };
    }
    }
  | 'CAST' '(' ValueExpression 'CURSOR' RightParenthesisOrError
  | 'CAST' '(' ValueExpression 'CURSOR' RightParenthesisOrError
    {
    {
-     suggestValueExpressionKeywords($3, ['AS']);
+     suggestValueExpressionKeywords($3, [{ value: 'AS', weight: 2 }]);
      $$ = { types: [ 'T' ] };
      $$ = { types: [ 'T' ] };
    }
    }
  | 'CAST' '(' ValueExpression AnyAs 'CURSOR' RightParenthesisOrError
  | 'CAST' '(' ValueExpression AnyAs 'CURSOR' RightParenthesisOrError

+ 1 - 1
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_show.jison

@@ -255,7 +255,7 @@ ShowFunctionsStatement_EDIT
  | AnyShow OptionalAggregateOrAnalytic '<impala>FUNCTIONS' OptionalInDatabase 'CURSOR' SingleQuoteValue
  | AnyShow OptionalAggregateOrAnalytic '<impala>FUNCTIONS' OptionalInDatabase 'CURSOR' SingleQuoteValue
    {
    {
      if (!$4) {
      if (!$4) {
-       suggestKeywords(['IN', 'LIKE']);
+       suggestKeywords([{ value: 'IN', weight: 2 }, { value: 'LIKE', weight: 1 }]);
      } else {
      } else {
        suggestKeywords(['LIKE']);
        suggestKeywords(['LIKE']);
      }
      }

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

@@ -626,18 +626,18 @@ CaseRightPart_EDIT
  | CaseWhenThenList 'CURSOR' ValueExpression EndOrError
  | CaseWhenThenList 'CURSOR' ValueExpression EndOrError
    {
    {
      if ($4.toLowerCase() !== 'end') {
      if ($4.toLowerCase() !== 'end') {
-       suggestValueExpressionKeywords($1, ['END', 'ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($1, [{ value: 'END', weight: 3 }, { value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      } else {
      } else {
-       suggestValueExpressionKeywords($1, ['ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($1, [{ value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      }
      }
      $$ = findCaseType($1);
      $$ = findCaseType($1);
    }
    }
  | CaseWhenThenList 'CURSOR' EndOrError
  | CaseWhenThenList 'CURSOR' EndOrError
    {
    {
      if ($3.toLowerCase() !== 'end') {
      if ($3.toLowerCase() !== 'end') {
-       suggestValueExpressionKeywords($1, ['END', 'ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($1, [{ value: 'END', weight: 3 }, { value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      } else {
      } else {
-       suggestValueExpressionKeywords($1, ['ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($1, [{ value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      }
      }
      $$ = findCaseType($1);
      $$ = findCaseType($1);
    }
    }

+ 104 - 73
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.js

@@ -435,28 +435,28 @@ case 661:
      if (!$$[$0-2]) {
      if (!$$[$0-2]) {
        var keywords = [];
        var keywords = [];
        if (typeof $$[$0-3].hasJoinCondition !== 'undefined' && ! $$[$0-3].hasJoinCondition) {
        if (typeof $$[$0-3].hasJoinCondition !== 'undefined' && ! $$[$0-3].hasJoinCondition) {
-         keywords.push('ON');
+         keywords.push({ value: 'ON', weight: 8 });
          if (isImpala()) {
          if (isImpala()) {
-           keywords.push('USING');
+           keywords.push({ value: 'USING', weight: 8 });
          }
          }
        }
        }
        if (isHive()) {
        if (isHive()) {
          if ($$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
          if ($$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
            keywords = keywords.concat(['CROSS', 'FULL', 'FULL OUTER', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT', 'RIGHT OUTER']);
            keywords = keywords.concat(['CROSS', 'FULL', 'FULL OUTER', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT', 'RIGHT OUTER']);
          } else {
          } else {
-           keywords = keywords.concat(['CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE', 'WINDOW']);
+           keywords = keywords.concat([{ value: 'LATERAL VIEW', weight: 1 }, { value: 'CROSS JOIN', weight: 1 }, { value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'LEFT SEMI JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'WHERE', weight: 6 }, { value: 'GROUP BY', weight: 5 }, { value: 'WINDOW', weight: 4 }, { value: 'ORDER BY', weight: 3 }, { value: 'LIMIT', weight: 2 }]);
          }
          }
        } else if (isImpala()) {
        } else if (isImpala()) {
          if ($$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
          if ($$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT ANTI', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT ANTI', 'RIGHT', 'RIGHT OUTER', 'RIGHT SEMI']);
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT ANTI', 'LEFT', 'LEFT OUTER', 'LEFT SEMI', 'RIGHT ANTI', 'RIGHT', 'RIGHT OUTER', 'RIGHT SEMI']);
          } else {
          } else {
-           keywords = keywords.concat(['FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'INNER JOIN', 'JOIN', 'LEFT ANTI JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT ANTI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'RIGHT SEMI JOIN', 'WHERE']);
+           keywords = keywords.concat([{ value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'INNER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT ANTI JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'LEFT SEMI JOIN', weight: 1 }, { value: 'RIGHT ANTI JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'RIGHT SEMI JOIN', weight: 1 }, { value: 'WHERE', weight: 5 }, { value: 'GROUP BY', weight: 4 }, { value: 'ORDER BY', weight: 3 }, { value: 'LIMIT', weight: 2 }]);
          }
          }
        } else {
        } else {
          if ($$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
          if ($$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT', 'LEFT OUTER', 'RIGHT', 'RIGHT OUTER']);
            keywords = keywords.concat(['FULL', 'FULL OUTER', 'INNER', 'LEFT', 'LEFT OUTER', 'RIGHT', 'RIGHT OUTER']);
          } else {
          } else {
-           keywords = keywords.concat(['FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'INNER JOIN', 'JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE']);
+           keywords = keywords.concat([{ value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'INNER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'WHERE', weight: 5 }, { value: 'GROUP BY', weight: 4 }, { value: 'ORDER BY', weight: 3 }, { value: 'LIMIT', weight: 2 }]);
          }
          }
        }
        }
        if ($$[$0-3].suggestKeywords) {
        if ($$[$0-3].suggestKeywords) {
@@ -486,24 +486,24 @@ case 668:
 
 
      if ($$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
      if ($$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
        if (isHive()) {
        if (isHive()) {
-         this.$ = getValueExpressionKeywords($$[$0-4], ['GROUP BY', 'WINDOW', 'ORDER BY', 'LIMIT']);
+         this.$ = getValueExpressionKeywords($$[$0-4], [{ value: 'GROUP BY', weight: 4 }, { value: 'WINDOW', weight: 3 }, { value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }]);
        } else {
        } else {
-         this.$ = getValueExpressionKeywords($$[$0-4], ['GROUP BY', 'ORDER BY', 'LIMIT']);
+         this.$ = getValueExpressionKeywords($$[$0-4], [{ value: 'GROUP BY', weight: 3 }, { value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }]);
        }
        }
        if ($$[$0-4].columnReference) {
        if ($$[$0-4].columnReference) {
          this.$.columnReference = $$[$0-4].columnReference
          this.$.columnReference = $$[$0-4].columnReference
        }
        }
      } else if ($$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
      } else if ($$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
        if (isHive()) {
        if (isHive()) {
-         this.$ = { suggestKeywords: ['WINDOW', 'ORDER BY', 'LIMIT'] };
+         this.$ = { suggestKeywords: [{ value: 'WINDOW', weight: 3 }, { value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }] };
        } else {
        } else {
-         this.$ = { suggestKeywords: ['ORDER BY', 'LIMIT'] };
+         this.$ = { suggestKeywords: [{ value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }] };
        }
        }
      } else if ($$[$0-2] && !$$[$0-1] && !$$[$0]) {
      } else if ($$[$0-2] && !$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: ['ORDER BY', 'LIMIT'] };
+       this.$ = { suggestKeywords: [{ value: 'ORDER BY', weight: 2 }, { value: 'LIMIT', weight: 1 }] };
      } else if ($$[$0-1] && !$$[$0]) {
      } else if ($$[$0-1] && !$$[$0]) {
        if ($$[$0-1].suggestKeywords) {
        if ($$[$0-1].suggestKeywords) {
-         this.$ = { suggestKeywords: $$[$0-1].suggestKeywords.concat(['LIMIT']) };
+         this.$ = { suggestKeywords: $$[$0-1].suggestKeywords.concat([{ value: 'LIMIT', weight: -2 }]) };
        } else {
        } else {
          this.$ = { suggestKeywords: ['LIMIT'] };
          this.$ = { suggestKeywords: ['LIMIT'] };
        }
        }
@@ -1295,7 +1295,7 @@ case 1050:
 break;
 break;
 case 1059:
 case 1059:
 
 
-     suggestKeywords(['PARTITION BY', 'ORDER BY']);
+     suggestKeywords([{ value: 'PARTITION BY', weight: 2 }, { value: 'ORDER BY', weight: 1 }]);
    
    
 break;
 break;
 case 1068:
 case 1068:
@@ -1308,7 +1308,7 @@ case 1069:
 
 
       if (!$$[$0-1]) {
       if (!$$[$0-1]) {
         if ($$[$0-2].suggestKeywords) {
         if ($$[$0-2].suggestKeywords) {
-          suggestKeywords($$[$0-2].suggestKeywords.concat(['RANGE BETWEEN', 'ROWS BETWEEN']));
+          suggestKeywords(createWeightedKeywords($$[$0-2].suggestKeywords, 2).concat([{ value: 'RANGE BETWEEN', weight: 1 }, { value: 'ROWS BETWEEN', weight: 1 }]));
         } else {
         } else {
           suggestKeywords(['RANGE BETWEEN', 'ROWS BETWEEN']);
           suggestKeywords(['RANGE BETWEEN', 'ROWS BETWEEN']);
         }
         }
@@ -1381,13 +1381,13 @@ case 1104: case 1105: case 1195:
 break;
 break;
 case 1109:
 case 1109:
 
 
-     suggestValueExpressionKeywords($$[$0-3], ['AS']);
+     suggestValueExpressionKeywords($$[$0-3], [{ value: 'AS', weight: 2 }]);
      this.$ =  { types: [ $$[$0-1].toUpperCase() ] };
      this.$ =  { types: [ $$[$0-1].toUpperCase() ] };
    
    
 break;
 break;
 case 1110:
 case 1110:
 
 
-     suggestValueExpressionKeywords($$[$0-2], ['AS']);
+     suggestValueExpressionKeywords($$[$0-2], [{ value: 'AS', weight: 2 }]);
      this.$ = { types: [ 'T' ] };
      this.$ = { types: [ 'T' ] };
    
    
 break;
 break;
@@ -1633,9 +1633,9 @@ break;
 case 1191:
 case 1191:
 
 
      if ($$[$0].toLowerCase() !== 'end') {
      if ($$[$0].toLowerCase() !== 'end') {
-       suggestValueExpressionKeywords($$[$0-3], ['END', 'ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($$[$0-3], [{ value: 'END', weight: 3 }, { value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      } else {
      } else {
-       suggestValueExpressionKeywords($$[$0-3], ['ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($$[$0-3], [{ value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      }
      }
      this.$ = findCaseType($$[$0-3]);
      this.$ = findCaseType($$[$0-3]);
    
    
@@ -1643,9 +1643,9 @@ break;
 case 1192:
 case 1192:
 
 
      if ($$[$0].toLowerCase() !== 'end') {
      if ($$[$0].toLowerCase() !== 'end') {
-       suggestValueExpressionKeywords($$[$0-2], ['END', 'ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($$[$0-2], [{ value: 'END', weight: 3 }, { value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      } else {
      } else {
-       suggestValueExpressionKeywords($$[$0-2], ['ELSE', 'WHEN']);
+       suggestValueExpressionKeywords($$[$0-2], [{ value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
      }
      }
      this.$ = findCaseType($$[$0-2]);
      this.$ = findCaseType($$[$0-2]);
    
    
@@ -1749,12 +1749,12 @@ case 1243:
 
 
      if (isHive()) {
      if (isHive()) {
        if (!$$[$0-1]) {
        if (!$$[$0-1]) {
-         suggestKeywords(['COLUMNS', 'IF NOT EXISTS', 'PARTITION']);
+         suggestKeywords([{ value: 'IF NOT EXISTS', weight: 3 }, { value: 'COLUMNS', weight: 2 }, { value: 'PARTITION', weight: 1 }]);
        } else {
        } else {
          suggestKeywords(['PARTITION']);
          suggestKeywords(['PARTITION']);
        }
        }
      } else if (isImpala()) {
      } else if (isImpala()) {
-       suggestKeywords(['COLUMNS', 'PARTITION']);
+       suggestKeywords([{ value: 'COLUMNS', weight: 2 }, { value: 'PARTITION', weight: 1 }]);
      }
      }
    
    
 break;
 break;
@@ -1769,7 +1769,9 @@ case 1248:
        if (!$$[$0-2] && !$$[$0-1]) {
        if (!$$[$0-2] && !$$[$0-1]) {
          suggestKeywords(['LOCATION', 'PARTITION']);
          suggestKeywords(['LOCATION', 'PARTITION']);
        } else if ($$[$0-1] && $$[$0-1].suggestKeywords) {
        } else if ($$[$0-1] && $$[$0-1].suggestKeywords) {
-         suggestKeywords($$[$0-1].suggestKeywords.concat(['PARTITION']));
+         var keywords = createWeightedKeywords($$[$0-1].suggestKeywords, 2);
+         keywords.push({ value: 'PARTITION', weight: 1 });
+         suggestKeywords(keywords);
        } else {
        } else {
          suggestKeywords(['PARTITION']);
          suggestKeywords(['PARTITION']);
        }
        }
@@ -1887,9 +1889,11 @@ case 1306:
 
 
      if (isHive() && !$$[$0-2] && !$$[$0-1]) {
      if (isHive() && !$$[$0-2] && !$$[$0-1]) {
        if ($$[$0-3].suggestKeywords) {
        if ($$[$0-3].suggestKeywords) {
-         suggestKeywords($$[$0-3].suggestKeywords.concat(['AFTER', 'CASCADE', 'FIRST', 'RESTRICT']));
+         var keywords = createWeightedKeywords($$[$0-3].suggestKeywords, 3);
+         keywords = keywords.concat([{ value: 'AFTER', weight: 2 }, { value: 'FIRST', weight: 2 }, { value: 'CASCADE', weight: 1 }, { value: 'RESTRICT', weight: 1 }]);
+         suggestKeywords(keywords);
        } else {
        } else {
-         suggestKeywords(['AFTER', 'CASCADE', 'FIRST', 'RESTRICT']);
+         suggestKeywords([{ value: 'AFTER', weight: 2 }, { value: 'FIRST', weight: 2 }, { value: 'CASCADE', weight: 1 }, { value: 'RESTRICT', weight: 1 }]);
        }
        }
      } else if (isHive() && $$[$0-2] && !$$[$0-1]) {
      } else if (isHive() && $$[$0-2] && !$$[$0-1]) {
        suggestKeywords(['CASCADE', 'RESTRICT']);
        suggestKeywords(['CASCADE', 'RESTRICT']);
@@ -1928,7 +1932,7 @@ break;
 case 1337:
 case 1337:
 
 
      if (isHive()) {
      if (isHive()) {
-       suggestKeywords(['PARTITION', 'IF EXISTS']);
+       suggestKeywords([{ value: 'PARTITION', weight: 1}, { value: 'IF EXISTS', weight: 2 }]);
      } else if (isImpala()) {
      } else if (isImpala()) {
        suggestKeywords(['COLUMN', 'PARTITION']);
        suggestKeywords(['COLUMN', 'PARTITION']);
        suggestColumns();
        suggestColumns();
@@ -2060,47 +2064,47 @@ case 1486:
      // TODO: Don't always sort the keywords as order is important
      // TODO: Don't always sort the keywords as order is important
      var keywords = [];
      var keywords = [];
      if (!$$[$0-10] && !$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      if (!$$[$0-10] && !$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       keywords.push('LIKE');
+       keywords.push({ value: 'LIKE', weight: 1 });
        if (isImpala()) {
        if (isImpala()) {
-         keywords.push('LIKE PARQUET');
+         keywords.push({ value: 'LIKE PARQUET', weight: 1 });
        }
        }
      } else {
      } else {
-       keywords.push('AS');
        if (!$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (!$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('COMMENT');
+         keywords.push({ value: 'COMMENT', weight: 10 });
        }
        }
        if (!$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (!$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('PARTITIONED BY');
+         keywords.push({ value: 'PARTITIONED BY', weight: 9 });
        }
        }
        if (isImpala() && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (isImpala() && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('WITH SERDEPROPERTIES');
+         keywords.push({ value: 'WITH SERDEPROPERTIES', weight: 8 });
        }
        }
        if (isHive() && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (isHive() && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('CLUSTERED BY');
+         keywords.push({ value: 'CLUSTERED BY', weight: 7 });
        }
        }
        if (isHive() && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (isHive() && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('SKEWED BY');
+         keywords.push({ value: 'SKEWED BY', weight: 6 });
        } else if (isHive() && $$[$0-5] && $$[$0-5].suggestKeywords && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        } else if (isHive() && $$[$0-5] && $$[$0-5].suggestKeywords && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords = keywords.concat($$[$0-5].suggestKeywords); // Get the last optional from SKEWED BY
+         keywords = keywords.concat(createWeightedKeywords($$[$0-5].suggestKeywords, 6)); // Get the last optional from SKEWED BY
        }
        }
        if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('ROW FORMAT');
-         keywords.push('STORED AS');
+         keywords.push({ value: 'ROW FORMAT', weight: 5 });
+         keywords.push({ value: 'STORED AS', weight: 5 });
          if (isHive()) {
          if (isHive()) {
-          keywords.push('STORED BY');
+           keywords.push({ value: 'STORED BY', weight: 5 });
          }
          }
        } else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        } else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords = keywords.concat($$[$0-4].suggestKeywords);
+         keywords = keywords.concat(createWeightedKeywords($$[$0-4].suggestKeywords, 5));
        }
        }
        if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
        if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-         keywords.push('LOCATION');
+         keywords.push({ value: 'LOCATION', weight: 4 });
        }
        }
        if (!$$[$0-2] && !$$[$0-1]) {
        if (!$$[$0-2] && !$$[$0-1]) {
-         keywords.push('TBLPROPERTIES');
+         keywords.push({ value: 'TBLPROPERTIES', weight: 3 });
        }
        }
        if (isImpala() && !$$[$0-1]) {
        if (isImpala() && !$$[$0-1]) {
-         keywords.push('CACHED IN');
+         keywords.push({ value: 'CACHED IN', weight: 2 });
        }
        }
+       keywords.push({ value: 'AS', weight: 1 });
      }
      }
 
 
      if (keywords.length > 0) {
      if (keywords.length > 0) {
@@ -2152,7 +2156,7 @@ break;
 case 1580:
 case 1580:
 
 
      if (!$$[$0-1]) {
      if (!$$[$0-1]) {
-       suggestKeywords(['INTO', 'SORTED BY']);
+       suggestKeywords([{ value: 'INTO', weight: 1 }, { value: 'SORTED BY', weight: 2 }]);
      } else {
      } else {
        suggestKeywords(['INTO']);
        suggestKeywords(['INTO']);
      }
      }
@@ -2207,35 +2211,35 @@ break;
 case 1640:
 case 1640:
 
 
      if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
      if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: ['COLLECTION ITEMS TERMINATED BY', 'FIELDS TERMINATED BY', 'LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS'] };
+       this.$ = { suggestKeywords: [{ value: 'FIELDS TERMINATED BY', weight: 5 }, { value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }]};
      } else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
      } else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: $$[$0-4].suggestKeywords.concat(['COLLECTION ITEMS TERMINATED BY', 'LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS']) };
+       this.$ = { suggestKeywords: createWeightedKeywords($$[$0-4].suggestKeywords, 5).concat([{ value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }]) };
      } else if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
      } else if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: ['COLLECTION ITEMS TERMINATED BY', 'LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS'] };
+       this.$ = { suggestKeywords: [{ value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
      } else if (!$$[$0-2] && !$$[$0-1] && !$$[$0]) {
      } else if (!$$[$0-2] && !$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: ['LINES TERMINATED BY', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS'] };
+       this.$ = { suggestKeywords: [{ value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
      } else if (!$$[$0-1] && !$$[$0]) {
      } else if (!$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: ['LINES TERMINATED BY', 'NULL DEFINED AS'] };
+       this.$ = { suggestKeywords: [{ value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
      } else if (!$$[$0]) {
      } else if (!$$[$0]) {
-       this.$ = { suggestKeywords: ['NULL DEFINED AS'] };
+       this.$ = { suggestKeywords: [{ value: 'NULL DEFINED AS', weight: 1 }] };
      }
      }
    
    
 break;
 break;
 case 1641:
 case 1641:
 
 
      if (!$$[$0]) {
      if (!$$[$0]) {
-       this.$ = { suggestKeywords: ['WITH SERDEPROPERTIES'] };
+       this.$ = { suggestKeywords: [{ value: 'WITH SERDEPROPERTIES', weight: 1 }] };
      }
      }
    
    
 break;
 break;
 case 1647:
 case 1647:
 
 
      if (!$$[$0-1] && !$$[$0]) {
      if (!$$[$0-1] && !$$[$0]) {
-       this.$ = { suggestKeywords: ['FIELDS TERMINATED BY', 'LINES TERMINATED BY'] };
+       this.$ = { suggestKeywords: [{ value: 'FIELDS TERMINATED BY', weight: 2 }, { value: 'LINES TERMINATED BY', weight: 1 }] };
      } else if ($$[$0-1] && $$[$0-1].suggestKeywords && !$$[$0]) {
      } else if ($$[$0-1] && $$[$0-1].suggestKeywords && !$$[$0]) {
-       this.$ = { suggestKeywords: $$[$0-1].suggestKeywords.concat(['LINES TERMINATED BY']) };
+       this.$ = { suggestKeywords: createWeightedKeywords($$[$0-1].suggestKeywords, 2).concat(['LINES TERMINATED BY']) };
      } else if (!$$[$0]) {
      } else if (!$$[$0]) {
-       this.$ = { suggestKeywords: ['LINES TERMINATED BY'] };
+       this.$ = { suggestKeywords: [{ value: 'LINES TERMINATED BY', weight: 1 }] };
      }
      }
    
    
 break;
 break;
@@ -2295,11 +2299,11 @@ break;
 case 1699:
 case 1699:
 
 
      if (isHive() && !$$[$0-2] && !$$[$0-1]) {
      if (isHive() && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['AS', 'COMMENT', 'TBLPROPERTIES']);
+       suggestKeywords([{ value: 'COMMENT', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, {value: 'AS', weight: 1 }]);
      } else if (isHive() && !$$[$0-1]) {
      } else if (isHive() && !$$[$0-1]) {
-       suggestKeywords(['AS', 'TBLPROPERTIES']);
+       suggestKeywords([{ value: 'TBLPROPERTIES', weight: 2 }, {value: 'AS', weight: 1 }]);
      } else {
      } else {
-       suggestKeywords(['AS']);
+       suggestKeywords([{value: 'AS', weight: 1 }]);
      }
      }
    
    
 break;
 break;
@@ -2335,9 +2339,9 @@ break;
 case 1734:
 case 1734:
 
 
      if (!$$[$0-1]) {
      if (!$$[$0-1]) {
-       suggestKeywords(['INIT_FN', 'UPDATE_FN']);
+       suggestKeywords([{value: 'INIT_FN', weight: 2 }, {value: 'UPDATE_FN', weight: 1 }]);
      } else {
      } else {
-       suggestKeywords(['UPDATE_FN']);
+       suggestKeywords([{value: 'UPDATE_FN', weight: 1 }]);
      }
      }
    
    
 break;
 break;
@@ -2349,13 +2353,13 @@ break;
 case 1736:
 case 1736:
 
 
      if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['CLOSE_FN', 'FINALIZE_FN', 'PREPARE_FN', 'SERIALIZE_FN']);
+       suggestKeywords([{value: 'PREPARE_FN', weight: 4 }, {value: 'CLOSE_FN', weight: 3 }, {value: 'SERIALIZE_FN', weight: 2 }, {value: 'FINALIZE_FN', weight: 1 }]);
      } else if ($$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if ($$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['CLOSE_FN', 'FINALIZE_FN', 'SERIALIZE_FN']);
+       suggestKeywords([{value: 'CLOSE_FN', weight: 3 }, {value: 'SERIALIZE_FN', weight: 2 }, {value: 'FINALIZE_FN', weight: 1 }]);
      } else if ($$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if ($$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['FINALIZE_FN', 'SERIALIZE_FN']);
+       suggestKeywords([{value: 'SERIALIZE_FN', weight: 2 }, {value: 'FINALIZE_FN', weight: 1 }]);
      } else if ($$[$0-2] && !$$[$0-1]) {
      } else if ($$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['FINALIZE_FN']);
+       suggestKeywords([{value: 'FINALIZE_FN', weight: 1 }]);
      }
      }
    
    
 break;
 break;
@@ -2398,21 +2402,21 @@ break;
 case 1829:
 case 1829:
 
 
      if (!$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      if (!$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['WITH DEFERRED REBUILD', 'IDXPROPERTIES', 'IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'WITH DEFERRED REBUILD', weight: 7 }, { value: 'IDXPROPERTIES', weight: 6 }, { value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if (!$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['IDXPROPERTIES', 'IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'IDXPROPERTIES', weight: 6 }, { value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if (!$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords($$[$0-4].suggestKeywords.concat(['LOCATION', 'TBLPROPERTIES', 'COMMENT']));
+       suggestKeywords(createWeightedKeywords($$[$0-4].suggestKeywords, 4).concat([{ value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]));
      } else if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
      } else if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['LOCATION', 'TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$$[$0-2] && !$$[$0-1]) {
      } else if (!$$[$0-2] && !$$[$0-1]) {
-       suggestKeywords(['TBLPROPERTIES', 'COMMENT']);
+       suggestKeywords([{ value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
      } else if (!$$[$0-1]) {
      } else if (!$$[$0-1]) {
-       suggestKeywords(['COMMENT']);
+       suggestKeywords([{ value: 'COMMENT', weight: 1 }]);
      }
      }
    
    
 break;
 break;
@@ -2586,7 +2590,7 @@ break;
 case 1943:
 case 1943:
 
 
      if (!$$[$0-2]) {
      if (!$$[$0-2]) {
-       suggestKeywords(['IN', 'LIKE']);
+       suggestKeywords([{ value: 'IN', weight: 2 }, { value: 'LIKE', weight: 1 }]);
      } else {
      } else {
        suggestKeywords(['LIKE']);
        suggestKeywords(['LIKE']);
      }
      }
@@ -3199,7 +3203,7 @@ var prioritizeSuggestions = function () {
       delete parser.yy.result.colRef;
       delete parser.yy.result.colRef;
       if (typeof parser.yy.result.suggestColRefKeywords !== 'undefined') {
       if (typeof parser.yy.result.suggestColRefKeywords !== 'undefined') {
         Object.keys(parser.yy.result.suggestColRefKeywords).forEach(function (type) {
         Object.keys(parser.yy.result.suggestColRefKeywords).forEach(function (type) {
-          parser.yy.result.suggestKeywords = parser.yy.result.suggestKeywords.concat(parser.yy.result.suggestColRefKeywords[type]);
+          parser.yy.result.suggestKeywords = parser.yy.result.suggestKeywords.concat(createWeightedKeywords(parser.yy.result.suggestColRefKeywords[type], -1));
         });
         });
         delete parser.yy.result.suggestColRefKeywords;
         delete parser.yy.result.suggestColRefKeywords;
       }
       }
@@ -3607,14 +3611,41 @@ var checkForKeywords = function (expression) {
       suggestKeywords(expression.suggestKeywords);
       suggestKeywords(expression.suggestKeywords);
     }
     }
     if (expression.suggestColRefKeywords) {
     if (expression.suggestColRefKeywords) {
-      suggestColRefKeywords(expression.suggestColRefKeywords)
+      suggestColRefKeywords(expression.suggestColRefKeywords);
       addColRefIfExists(expression);
       addColRefIfExists(expression);
     }
     }
   }
   }
 };
 };
 
 
+var createWeightedKeywords = function (keywords, weight) {
+  var result = [];
+  keywords.forEach(function (keyword) {
+    if (typeof keyword.weight !== 'undefined') {
+      keyword.weight = weight + (keyword.weight / 10);
+      result.push(keyword);
+    } else {
+      result.push({value: keyword, weight: weight });
+    }
+  });
+  return result;
+};
+
 var suggestKeywords = function (keywords) {
 var suggestKeywords = function (keywords) {
-  parser.yy.result.suggestKeywords = keywords.sort();
+  var weightedKeywords = [];
+  keywords.forEach(function (keyword) {
+    if (typeof keyword.weight !== 'undefined') {
+      weightedKeywords.push(keyword);
+    } else {
+      weightedKeywords.push({ value: keyword, weight: -1 })
+    }
+  });
+  weightedKeywords.sort(function (a, b) {
+    if (a.weight !== b.weight) {
+      return b.weight - a.weight;
+    }
+    return a.value.localeCompare(b.value);
+  });
+  parser.yy.result.suggestKeywords = weightedKeywords;
 };
 };
 
 
 var suggestColRefKeywords = function (colRefKeywords) {
 var suggestColRefKeywords = function (colRefKeywords) {

+ 30 - 3
desktop/core/src/desktop/static/desktop/js/autocomplete/sql_support.js

@@ -226,7 +226,7 @@ var prioritizeSuggestions = function () {
       delete parser.yy.result.colRef;
       delete parser.yy.result.colRef;
       if (typeof parser.yy.result.suggestColRefKeywords !== 'undefined') {
       if (typeof parser.yy.result.suggestColRefKeywords !== 'undefined') {
         Object.keys(parser.yy.result.suggestColRefKeywords).forEach(function (type) {
         Object.keys(parser.yy.result.suggestColRefKeywords).forEach(function (type) {
-          parser.yy.result.suggestKeywords = parser.yy.result.suggestKeywords.concat(parser.yy.result.suggestColRefKeywords[type]);
+          parser.yy.result.suggestKeywords = parser.yy.result.suggestKeywords.concat(createWeightedKeywords(parser.yy.result.suggestColRefKeywords[type], -1));
         });
         });
         delete parser.yy.result.suggestColRefKeywords;
         delete parser.yy.result.suggestColRefKeywords;
       }
       }
@@ -634,14 +634,41 @@ var checkForKeywords = function (expression) {
       suggestKeywords(expression.suggestKeywords);
       suggestKeywords(expression.suggestKeywords);
     }
     }
     if (expression.suggestColRefKeywords) {
     if (expression.suggestColRefKeywords) {
-      suggestColRefKeywords(expression.suggestColRefKeywords)
+      suggestColRefKeywords(expression.suggestColRefKeywords);
       addColRefIfExists(expression);
       addColRefIfExists(expression);
     }
     }
   }
   }
 };
 };
 
 
+var createWeightedKeywords = function (keywords, weight) {
+  var result = [];
+  keywords.forEach(function (keyword) {
+    if (typeof keyword.weight !== 'undefined') {
+      keyword.weight = weight + (keyword.weight / 10);
+      result.push(keyword);
+    } else {
+      result.push({value: keyword, weight: weight });
+    }
+  });
+  return result;
+};
+
 var suggestKeywords = function (keywords) {
 var suggestKeywords = function (keywords) {
-  parser.yy.result.suggestKeywords = keywords.sort();
+  var weightedKeywords = [];
+  keywords.forEach(function (keyword) {
+    if (typeof keyword.weight !== 'undefined') {
+      weightedKeywords.push(keyword);
+    } else {
+      weightedKeywords.push({ value: keyword, weight: -1 })
+    }
+  });
+  weightedKeywords.sort(function (a, b) {
+    if (a.weight !== b.weight) {
+      return b.weight - a.weight;
+    }
+    return a.value.localeCompare(b.value);
+  });
+  parser.yy.result.suggestKeywords = weightedKeywords;
 };
 };
 
 
 var suggestColRefKeywords = function (colRefKeywords) {
 var suggestColRefKeywords = function (colRefKeywords) {

+ 16 - 13
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter2.js

@@ -47,9 +47,10 @@
     if (parseResult.suggestKeywords) {
     if (parseResult.suggestKeywords) {
       parseResult.suggestKeywords.forEach(function (keyword) {
       parseResult.suggestKeywords.forEach(function (keyword) {
         completions.push({
         completions.push({
-          value: parseResult.lowerCase ? keyword.toLowerCase() : keyword,
+          value: parseResult.lowerCase ? keyword.value.toLowerCase() : keyword.value,
           meta: 'keyword',
           meta: 'keyword',
-          type: 'keyword'
+          type: 'keyword',
+          weight: keyword.weight
         });
         });
       });
       });
     }
     }
@@ -421,7 +422,6 @@
   SqlAutocompleter2.prototype.finalizeCompletions = function (completions, callback, editor) {
   SqlAutocompleter2.prototype.finalizeCompletions = function (completions, callback, editor) {
     var self = this;
     var self = this;
     self.sortCompletions(completions);
     self.sortCompletions(completions);
-
     var currentScore = 1000;
     var currentScore = 1000;
     completions.forEach(function (completion) {
     completions.forEach(function (completion) {
       completion.score = currentScore;
       completion.score = currentScore;
@@ -436,20 +436,23 @@
   };
   };
 
 
   var typeOrder = {
   var typeOrder = {
-    'star': 1,
-    'column': 2,
-    'sample': 3,
-    'table': 4,
-    'database': 5,
-    'identifier': 6,
-    'keyword': 7,
-    'function': 8
+    'column': 1,
+    'sample': 2,
+    'table': 3,
+    'database': 4,
+    'identifier': 5,
+    'keyword': 6,
+    'function': 7
   };
   };
 
 
   SqlAutocompleter2.prototype.sortCompletions = function (completions) {
   SqlAutocompleter2.prototype.sortCompletions = function (completions) {
     completions.sort(function (a, b) {
     completions.sort(function (a, b) {
-      if (typeOrder[a.value === '*' ? 'star' : a.type] !== typeOrder[b.value === '*' ? 'star' : b.type]) {
-        return typeOrder[a.value == '*' ? 'star' : a.type] - typeOrder[b.value == '*' ? 'star' : b.type];
+      if (typeof a.weight !== 'undefined' && typeof b.weight !== 'undefined' && b.weight !== a.weight) {
+        return b.weight - a.weight;
+      } else if (typeof a.weight !== 'undefined' && typeof b.weight === 'undefined') {
+        return -1;
+      } else if (typeof b.weight !== 'undefined' && typeof a.weight === 'undefined') {
+        return 1;
       }
       }
       return a.value.localeCompare(b.value);
       return a.value.localeCompare(b.value);
     });
     });

+ 6 - 6
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecAlter.js

@@ -130,7 +130,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['COLUMNS', 'IF NOT EXISTS', 'PARTITION']
+              suggestKeywords: ['IF NOT EXISTS', 'COLUMNS', 'PARTITION']
             }
             }
           });
           });
         });
         });
@@ -339,7 +339,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AFTER', 'CASCADE', 'COMMENT', 'FIRST', 'RESTRICT']
+              suggestKeywords: ['COMMENT', 'AFTER', 'FIRST', 'CASCADE', 'RESTRICT']
             }
             }
           });
           });
         });
         });
@@ -352,7 +352,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AFTER', 'CASCADE', 'FIRST', 'RESTRICT']
+              suggestKeywords: ['AFTER', 'FIRST', 'CASCADE', 'RESTRICT']
             }
             }
           });
           });
         });
         });
@@ -456,7 +456,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['INTO', 'SORTED BY']
+              suggestKeywords: ['SORTED BY', 'INTO']
             }
             }
           });
           });
         });
         });
@@ -825,7 +825,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AFTER', 'CASCADE', 'COMMENT', 'FIRST', 'RESTRICT']
+              suggestKeywords: ['COMMENT', 'AFTER', 'FIRST', 'CASCADE', 'RESTRICT']
             }
             }
           });
           });
         });
         });
@@ -838,7 +838,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AFTER', 'CASCADE', 'FIRST', 'RESTRICT']
+              suggestKeywords: ['AFTER', 'FIRST', 'CASCADE', 'RESTRICT']
             }
             }
           });
           });
         });
         });

+ 10 - 10
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecCreate.js

@@ -340,7 +340,7 @@ define([
             dialect: 'impala',
             dialect: 'impala',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AS', 'CACHED IN', 'TBLPROPERTIES']
+              suggestKeywords: ['TBLPROPERTIES', 'CACHED IN', 'AS']
             }
             }
           });
           });
         });
         });
@@ -753,7 +753,7 @@ define([
             dialect: 'hive',
             dialect: 'hive',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AS', 'TBLPROPERTIES']
+              suggestKeywords: ['TBLPROPERTIES', 'AS']
             }
             }
           });
           });
         });
         });
@@ -777,7 +777,7 @@ define([
             dialect: 'hive',
             dialect: 'hive',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['INTO', 'SORTED BY']
+              suggestKeywords: ['SORTED BY', 'INTO']
             }
             }
           });
           });
         });
         });
@@ -945,7 +945,7 @@ define([
             dialect: 'hive',
             dialect: 'hive',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AS', 'COLLECTION ITEMS TERMINATED BY', 'FIELDS TERMINATED BY', 'LINES TERMINATED BY', 'LOCATION', 'MAP KEYS TERMINATED BY', 'NULL DEFINED AS', 'STORED AS', 'TBLPROPERTIES']
+              suggestKeywords: ['FIELDS TERMINATED BY', 'COLLECTION ITEMS TERMINATED BY', 'MAP KEYS TERMINATED BY', 'LINES TERMINATED BY', 'NULL DEFINED AS', 'STORED AS', 'LOCATION', 'TBLPROPERTIES', 'AS']
             }
             }
           });
           });
         });
         });
@@ -1401,7 +1401,7 @@ define([
             dialect: 'hive',
             dialect: 'hive',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AS', 'COMMENT', 'TBLPROPERTIES']
+              suggestKeywords: ['COMMENT', 'TBLPROPERTIES', 'AS']
             }
             }
           });
           });
         });
         });
@@ -2044,7 +2044,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['COMMENT', 'IDXPROPERTIES', 'IN TABLE', 'LOCATION', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'TBLPROPERTIES', 'WITH DEFERRED REBUILD']
+            suggestKeywords: ['WITH DEFERRED REBUILD', 'IDXPROPERTIES', 'IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']
           }
           }
         });
         });
       });
       });
@@ -2083,7 +2083,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['COMMENT', 'IDXPROPERTIES', 'IN TABLE', 'LOCATION', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'TBLPROPERTIES']
+            suggestKeywords: ['IDXPROPERTIES', 'IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']
           }
           }
         });
         });
       });
       });
@@ -2096,7 +2096,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['COMMENT', 'IN TABLE', 'LOCATION', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'TBLPROPERTIES']
+            suggestKeywords: ['IN TABLE', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']
           }
           }
         });
         });
       });
       });
@@ -2136,7 +2136,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['COMMENT', 'LOCATION', 'ROW FORMAT', 'STORED AS', 'STORED BY', 'TBLPROPERTIES']
+            suggestKeywords: ['ROW FORMAT', 'STORED AS', 'STORED BY', 'LOCATION', 'TBLPROPERTIES', 'COMMENT']
           }
           }
         });
         });
       });
       });
@@ -2254,7 +2254,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['COMMENT', 'TBLPROPERTIES']
+            suggestKeywords: ['TBLPROPERTIES', 'COMMENT']
           }
           }
         });
         });
       });
       });

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

@@ -102,7 +102,7 @@ define([
         hasLocations: true,
         hasLocations: true,
         expectedResult: {
         expectedResult: {
           lowerCase: false,
           lowerCase: false,
-          suggestKeywords: ['FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'INNER JOIN', 'JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE']
+          suggestKeywords: ['WHERE', 'GROUP BY', 'ORDER BY', 'LIMIT', 'FULL JOIN', 'FULL OUTER JOIN', 'INNER JOIN', 'JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN']
         }
         }
       });
       });
     });
     });
@@ -2551,7 +2551,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE', 'WINDOW']
+            suggestKeywords: ['WHERE', 'GROUP BY', 'WINDOW', 'ORDER BY', 'LIMIT', 'CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN']
           }
           }
         });
         });
       });
       });
@@ -2564,7 +2564,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE', 'WINDOW']
+            suggestKeywords: ['WHERE', 'GROUP BY', 'WINDOW', 'ORDER BY', 'LIMIT', 'CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN']
           }
           }
         });
         });
       });
       });
@@ -2603,7 +2603,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'WHERE', 'WINDOW']
+            suggestKeywords: ['WHERE', 'GROUP BY', 'WINDOW', 'ORDER BY', 'LIMIT', 'CROSS JOIN', 'FULL JOIN', 'FULL OUTER JOIN', 'JOIN', 'LATERAL VIEW', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN']
           }
           }
         });
         });
       });
       });
@@ -3134,7 +3134,7 @@ define([
           dialect: 'impala',
           dialect: 'impala',
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['FULL JOIN', 'FULL OUTER JOIN', 'GROUP BY', 'INNER JOIN', 'JOIN', 'LEFT ANTI JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'LIMIT', 'ORDER BY', 'RIGHT ANTI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'RIGHT SEMI JOIN', 'WHERE'],
+            suggestKeywords: ['WHERE', 'GROUP BY', 'ORDER BY', 'LIMIT', 'FULL JOIN', 'FULL OUTER JOIN', 'INNER JOIN', 'JOIN', 'LEFT ANTI JOIN', 'LEFT JOIN', 'LEFT OUTER JOIN', 'LEFT SEMI JOIN', 'RIGHT ANTI JOIN', 'RIGHT JOIN', 'RIGHT OUTER JOIN', 'RIGHT SEMI JOIN'],
             locations: [
             locations: [
               {type: 'table', location: { first_line: 1, last_line: 1, first_column: 15, last_column: 25}, table: 'testTableA'},
               {type: 'table', location: { first_line: 1, last_line: 1, first_column: 15, last_column: 25}, table: 'testTableA'},
               {type: 'table', location: { first_line: 1, last_line: 1, first_column: 31, last_column: 41}, table: 'testTableB'}
               {type: 'table', location: { first_line: 1, last_line: 1, first_column: 31, last_column: 41}, table: 'testTableB'}
@@ -4238,7 +4238,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['<', '<=', '<>', '=', '>', '>=', 'AND', 'BETWEEN', 'GROUP BY', 'IN', 'IS NOT NULL', 'IS NULL', 'LIMIT', 'NOT BETWEEN', 'NOT IN', 'OR', 'ORDER BY']
+            suggestKeywords: ['GROUP BY', 'ORDER BY', 'LIMIT', '<', '<=', '<>', '=', '>', '>=', 'AND', 'BETWEEN', 'IN', 'IS NOT NULL', 'IS NULL', 'NOT BETWEEN', 'NOT IN', 'OR']
           }
           }
         });
         });
       });
       });
@@ -4251,7 +4251,7 @@ define([
           hasLocations: true,
           hasLocations: true,
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['<', '<=', '<>', '=', '>', '>=', 'AND', 'BETWEEN', 'GROUP BY', 'IN', 'IS NOT NULL', 'IS NULL', 'LIMIT', 'NOT BETWEEN', 'NOT IN', 'OR', 'ORDER BY']
+            suggestKeywords: ['GROUP BY', 'ORDER BY', 'LIMIT', '<', '<=', '<>', '=', '>', '>=', 'AND', 'BETWEEN', 'IN', 'IS NOT NULL', 'IS NULL', 'NOT BETWEEN', 'NOT IN', 'OR']
           }
           }
         });
         });
       });
       });
@@ -4451,7 +4451,7 @@ define([
             hasLocations: true,
             hasLocations: true,
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['<', '<=', '<=>', '<>', '=', '>', '>=', 'AND', 'BETWEEN', 'GROUP BY', 'IN', 'IS NOT NULL', 'IS NULL', 'LIMIT', 'NOT BETWEEN', 'NOT IN', 'OR', 'ORDER BY', 'WINDOW']
+              suggestKeywords: ['GROUP BY', 'WINDOW', 'ORDER BY', 'LIMIT', '<', '<=', '<=>', '<>', '=', '>', '>=', 'AND', 'BETWEEN',  'IN', 'IS NOT NULL', 'IS NULL',  'NOT BETWEEN', 'NOT IN', 'OR']
             }
             }
           });
           });
         });
         });
@@ -4778,7 +4778,7 @@ define([
               hasLocations: true,
               hasLocations: true,
               expectedResult: {
               expectedResult: {
                 lowerCase: false,
                 lowerCase: false,
-                suggestKeywords: ['ASC', 'DESC', 'LIMIT', 'NULLS FIRST', 'NULLS LAST']
+                suggestKeywords: ['ASC', 'DESC', 'NULLS FIRST', 'NULLS LAST', 'LIMIT']
               }
               }
             });
             });
           });
           });
@@ -4791,7 +4791,7 @@ define([
               hasLocations: true,
               hasLocations: true,
               expectedResult: {
               expectedResult: {
                 lowerCase: false,
                 lowerCase: false,
-                suggestKeywords: ['ASC', 'DESC', 'LIMIT', 'NULLS FIRST', 'NULLS LAST']
+                suggestKeywords: ['ASC', 'DESC', 'NULLS FIRST', 'NULLS LAST', 'LIMIT']
               }
               }
             });
             });
           });
           });
@@ -4817,7 +4817,7 @@ define([
               hasLocations: true,
               hasLocations: true,
               expectedResult: {
               expectedResult: {
                 lowerCase: false,
                 lowerCase: false,
-                suggestKeywords: ['ASC', 'DESC', 'LIMIT', 'NULLS FIRST', 'NULLS LAST']
+                suggestKeywords: ['ASC', 'DESC', 'NULLS FIRST', 'NULLS LAST', 'LIMIT']
               }
               }
             });
             });
 
 

+ 8 - 0
desktop/core/src/desktop/static/desktop/spec/autocompleterTestUtils.js

@@ -41,6 +41,14 @@ define([
       toEqualDefinition : function() {
       toEqualDefinition : function() {
         return {
         return {
           compare: function(actualResponse, testDefinition) {
           compare: function(actualResponse, testDefinition) {
+            if (actualResponse.suggestKeywords) {
+              var weightFreeKeywords = [];
+              actualResponse.suggestKeywords.forEach(function (keyword) {
+                weightFreeKeywords.push(keyword.value);
+              });
+              actualResponse.suggestKeywords = weightFreeKeywords;
+            }
+
             if (actualResponse.errors) {
             if (actualResponse.errors) {
               var allRecoverable = true;
               var allRecoverable = true;
               actualResponse.errors.forEach(function (error) {
               actualResponse.errors.forEach(function (error) {