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

HUE-7738 [editor] Move type resolution from parsers to the autocompleter

Johan Ahlen 5 жил өмнө
parent
commit
814aedacae
22 өөрчлөгдсөн 600 нэмэгдсэн , 338 устгасан
  1. 5 17
      desktop/core/src/desktop/js/parse/sql/calcite/sqlParseSupport.js
  2. 30 12
      desktop/core/src/desktop/js/parse/sql/calcite/test/calciteAutocompleteParser.Select.test.js
  3. 5 17
      desktop/core/src/desktop/js/parse/sql/druid/sqlParseSupport.js
  4. 30 12
      desktop/core/src/desktop/js/parse/sql/druid/test/druidAutocompleteParser.Select.test.js
  5. 5 17
      desktop/core/src/desktop/js/parse/sql/elasticsearch/sqlParseSupport.js
  6. 30 12
      desktop/core/src/desktop/js/parse/sql/elasticsearch/test/elasticsearchAutocompleteParser.Select.test.js
  7. 5 17
      desktop/core/src/desktop/js/parse/sql/flink/sqlParseSupport.js
  8. 30 12
      desktop/core/src/desktop/js/parse/sql/flink/test/flinkAutocompleteParser.Select.test.js
  9. 5 17
      desktop/core/src/desktop/js/parse/sql/generic/sqlParseSupport.js
  10. 30 12
      desktop/core/src/desktop/js/parse/sql/generic/test/genericAutocompleteParser.Select.test.js
  11. 5 17
      desktop/core/src/desktop/js/parse/sql/hive/sqlParseSupport.js
  12. 93 31
      desktop/core/src/desktop/js/parse/sql/hive/test/hiveAutocompleteParser.Select.test.js
  13. 5 17
      desktop/core/src/desktop/js/parse/sql/impala/sqlParseSupport.js
  14. 97 32
      desktop/core/src/desktop/js/parse/sql/impala/test/impalaAutocompleteParser.Select.test.js
  15. 5 17
      desktop/core/src/desktop/js/parse/sql/ksql/sqlParseSupport.js
  16. 30 12
      desktop/core/src/desktop/js/parse/sql/ksql/test/ksqlAutocompleteParser.Select.test.js
  17. 5 17
      desktop/core/src/desktop/js/parse/sql/phoenix/sqlParseSupport.js
  18. 26 12
      desktop/core/src/desktop/js/parse/sql/phoenix/test/phoenixAutocompleteParser.Select.test.js
  19. 5 9
      desktop/core/src/desktop/js/parse/sql/presto/sqlParseSupport.js
  20. 84 28
      desktop/core/src/desktop/js/parse/sql/presto/test/prestoAutocompleteParser.Select.test.js
  21. 32 1
      desktop/core/src/desktop/js/sql/autocompleteResults.js
  22. 38 0
      desktop/core/src/desktop/js/sql/reference/sqlReferenceRepository.js

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/calcite/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 30 - 12
desktop/core/src/desktop/js/parse/sql/calcite/test/calciteAutocompleteParser.Select.test.js

@@ -2226,11 +2226,14 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2243,11 +2246,14 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2283,11 +2289,14 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -3131,11 +3140,14 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3148,11 +3160,14 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5943,7 +5958,6 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5953,7 +5967,11 @@ describe('calciteAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/druid/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 30 - 12
desktop/core/src/desktop/js/parse/sql/druid/test/druidAutocompleteParser.Select.test.js

@@ -2226,11 +2226,14 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2243,11 +2246,14 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2283,11 +2289,14 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -3131,11 +3140,14 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3148,11 +3160,14 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5943,7 +5958,6 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5953,7 +5967,11 @@ describe('druidAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/elasticsearch/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 30 - 12
desktop/core/src/desktop/js/parse/sql/elasticsearch/test/elasticsearchAutocompleteParser.Select.test.js

@@ -2226,11 +2226,14 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2243,11 +2246,14 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2283,11 +2289,14 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -3131,11 +3140,14 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3148,11 +3160,14 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5943,7 +5958,6 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5953,7 +5967,11 @@ describe('elasticsearchAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/flink/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 30 - 12
desktop/core/src/desktop/js/parse/sql/flink/test/flinkAutocompleteParser.Select.test.js

@@ -2226,11 +2226,14 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2243,11 +2246,14 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2283,11 +2289,14 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -3131,11 +3140,14 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3148,11 +3160,14 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5943,7 +5958,6 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5953,7 +5967,11 @@ describe('flinkAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/generic/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 30 - 12
desktop/core/src/desktop/js/parse/sql/generic/test/genericAutocompleteParser.Select.test.js

@@ -2226,11 +2226,14 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2243,11 +2246,14 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2283,11 +2289,14 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -3131,11 +3140,14 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3148,11 +3160,14 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5943,7 +5958,6 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5953,7 +5967,11 @@ describe('genericAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/hive/sqlParseSupport.js

@@ -348,23 +348,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 93 - 31
desktop/core/src/desktop/js/parse/sql/hive/test/hiveAutocompleteParser.Select.test.js

@@ -2311,11 +2311,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2328,11 +2331,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2436,11 +2442,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -2464,11 +2473,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
           doesNotContainKeywords: ['ALL'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: binaryFunction.name.toLowerCase(),
+              position: 1
             }
           }
         });
@@ -2485,11 +2497,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
           containsKeywords: ['CASE'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: binaryFunction.name.toLowerCase(),
+              position: 2
             }
           }
         });
@@ -2507,11 +2522,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
           doesNotContainKeywords: ['ALL'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: binaryFunction.name.toLowerCase(),
+              position: 1
             }
           }
         });
@@ -3634,10 +3652,13 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['ARRAY', 'MAP'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['ARRAY', 'MAP'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'explode',
+            position: 1
           }
         }
       });
@@ -3650,9 +3671,12 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           lowerCase: false,
           suggestColumns: {
-            types: ['ARRAY', 'MAP'],
             identifierChain: [{ name: 'a' }, { name: 'b' }],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'explode',
+            position: 1
           }
         }
       });
@@ -3665,10 +3689,13 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['ARRAY'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['ARRAY'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'posexplode',
+            position: 1
           }
         }
       });
@@ -4228,11 +4255,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DECIMAL', 'DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DECIMAL', 'DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'cos',
+            position: 1
           }
         }
       });
@@ -4245,22 +4275,35 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'ceiling',
+            position: 1
           }
         }
       });
     });
 
-    it('should not suggest columns for "SELECT cos(1, | FROM testTable"', () => {
+    it('should suggest arg ref for "SELECT cos(1, | FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT cos(1, ',
         afterCursor: ' FROM testTable',
         expectedResult: {
-          lowerCase: false
+          lowerCase: false,
+          suggestColumns: {
+            source: 'select',
+            tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          suggestFunctions: {},
+          suggestKeywords: ['CASE', 'FALSE', 'NULL', 'TRUE', 'EXISTS', 'NOT'],
+          udfArgument: {
+            name: 'cos',
+            position: 2
+          }
         }
       });
     });
@@ -4272,11 +4315,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -4289,11 +4335,14 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -4306,22 +4355,35 @@ describe('hiveAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DECIMAL', 'DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DECIMAL', 'DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'log',
+            position: 2
           }
         }
       });
     });
 
-    it('should not suggest columns for "SELECT log(a, b, | FROM testTable"', () => {
+    it('should suggest columns with arg ref for "SELECT log(a, b, | FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT log(a, b, ',
         afterCursor: ' FROM testTable',
         expectedResult: {
-          lowerCase: false
+          lowerCase: false,
+          suggestColumns: {
+            source: 'select',
+            tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          suggestFunctions: {},
+          suggestKeywords: ['CASE', 'FALSE', 'NULL', 'TRUE', 'EXISTS', 'NOT'],
+          udfArgument: {
+            name: 'log',
+            position: 3
+          }
         }
       });
     });

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/impala/sqlParseSupport.js

@@ -353,23 +353,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 97 - 32
desktop/core/src/desktop/js/parse/sql/impala/test/impalaAutocompleteParser.Select.test.js

@@ -2286,11 +2286,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2303,11 +2306,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2400,11 +2406,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -3485,7 +3494,11 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['INTERVAL'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['NUMBER'] } // TODO: Don't suggest functions for arithmetic expressions involving dates
+          suggestFunctions: { types: ['NUMBER'] }, // TODO: Don't suggest functions for arithmetic expressions involving dates
+          udfArgument: {
+            name: 'to_utc_timestamp',
+            position: 1
+          }
         }
       });
     });
@@ -3497,7 +3510,11 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['INTERVAL'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['INT'] }
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'date_sub',
+            position: 2
+          }
         }
       });
     });
@@ -3509,7 +3526,11 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['INTERVAL'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['INT'] }
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'date_add',
+            position: 2
+          }
         }
       });
     });
@@ -3747,63 +3768,82 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
       });
     });
 
-    it('should suggest typed columns for "SELECT cos(| FROM testTable"', () => {
+    it('should suggest arg ref for "SELECT cos(| FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT cos(',
         afterCursor: ' FROM testTable',
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'cos',
+            position: 1
           }
         }
       });
     });
 
-    it('should suggest typed columns for "SELECT ceiling(| FROM testTable"', () => {
+    it('should suggest arg ref for "SELECT ceiling(| FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT ceiling(',
         afterCursor: ' FROM testTable',
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DECIMAL', 'DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DECIMAL', 'DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'ceiling',
+            position: 1
           }
         }
       });
     });
 
-    it('should suggest typed columns for "SELECT a, ceiling(| b, c AS bla, d FROM testTable"', () => {
+    it('should suggest arg ref for "SELECT a, ceiling(| b, c AS bla, d FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT ceiling(',
         afterCursor: ' b, c AS bla, d FROM testTable',
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DECIMAL', 'DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DECIMAL', 'DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'ceiling',
+            position: 1
           }
         }
       });
     });
 
-    it('should not suggest columns for "SELECT cos(1, | FROM testTable"', () => {
+    it('should suggest arg ref for "SELECT cos(1, | FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT cos(1, ',
         afterCursor: ' FROM testTable',
         expectedResult: {
-          lowerCase: false
+          lowerCase: false,
+          suggestColumns: {
+            source: 'select',
+            tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          suggestFunctions: {},
+          suggestKeywords: ['CASE', 'FALSE', 'NULL', 'TRUE', 'EXISTS', 'INTERVAL', 'NOT'],
+          udfArgument: {
+            name: 'cos',
+            position: 2
+          }
         }
       });
     });
@@ -3815,11 +3855,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3832,11 +3875,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -3849,22 +3895,35 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'log',
+            position: 2
           }
         }
       });
     });
 
-    it('should not suggest columns for "SELECT log(a, b, | FROM testTable"', () => {
+    it('should suggest columns with arg ref for "SELECT log(a, b, | FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT log(a, b, ',
         afterCursor: ' FROM testTable',
         expectedResult: {
-          lowerCase: false
+          lowerCase: false,
+          suggestColumns: {
+            source: 'select',
+            tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          suggestFunctions: {},
+          suggestKeywords: ['CASE', 'FALSE', 'NULL', 'TRUE', 'EXISTS', 'INTERVAL', 'NOT'],
+          udfArgument: {
+            name: 'log',
+            position: 3
+          }
         }
       });
     });
@@ -3876,11 +3935,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['INT'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['INT'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'substr',
+            position: 2
           }
         }
       });
@@ -3893,11 +3955,14 @@ describe('impalaAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['STRING'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['STRING'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'substr',
+            position: 1
           }
         }
       });

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/ksql/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 30 - 12
desktop/core/src/desktop/js/parse/sql/ksql/test/ksqlAutocompleteParser.Select.test.js

@@ -1840,11 +1840,14 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -1857,11 +1860,14 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -1897,11 +1903,14 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -2745,11 +2754,14 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -2762,11 +2774,14 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5279,7 +5294,6 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5289,7 +5303,11 @@ describe('ksqlAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 17
desktop/core/src/desktop/js/parse/sql/phoenix/sqlParseSupport.js

@@ -342,23 +342,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    const foundArguments =
-      typeof SqlFunctions === 'undefined'
-        ? ['T']
-        : SqlFunctions.getArgumentTypes(
-            parser.yy.activeDialect,
-            functionName.toLowerCase(),
-            position
-          );
-    if (foundArguments.length === 0 && parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(foundArguments);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 26 - 12
desktop/core/src/desktop/js/parse/sql/phoenix/test/phoenixAutocompleteParser.Select.test.js

@@ -2226,11 +2226,14 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2243,11 +2246,14 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2283,10 +2289,9 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
             }
           };
@@ -3131,11 +3136,14 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -3148,11 +3156,14 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -5943,7 +5954,6 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
         expectedResult: {
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [
               { identifierChain: [{ subQuery: 'boo' }] },
               { identifierChain: [{ subQuery: 'bar' }] }
@@ -5953,7 +5963,11 @@ describe('phoenixAutocompleteParser.js SELECT statements', () => {
             { name: 'boo.', type: 'sub-query' },
             { name: 'bar.', type: 'sub-query' }
           ],
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
+          udfArgument: {
+            name: 'cos',
+            position: 1
+          },
           subQueries: [
             {
               alias: 'boo',

+ 5 - 9
desktop/core/src/desktop/js/parse/sql/presto/sqlParseSupport.js

@@ -403,15 +403,11 @@ const initSqlParser = function(parser) {
   };
 
   parser.applyArgumentTypesToSuggestions = function(functionName, position) {
-    if (parser.yy.result.suggestColumns) {
-      delete parser.yy.result.suggestColumns;
-      delete parser.yy.result.suggestKeyValues;
-      delete parser.yy.result.suggestValues;
-      delete parser.yy.result.suggestFunctions;
-      delete parser.yy.result.suggestIdentifiers;
-      delete parser.yy.result.suggestKeywords;
-    } else {
-      parser.applyTypeToSuggestions(['T']);
+    if (parser.yy.result.suggestFunctions || parser.yy.result.suggestColumns) {
+      parser.yy.result.udfArgument = {
+        name: functionName.toLowerCase(),
+        position: position
+      };
     }
   };
 

+ 84 - 28
desktop/core/src/desktop/js/parse/sql/presto/test/prestoAutocompleteParser.Select.test.js

@@ -2311,11 +2311,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 1
           }
         }
       });
@@ -2328,11 +2331,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['T'],
             source: 'select',
             tables: [{ identifierChain: [{ name: 'bar' }] }]
+          },
+          udfArgument: {
+            name: 'customudf',
+            position: 2
           }
         }
       });
@@ -2436,11 +2442,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         } else {
           const expectedResult = {
             lowerCase: false,
-            suggestFunctions: { types: aggregateFunction.types || ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: aggregateFunction.types || ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: aggregateFunction.name.toLowerCase(),
+              position: 1
             }
           };
           assertAutoComplete({
@@ -2464,11 +2473,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
           doesNotContainKeywords: ['ALL'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: binaryFunction.name.toLowerCase(),
+              position: 1
             }
           }
         });
@@ -2485,11 +2497,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
           containsKeywords: ['CASE'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: binaryFunction.name.toLowerCase(),
+              position: 2
             }
           }
         });
@@ -2507,11 +2522,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
           doesNotContainKeywords: ['ALL'],
           expectedResult: {
             lowerCase: false,
-            suggestFunctions: { types: ['T'] },
+            suggestFunctions: {},
             suggestColumns: {
               source: 'select',
-              types: ['T'],
               tables: [{ identifierChain: [{ name: 'testTable' }] }]
+            },
+            udfArgument: {
+              name: binaryFunction.name.toLowerCase(),
+              position: 1
             }
           }
         });
@@ -3665,10 +3683,13 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['ARRAY'] },
+          suggestFunctions: {},
           suggestColumns: {
-            types: ['ARRAY'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'posexplode',
+            position: 1
           }
         }
       });
@@ -4228,11 +4249,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DECIMAL', 'DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DECIMAL', 'DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'cos',
+            position: 1
           }
         }
       });
@@ -4245,22 +4269,35 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'ceiling',
+            position: 1
           }
         }
       });
     });
 
-    it('should not suggest columns for "SELECT cos(1, | FROM testTable"', () => {
+    it('should suggest arg ref for "SELECT cos(1, | FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT cos(1, ',
         afterCursor: ' FROM testTable',
         expectedResult: {
-          lowerCase: false
+          lowerCase: false,
+          suggestColumns: {
+            source: 'select',
+            tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          suggestFunctions: {},
+          suggestKeywords: ['CASE', 'FALSE', 'NULL', 'TRUE', 'EXISTS', 'INTERVAL', 'NOT'],
+          udfArgument: {
+            name: 'cos',
+            position: 2
+          }
         }
       });
     });
@@ -4272,11 +4309,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 5
           }
         }
       });
@@ -4289,11 +4329,14 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['T'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['T'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'greatest',
+            position: 2
           }
         }
       });
@@ -4306,22 +4349,35 @@ describe('prestoAutocompleteParser.js SELECT statements', () => {
         containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
-          suggestFunctions: { types: ['DECIMAL', 'DOUBLE'] },
+          suggestFunctions: {},
           suggestColumns: {
             source: 'select',
-            types: ['DECIMAL', 'DOUBLE'],
             tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          udfArgument: {
+            name: 'log',
+            position: 2
           }
         }
       });
     });
 
-    it('should not suggest columns for "SELECT log(a, b, | FROM testTable"', () => {
+    it('should suggest columns with arg ref for "SELECT log(a, b, | FROM testTable"', () => {
       assertAutoComplete({
         beforeCursor: 'SELECT log(a, b, ',
         afterCursor: ' FROM testTable',
         expectedResult: {
-          lowerCase: false
+          lowerCase: false,
+          suggestColumns: {
+            source: 'select',
+            tables: [{ identifierChain: [{ name: 'testTable' }] }]
+          },
+          suggestFunctions: {},
+          suggestKeywords: ['CASE', 'FALSE', 'NULL', 'TRUE', 'EXISTS', 'INTERVAL', 'NOT'],
+          udfArgument: {
+            name: 'log',
+            position: 3
+          }
         }
       });
     });

+ 32 - 1
desktop/core/src/desktop/js/sql/autocompleteResults.js

@@ -29,6 +29,7 @@ import { matchesType } from 'sql/reference/typeUtils';
 import { DIALECT } from 'apps/notebook2/snippet';
 import { cancelActiveRequest } from 'api/apiUtils';
 import { findBrowserConnector, getRootFilePath } from 'utils/hueConfig';
+import { getArgumentTypes } from './reference/sqlReferenceRepository';
 
 const normalizedColors = HueColors.getNormalizedColors();
 
@@ -431,7 +432,7 @@ class AutocompleteResults {
     }
   }
 
-  update(parseResult) {
+  async update(parseResult) {
     const self = this;
 
     while (self.activeDeferrals.length > 0) {
@@ -461,6 +462,10 @@ class AutocompleteResults {
 
     self.filter('');
 
+    if (self.parseResult.udfArgument) {
+      await self.adjustForUdfArgument();
+    }
+
     const colRefDeferred = self.handleColumnReference();
     self.activeDeferrals.push(colRefDeferred);
     const databasesDeferred = self.loadDatabases();
@@ -496,6 +501,32 @@ class AutocompleteResults {
     });
   }
 
+  async adjustForUdfArgument() {
+    return new Promise(async resolve => {
+      const foundArgumentTypes = (await getArgumentTypes(
+        this.snippet.connector(),
+        this.parseResult.udfArgument.name,
+        this.parseResult.udfArgument.position
+      )) || ['T'];
+      if (foundArgumentTypes.length === 0 && this.parseResult.suggestColumns) {
+        delete this.parseResult.suggestColumns;
+        delete this.parseResult.suggestKeyValues;
+        delete this.parseResult.suggestValues;
+        delete this.parseResult.suggestFunctions;
+        delete this.parseResult.suggestIdentifiers;
+        delete this.parseResult.suggestKeywords;
+      } else if (foundArgumentTypes[0] !== 'BOOLEAN') {
+        if (this.parseResult.suggestFunctions && !this.parseResult.suggestFunctions.types) {
+          this.parseResult.suggestFunctions.types = foundArgumentTypes;
+        }
+        if (this.parseResult.suggestColumns && !this.parseResult.suggestColumns.types) {
+          this.parseResult.suggestColumns.types = foundArgumentTypes;
+        }
+      }
+      resolve();
+    });
+  }
+
   /**
    * For some suggestions the column type is needed, for instance with functions we should only suggest
    * columns that matches the argument type, cos(|) etc.

+ 38 - 0
desktop/core/src/desktop/js/sql/reference/sqlReferenceRepository.js

@@ -37,3 +37,41 @@ export const getUdfCategories = async connector => {
   // TODO: Fetch from API and diff/merge
   return [];
 };
+
+export const findFunction = async (connector, functionName) => {
+  const categories = await getUdfCategories(connector);
+  let found = undefined;
+  categories.some(category => {
+    if (category.functions[functionName]) {
+      found = category.functions[functionName];
+      return true;
+    }
+  });
+  return found;
+};
+
+export const getArgumentTypes = async (connector, functionName, argumentPosition) => {
+  const foundFunction = await findFunction(connector, functionName);
+  if (!foundFunction) {
+    return ['T'];
+  }
+  const args = foundFunction.arguments;
+  if (argumentPosition > args.length) {
+    const multiples = args[args.length - 1].filter(type => {
+      return type.multiple;
+    });
+    if (multiples.length > 0) {
+      return multiples
+        .map(argument => {
+          return argument.type;
+        })
+        .sort();
+    }
+    return [];
+  }
+  return args[argumentPosition - 1]
+    .map(argument => {
+      return argument.type;
+    })
+    .sort();
+};