Skip to content

Commit b4d2b7f

Browse files
authored
feat(autocomplete): suggest all columns in a row (#1599)
1 parent d3c5714 commit b4d2b7f

File tree

6 files changed

+56
-31
lines changed

6 files changed

+56
-31
lines changed

package-lock.json

+7-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"@gravity-ui/react-data-table": "^2.1.1",
2424
"@gravity-ui/table": "^0.5.0",
2525
"@gravity-ui/uikit": "^6.33.0",
26-
"@gravity-ui/websql-autocomplete": "^9.1.0",
26+
"@gravity-ui/websql-autocomplete": "^12.1.2",
2727
"@hookform/resolvers": "^3.9.0",
2828
"@reduxjs/toolkit": "^2.2.3",
2929
"@tanstack/react-table": "^8.19.3",

src/components/TooltipsContent/NodeEndpointsTooltipContent/NodeEndpointsTooltipContent.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
}
88
&__definition {
99
text-align: right;
10-
word-break: break-all;
10+
word-break: break-word;
1111
}
1212
}

src/utils/monaco/yql/constants.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {YQLEntity} from '@gravity-ui/websql-autocomplete';
1+
import type {YQLEntity} from '@gravity-ui/websql-autocomplete/yql';
22

33
export const SimpleTypes = [
44
'Text',

src/utils/monaco/yql/generateSuggestions.ts

+44-19
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import type {
22
ColumnAliasSuggestion,
33
KeywordSuggestion,
4-
YQLEntity,
5-
YqlAutocompleteResult,
6-
} from '@gravity-ui/websql-autocomplete';
4+
} from '@gravity-ui/websql-autocomplete/shared';
5+
import type {YQLEntity, YqlAutocompleteResult} from '@gravity-ui/websql-autocomplete/yql';
76
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
87

98
import type {AutocompleteEntityType, TAutocompleteEntity} from '../../../types/api/autocomplete';
@@ -123,24 +122,27 @@ function normalizeEntityPrefix(value = '', database: string) {
123122
return removeStartSlash(cleanedValue);
124123
}
125124

126-
type SuggestionType = keyof Omit<YqlAutocompleteResult, 'errors' | 'suggestDatabases'>;
125+
type SuggestionType =
126+
| keyof Omit<YqlAutocompleteResult, 'errors' | 'suggestDatabases'>
127+
| 'suggestAllColumns';
127128

128129
const SuggestionsWeight: Record<SuggestionType, number> = {
129130
suggestTemplates: 0,
130131
suggestPragmas: 1,
131132
suggestEntity: 2,
132-
suggestColumns: 3,
133-
suggestColumnAliases: 4,
134-
suggestTableIndexes: 5,
135-
suggestTableHints: 6,
136-
suggestEntitySettings: 7,
137-
suggestKeywords: 8,
138-
suggestAggregateFunctions: 9,
139-
suggestTableFunctions: 10,
140-
suggestWindowFunctions: 11,
141-
suggestFunctions: 12,
142-
suggestSimpleTypes: 13,
143-
suggestUdfs: 14,
133+
suggestAllColumns: 3,
134+
suggestColumns: 4,
135+
suggestColumnAliases: 5,
136+
suggestTableIndexes: 6,
137+
suggestTableHints: 7,
138+
suggestEntitySettings: 8,
139+
suggestKeywords: 9,
140+
suggestAggregateFunctions: 10,
141+
suggestTableFunctions: 11,
142+
suggestWindowFunctions: 12,
143+
suggestFunctions: 13,
144+
suggestSimpleTypes: 14,
145+
suggestUdfs: 15,
144146
};
145147

146148
function getSuggestionIndex(suggestionType: SuggestionType) {
@@ -181,6 +183,7 @@ export async function generateColumnsSuggestion(
181183
return [];
182184
}
183185
const suggestions: monaco.languages.CompletionItem[] = [];
186+
const normalizedColumns = suggestColumns.all ? ([] as string[]) : undefined;
184187
const multi = suggestColumns.tables.length > 1;
185188

186189
const normalizedTableNames =
@@ -228,6 +231,7 @@ export async function generateColumnsSuggestion(
228231

229232
const normalizedParentName = normalizeEntityPrefix(col.Parent, database);
230233
const aliases = tableNameToAliasMap[normalizedParentName];
234+
const currentSuggestionIndex = suggestions.length;
231235
if (aliases?.length) {
232236
aliases.forEach((a) => {
233237
const columnNameSuggestion = `${a}.${normalizedName}`;
@@ -237,8 +241,11 @@ export async function generateColumnsSuggestion(
237241
kind: CompletionItemKind.Field,
238242
detail: 'Column',
239243
range: rangeToInsertSuggestion,
240-
sortText: suggestionIndexToWeight(getSuggestionIndex('suggestColumns')),
244+
sortText:
245+
suggestionIndexToWeight(getSuggestionIndex('suggestColumns')) +
246+
suggestionIndexToWeight(currentSuggestionIndex),
241247
});
248+
normalizedColumns?.push(columnNameSuggestion);
242249
});
243250
} else {
244251
let columnNameSuggestion = normalizedName;
@@ -251,10 +258,24 @@ export async function generateColumnsSuggestion(
251258
kind: CompletionItemKind.Field,
252259
detail: 'Column',
253260
range: rangeToInsertSuggestion,
254-
sortText: suggestionIndexToWeight(getSuggestionIndex('suggestColumns')),
261+
sortText:
262+
suggestionIndexToWeight(getSuggestionIndex('suggestColumns')) +
263+
suggestionIndexToWeight(currentSuggestionIndex),
255264
});
265+
normalizedColumns?.push(columnNameSuggestion);
256266
}
257267
});
268+
if (normalizedColumns && normalizedColumns.length > 0) {
269+
const allColumsn = normalizedColumns.join(', ');
270+
suggestions.push({
271+
label: allColumsn,
272+
insertText: allColumsn,
273+
kind: CompletionItemKind.Field,
274+
detail: 'All columns',
275+
range: rangeToInsertSuggestion,
276+
sortText: suggestionIndexToWeight(getSuggestionIndex('suggestAllColumns')),
277+
});
278+
}
258279
return suggestions;
259280
}
260281

@@ -309,6 +330,7 @@ export async function generateEntitiesSuggestion(
309330
if (isDir && !withBackticks) {
310331
labelAsSnippet = `\`${label}$0\``;
311332
}
333+
const suggestionIndex = acc.length;
312334
acc.push({
313335
label,
314336
insertText: labelAsSnippet ?? label,
@@ -321,7 +343,10 @@ export async function generateEntitiesSuggestion(
321343
command: label.endsWith('/')
322344
? {id: 'editor.action.triggerSuggest', title: ''}
323345
: undefined,
324-
sortText: suggestionIndexToWeight(getSuggestionIndex('suggestEntity')),
346+
// first argument is responsible for sorting groups of suggestions, the second - to preserve suggestions order returned from backend
347+
sortText:
348+
suggestionIndexToWeight(getSuggestionIndex('suggestEntity')) +
349+
suggestionIndexToWeight(suggestionIndex),
325350
});
326351
return acc;
327352
}, [] as monaco.languages.CompletionItem[]);

src/utils/monaco/yql/yqlSuggestions.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {CursorPosition} from '@gravity-ui/websql-autocomplete';
1+
import type {CursorPosition} from '@gravity-ui/websql-autocomplete/shared';
22
import type Monaco from 'monaco-editor';
33

44
import {
@@ -56,7 +56,7 @@ async function getSuggestions(
5656
rangeToInsertSuggestion: Monaco.IRange,
5757
database: string,
5858
): Promise<Monaco.languages.CompletionItem[]> {
59-
const {parseYqlQuery} = await import('@gravity-ui/websql-autocomplete');
59+
const {parseYqlQuery} = await import('@gravity-ui/websql-autocomplete/yql');
6060
const cursorForParsing: CursorPosition = {
6161
line: cursorPosition.lineNumber,
6262
column: cursorPosition.column,

0 commit comments

Comments
 (0)