From 609284c53b64faacbfecca31ed3aede9fd074702 Mon Sep 17 00:00:00 2001 From: Elena Makarova Date: Fri, 31 May 2024 11:46:46 +0300 Subject: [PATCH] feat(YQL): suggest view and external table in select statements --- src/autocomplete/databases/yql/helpers.ts | 24 +++++++++++-------- .../yql/tests/yq/select/join-clause.test.ts | 4 ++-- .../yql/tests/yq/select/select.test.ts | 12 +++++----- .../yql/tests/yql/select/join-clause.test.ts | 4 ++-- .../yql/tests/yql/select/select.test.ts | 12 +++++----- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/autocomplete/databases/yql/helpers.ts b/src/autocomplete/databases/yql/helpers.ts index 40e6b8bf..faa828fb 100644 --- a/src/autocomplete/databases/yql/helpers.ts +++ b/src/autocomplete/databases/yql/helpers.ts @@ -194,11 +194,11 @@ function getTopicSuggestions({anyRuleInList}: GetParticularSuggestionProps): boo return anyRuleInList([YQLParser.RULE_drop_topic_stmt, YQLParser.RULE_alter_topic_stmt]); } -function getViewSuggestions({anyRuleInList}: GetParticularSuggestionProps): boolean | undefined { - if (!anyRuleInList(YQLParser.RULE_id_or_at)) { - return; - } - return anyRuleInList(YQLParser.RULE_drop_view_stmt); +function getViewSuggestions({allRulesInList}: GetParticularSuggestionProps): boolean | undefined { + return ( + allRulesInList([YQLParser.RULE_drop_view_stmt, YQLParser.RULE_id_or_at]) || + allRulesInList([YQLParser.RULE_table_ref, YQLParser.RULE_id_table_or_type]) + ); } function getReplicationSuggestions({ @@ -215,17 +215,21 @@ function getReplicationSuggestions({ } function getExternalTableSuggestions({ - anyRuleInList, + allRulesInList, tokenStream, cursorTokenIndex, }: GetParticularSuggestionProps): boolean | undefined { - if (!anyRuleInList(YQLParser.RULE_id_or_at)) { - return; - } const hasPreviousTokenExternal = Boolean( getPreviousToken(tokenStream, tokenDictionary, cursorTokenIndex, YQLParser.EXTERNAL), ); - return anyRuleInList(YQLParser.RULE_drop_table_stmt) && hasPreviousTokenExternal; + + const externalTableInDropTable = + allRulesInList([YQLParser.RULE_id_or_at, YQLParser.RULE_drop_table_stmt]) && + hasPreviousTokenExternal; + return ( + externalTableInDropTable || + allRulesInList([YQLParser.RULE_table_ref, YQLParser.RULE_id_table_or_type]) + ); } function getExternalDatasourceSuggestions({ diff --git a/src/autocomplete/databases/yql/tests/yq/select/join-clause.test.ts b/src/autocomplete/databases/yql/tests/yq/select/join-clause.test.ts index 372ad2b3..d60630b2 100644 --- a/src/autocomplete/databases/yql/tests/yq/select/join-clause.test.ts +++ b/src/autocomplete/databases/yql/tests/yq/select/join-clause.test.ts @@ -67,7 +67,7 @@ test('should suggest keywords after FULL OUTER', () => { test('should suggest tables after JOIN', () => { const autocompleteResult = parseYqQueryWithCursor('SELECT * FROM test_table JOIN |'); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestAggregateFunctions).toBeFalsy(); expect(autocompleteResult.suggestWindowFunctions).toBeFalsy(); expect(autocompleteResult.suggestFunctions).toBeFalsy(); @@ -80,7 +80,7 @@ test('should suggest tables after JOIN between statements', () => { 'SELECT * FROM before_table; SELECT * FROM test_table JOIN | ; SELECT * FROM after_table;', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestAggregateFunctions).toBeFalsy(); expect(autocompleteResult.suggestWindowFunctions).toBeFalsy(); expect(autocompleteResult.suggestFunctions).toBeFalsy(); diff --git a/src/autocomplete/databases/yql/tests/yq/select/select.test.ts b/src/autocomplete/databases/yql/tests/yq/select/select.test.ts index 52a17ebf..26e6e887 100644 --- a/src/autocomplete/databases/yql/tests/yq/select/select.test.ts +++ b/src/autocomplete/databases/yql/tests/yq/select/select.test.ts @@ -43,7 +43,7 @@ test('should suggest properly after FROM', () => { const keywordsSuggestion: KeywordSuggestion[] = [{value: 'ANY'}]; expect(autocompleteResult.suggestKeywords).toEqual(keywordsSuggestion); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should suggest properly after *', () => { @@ -72,7 +72,7 @@ test('should suggest properly after FROM', () => { const keywordsSuggestion: KeywordSuggestion[] = [{value: 'ANY'}]; expect(autocompleteResult.suggestKeywords).toEqual(keywordsSuggestion); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestTableFunctions).toBeTruthy(); }); @@ -81,7 +81,7 @@ test('should suggest properly after FROM when typing table name', () => { const keywordsSuggestion: KeywordSuggestion[] = [{value: 'ANY'}]; expect(autocompleteResult.suggestKeywords).toEqual(keywordsSuggestion); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestColumns).toBeFalsy(); }); @@ -90,7 +90,7 @@ test('should suggest tables between statements', () => { 'SELECT * FROM before_table; SELECT * FROM | ; SELECT * FROM after_table;', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should suggest properly after table name', () => { @@ -298,7 +298,7 @@ test('should suggest properly after LIMIT', () => { test('should suggest tables with inline comment', () => { const autocompleteResult = parseYqQueryWithCursor('SELECT * FROM | --SELECT * FROM test_table'); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should suggest tables with multiline comment', () => { @@ -306,7 +306,7 @@ test('should suggest tables with multiline comment', () => { 'SELECT * FROM | /*SELECT * FROM test_table*/', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should not report errors', () => { diff --git a/src/autocomplete/databases/yql/tests/yql/select/join-clause.test.ts b/src/autocomplete/databases/yql/tests/yql/select/join-clause.test.ts index 5134867a..6c17849d 100644 --- a/src/autocomplete/databases/yql/tests/yql/select/join-clause.test.ts +++ b/src/autocomplete/databases/yql/tests/yql/select/join-clause.test.ts @@ -67,7 +67,7 @@ test('should suggest keywords after FULL OUTER', () => { test('should suggest tables after JOIN', () => { const autocompleteResult = parseYqlQueryWithCursor('SELECT * FROM test_table JOIN |'); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestAggregateFunctions).toBeFalsy(); expect(autocompleteResult.suggestWindowFunctions).toBeFalsy(); expect(autocompleteResult.suggestFunctions).toBeFalsy(); @@ -80,7 +80,7 @@ test('should suggest tables after JOIN between statements', () => { 'ALTER TABLE before_table DROP COLUMN id; SELECT * FROM test_table JOIN | ; ALTER TABLE after_table DROP COLUMN id;', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestAggregateFunctions).toBeFalsy(); expect(autocompleteResult.suggestWindowFunctions).toBeFalsy(); expect(autocompleteResult.suggestFunctions).toBeFalsy(); diff --git a/src/autocomplete/databases/yql/tests/yql/select/select.test.ts b/src/autocomplete/databases/yql/tests/yql/select/select.test.ts index 19b57fa9..ca312523 100644 --- a/src/autocomplete/databases/yql/tests/yql/select/select.test.ts +++ b/src/autocomplete/databases/yql/tests/yql/select/select.test.ts @@ -43,7 +43,7 @@ test('should suggest properly after FROM', () => { const keywordsSuggestion: KeywordSuggestion[] = [{value: 'ANY'}]; expect(autocompleteResult.suggestKeywords).toEqual(keywordsSuggestion); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should suggest properly after *', () => { @@ -72,7 +72,7 @@ test('should suggest properly after FROM', () => { const keywordsSuggestion: KeywordSuggestion[] = [{value: 'ANY'}]; expect(autocompleteResult.suggestKeywords).toEqual(keywordsSuggestion); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestTableFunctions).toBeTruthy(); }); @@ -81,7 +81,7 @@ test('should suggest properly after FROM when typing table name', () => { const keywordsSuggestion: KeywordSuggestion[] = [{value: 'ANY'}]; expect(autocompleteResult.suggestKeywords).toEqual(keywordsSuggestion); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); expect(autocompleteResult.suggestColumns).toBeFalsy(); }); @@ -90,7 +90,7 @@ test('should suggest tables between statements', () => { 'ALTER TABLE before_table DROP COLUMN id; SELECT * FROM | ; ALTER TABLE after_table DROP COLUMN id;', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should suggest properly after table name', () => { @@ -300,7 +300,7 @@ test('should suggest tables with inline comment', () => { const autocompleteResult = parseYqlQueryWithCursor( 'SELECT * FROM | --SELECT * FROM test_table', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should suggest tables with multiline comment', () => { @@ -308,7 +308,7 @@ test('should suggest tables with multiline comment', () => { 'SELECT * FROM | /*SELECT * FROM test_table*/', ); - expect(autocompleteResult.suggestEntity).toEqual(['table']); + expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']); }); test('should not report errors', () => {