Skip to content

Commit b875e85

Browse files
committed
feat(autocomplete): suggest columns from subqueries
1 parent 01b8424 commit b875e85

File tree

4 files changed

+44
-19
lines changed

4 files changed

+44
-19
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"@gravity-ui/react-data-table": "^2.1.1",
2525
"@gravity-ui/table": "^1.7.0",
2626
"@gravity-ui/uikit": "^6.33.0",
27-
"@gravity-ui/websql-autocomplete": "^12.7.0",
27+
"@gravity-ui/websql-autocomplete": "^13.1.0",
2828
"@hookform/resolvers": "^3.9.0",
2929
"@reduxjs/toolkit": "^2.2.3",
3030
"@tanstack/react-table": "^8.19.3",

src/utils/monaco/yql/generateSuggestions.ts

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type {
22
ColumnAliasSuggestion,
33
KeywordSuggestion,
4+
VariableSuggestion,
45
} from '@gravity-ui/websql-autocomplete/shared';
56
import type {YQLEntity, YqlAutocompleteResult} from '@gravity-ui/websql-autocomplete/yql';
67
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
@@ -107,6 +108,10 @@ function removeBackticks(value: string) {
107108
return value.slice(sliceStart, sliceEnd);
108109
}
109110

111+
function isVariable(value: string) {
112+
return value.startsWith('$');
113+
}
114+
110115
function removeStartSlash(value: string) {
111116
if (value.startsWith('/')) {
112117
return value.slice(1);
@@ -199,7 +204,8 @@ function getColumnDetails(col: AutocompleteColumn) {
199204

200205
export async function generateColumnsSuggestion(
201206
rangeToInsertSuggestion: monaco.IRange,
202-
suggestColumns: YqlAutocompleteResult['suggestColumns'] | undefined,
207+
suggestColumns: YqlAutocompleteResult['suggestColumns'],
208+
suggestVariables: YqlAutocompleteResult['suggestVariables'],
203209
database: string,
204210
): Promise<monaco.languages.CompletionItem[]> {
205211
if (!suggestColumns?.tables) {
@@ -212,7 +218,7 @@ export async function generateColumnsSuggestion(
212218
const normalizedTableNames =
213219
suggestColumns.tables?.map((entity) => {
214220
let normalizedEntityName = removeBackticks(entity.name);
215-
if (!normalizedEntityName.endsWith('/')) {
221+
if (!normalizedEntityName.endsWith('/') && !isVariable(normalizedEntityName)) {
216222
normalizedEntityName = `${normalizedEntityName}/`;
217223
}
218224
return normalizeEntityPrefix(normalizedEntityName, database);
@@ -221,13 +227,31 @@ export async function generateColumnsSuggestion(
221227
// remove duplicates if any
222228
const filteredTableNames = Array.from(new Set(normalizedTableNames));
223229

224-
const autocompleteResponse = await window.api.viewer.autocomplete({
225-
database,
226-
table: filteredTableNames,
227-
limit: 1000,
228-
});
229-
if (!autocompleteResponse.Success) {
230-
return [];
230+
const tableSources = filteredTableNames.filter((name) => !isVariable(name));
231+
232+
let autocompleteEntities: TAutocompleteEntity[] = [];
233+
if (tableSources.length) {
234+
const autocompleteResponse = await window.api.viewer.autocomplete({
235+
database,
236+
table: tableSources,
237+
limit: 1000,
238+
});
239+
if (autocompleteResponse.Success) {
240+
autocompleteEntities = autocompleteResponse.Result.Entities ?? [];
241+
}
242+
}
243+
244+
const variableSources = filteredTableNames.filter(isVariable);
245+
let additionalColumns: TAutocompleteEntity[] = [];
246+
if (variableSources.length) {
247+
variableSources.forEach((source) => {
248+
additionalColumns =
249+
suggestVariables
250+
// Variable name from suggestions doesn't include $ sign
251+
?.find((variable) => source.slice(1) === variable.name)
252+
?.value?.columns?.map((col) => ({Name: col, Type: 'column', Parent: source})) ??
253+
[];
254+
});
231255
}
232256

233257
const tableNameToAliasMap = suggestColumns.tables?.reduce(
@@ -246,7 +270,7 @@ export async function generateColumnsSuggestion(
246270
{} as Record<string, string[]>,
247271
);
248272

249-
autocompleteResponse.Result.Entities?.forEach((col) => {
273+
autocompleteEntities.concat(additionalColumns).forEach((col) => {
250274
if (!isAutocompleteColumn(col)) {
251275
return;
252276
}
@@ -293,7 +317,7 @@ export async function generateColumnsSuggestion(
293317
normalizedColumns?.push(columnNameSuggestion);
294318
}
295319
});
296-
if (normalizedColumns && normalizedColumns.length > 0) {
320+
if (normalizedColumns && normalizedColumns.length > 1) {
297321
const allColumns = normalizedColumns.join(', ');
298322
suggestions.push({
299323
label: allColumns,
@@ -341,13 +365,13 @@ export function generateKeywordsSuggestion(
341365

342366
export function generateVariableSuggestion(
343367
rangeToInsertSuggestion: monaco.IRange,
344-
suggestVariables?: string[],
368+
suggestVariables?: VariableSuggestion[],
345369
) {
346370
if (!suggestVariables) {
347371
return [];
348372
}
349-
return suggestVariables.map((rawVariable) => {
350-
const variable = '$' + rawVariable;
373+
return suggestVariables.map(({name}) => {
374+
const variable = '$' + name;
351375
return {
352376
label: variable,
353377
insertText: variable,

src/utils/monaco/yql/yqlSuggestions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ async function getSuggestions(
128128
const columnsSuggestions = await generateColumnsSuggestion(
129129
rangeToInsertSuggestion,
130130
parseResult.suggestColumns,
131+
parseResult.suggestVariables,
131132
database,
132133
);
133134

0 commit comments

Comments
 (0)