Skip to content

Commit

Permalink
feat(YQL): improve work with scopes (#264)
Browse files Browse the repository at this point in the history
* feat(YQL): improve work with scopes

* fix: review
  • Loading branch information
Raubzeug authored Dec 25, 2024
1 parent b53b152 commit 66ba285
Show file tree
Hide file tree
Showing 10 changed files with 346 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ test('should suggest properly after ORDER BY in nested statement', () => {
expect(autocompleteResult.suggestColumns).toEqual(columnSuggestion);
getAfterOrderByCommonExpections(autocompleteResult);
});
test('should suggest properly after ORDER BY in nested statement for functions', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'SELECT id as id1 FROM (SELECT count(*) as count, test_column t1 FROM test_table as t ORDER BY coalesce(length(|',
);
const columnSuggestion: ColumnSuggestion = {tables: [{name: 'test_table', alias: 't'}]};

expect(autocompleteResult.suggestColumns).toEqual(columnSuggestion);
});

test('should suggest properly after ORDER BY between statements in nested statement', () => {
const autocompleteResult = parseYqlQueryWithCursor(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import {parseYqlQueryWithCursor} from '../../../index';
import {YQLColumnsSuggestion} from '../../../types';

test('should suggest table name for column between statements', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'ALTER TABLE before_table DROP COLUMN id; SELECT | FROM test_table ; ALTER TABLE after_table DROP COLUMN id;',
);
const columnSuggestions: YQLColumnsSuggestion = {tables: [{name: 'test_table'}], all: true};

expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});

test('should suggest table name in nested statements', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'ALTER TABLE before_table DROP COLUMN id; SELECT * FROM (SELECT | FROM bar) ; ALTER TABLE after_table DROP COLUMN id;',
);
const columnSuggestions: YQLColumnsSuggestion = {tables: [{name: 'bar'}], all: true};

expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});
test('should suggest table name in nested statements', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'ALTER TABLE before_table DROP COLUMN |; SELECT * FROM (SELECT foo FROM bar) ; ALTER TABLE after_table DROP COLUMN id;',
);
const columnSuggestions: YQLColumnsSuggestion = {tables: [{name: 'before_table'}]};

expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});

test('should suggest columns from subquery', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'SELECT | FROM (SELECT foo, bar as baz FROM bar);',
);
const columnSuggestions: YQLColumnsSuggestion = {
tables: [{name: '', columns: ['foo', 'baz']}],
all: true,
};
expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});

test('cannot suggest if subquery with asterisk', () => {
const autocompleteResult = parseYqlQueryWithCursor('SELECT | FROM (SELECT * FROM bar);');
const columnSuggestions: YQLColumnsSuggestion = {
all: true,
tables: [{columns: undefined, name: ''}],
};
expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});

test('should suggest columns from first subquery', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'SELECT | FROM (SELECT id FROM (SELECT foo FROM bar b join baz c on b.id = c.id));',
);
const columnSuggestions: YQLColumnsSuggestion = {
tables: [{name: '', columns: ['id']}],
all: true,
};
expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});

test('should suggest columns from first subquery', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'SELECT * FROM (SELECT | FROM (SELECT foo FROM bar b join baz c on b.id = c.id));',
);
const columnSuggestions: YQLColumnsSuggestion = {
tables: [{name: '', columns: ['foo']}],
all: true,
};
expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});
32 changes: 24 additions & 8 deletions src/autocomplete/databases/yql/tests/yql/select/select.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ test('should suggest tables with inline comment', () => {
'$foo = "bar"; SELECT * FROM | --SELECT * FROM test_table',
);
expect(autocompleteResult.suggestEntity).toEqual(['table', 'view', 'externalTable']);
expect(autocompleteResult.suggestVariables).toEqual(['foo']);
expect(autocompleteResult.suggestVariables).toEqual([{name: 'foo'}]);
});

test('should suggest tables with multiline comment', () => {
Expand All @@ -335,45 +335,48 @@ test('should suggest variables name for column', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'DECLARE $prefix AS String; SELECT | FROM test_table',
);
const variablesSuggestions = ['prefix'];
const variablesSuggestions = [{name: 'prefix'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});
test('should suggest variables name for table name', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'DECLARE $prefix AS String; SELECT * FROM |',
);
const variablesSuggestions = ['prefix'];
const variablesSuggestions = [{name: 'prefix'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});
test('should suggest variables name as columns', () => {
const autocompleteResult = parseYqlQueryWithCursor('$prefix, $foo = (2, 3); SELECT |');
const variablesSuggestions = ['prefix', 'foo'];
const variablesSuggestions = [{name: 'prefix'}, {name: 'foo'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});

test('should suggest variables name in global scope', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'$test = 1; DEFINE SUBQUERY $foo($name) AS $baz = 1;\n select * from test_table where bar == $name AND baz == $baz END DEFINE; $baz2 = 2; select |',
);
const variablesSuggestions = ['test', 'foo', 'baz2'];
const variablesSuggestions = [{name: 'test'}, {name: 'foo'}, {name: 'baz2'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});

test('should suggest variables name in local scope', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'$test = 1; DEFINE SUBQUERY $foo($name) AS $baz = 1;\n select | from test_table where bar == $name AND baz == $baz END DEFINE; $baz2 = 2; select ',
);
const variablesSuggestions = ['name', 'baz'];
const variablesSuggestions = [{name: 'name'}, {name: 'baz'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});

test('should suggest variables inside lambda', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'$f = ($y, $z) -> { $prefix = "x"; RETURN | ;}; select ',
);
const variablesSuggestions = ['y', 'z', 'prefix'];
const variablesSuggestions = [{name: 'y'}, {name: 'z'}, {name: 'prefix'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});
Expand All @@ -382,7 +385,20 @@ test('should suggest variables outside lambda', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'$foo = "a"; \n$f = ($y) -> { $prefix = "x"; RETURN $prefix;}; select |',
);
const variablesSuggestions = ['foo', 'f'];
const variablesSuggestions = [{name: 'foo'}, {name: 'f'}];

expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
});

test('should suggest columns for subquery in variable', () => {
const autocompleteResult = parseYqlQueryWithCursor(
'$foo = select bar from baz; select | from $foo',
);
const variablesSuggestions = [{name: 'foo', value: {columns: ['bar']}}];
const columnSuggestions: YQLColumnsSuggestion = {
tables: [{name: '$foo'}],
all: true,
};
expect(autocompleteResult.suggestVariables).toEqual(variablesSuggestions);
expect(autocompleteResult.suggestColumns).toEqual(columnSuggestions);
});
3 changes: 2 additions & 1 deletion src/autocomplete/databases/yql/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
ColumnSuggestion,
SqlAutocompleteResult,
TableIndexSuggestion,
VariableSuggestion,
} from '../../shared/autocomplete-types';
import {TokenizeResult} from '../../shared/tokenize';

Expand Down Expand Up @@ -67,7 +68,7 @@ export interface YqlAutocompleteResult extends Omit<SqlAutocompleteResult, 'sugg
suggestTableHints?: string;
suggestEntitySettings?: YQLEntity;
suggestColumns?: YQLColumnsSuggestion;
suggestVariables?: string[];
suggestVariables?: VariableSuggestion[];
}

export interface YqlTokenizeResult extends TokenizeResult {}
Loading

0 comments on commit 66ba285

Please sign in to comment.