Skip to content

Commit de0b9b6

Browse files
authored
feat(autocomplete): show column attributes (#1665)
1 parent aa216b1 commit de0b9b6

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed

src/types/api/autocomplete.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ export interface TAutocompleteEntity {
2020
Parent: string;
2121
}
2222

23+
export interface AutocompleteColumn extends TAutocompleteEntity {
24+
Type: 'column';
25+
PKIndex?: number;
26+
NotNull?: boolean;
27+
Default?: number;
28+
}
29+
30+
export function isAutocompleteColumn(entity: TAutocompleteEntity): entity is AutocompleteColumn {
31+
return entity.Type === 'column';
32+
}
33+
2334
export type AutocompleteEntityType =
2435
| 'unknown'
2536
| 'dir'

src/utils/monaco/yql/generateSuggestions.ts

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import type {
55
import type {YQLEntity, YqlAutocompleteResult} from '@gravity-ui/websql-autocomplete/yql';
66
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
77

8-
import type {AutocompleteEntityType, TAutocompleteEntity} from '../../../types/api/autocomplete';
8+
import {isAutocompleteColumn} from '../../../types/api/autocomplete';
9+
import type {
10+
AutocompleteColumn,
11+
AutocompleteEntityType,
12+
TAutocompleteEntity,
13+
} from '../../../types/api/autocomplete';
914

1015
import {
1116
AggregateFunctions,
@@ -174,6 +179,23 @@ async function getSimpleTypes() {
174179
return SimpleTypes;
175180
}
176181

182+
function getColumnDetails(col: AutocompleteColumn) {
183+
const {PKIndex, NotNull, Default} = col;
184+
const details = [];
185+
if (PKIndex !== undefined) {
186+
details.push(`PK${PKIndex}`);
187+
}
188+
if (NotNull) {
189+
details.push('NN');
190+
}
191+
if (Default) {
192+
details.push('Default');
193+
}
194+
const detailsString = details.length ? details.join(', ') : '';
195+
// return `Column${detailsString}`;
196+
return detailsString;
197+
}
198+
177199
export async function generateColumnsSuggestion(
178200
rangeToInsertSuggestion: monaco.IRange,
179201
suggestColumns: YqlAutocompleteResult['suggestColumns'] | undefined,
@@ -224,9 +246,11 @@ export async function generateColumnsSuggestion(
224246
);
225247

226248
autocompleteResponse.Result.Entities.forEach((col) => {
227-
if (col.Type !== 'column') {
249+
if (!isAutocompleteColumn(col)) {
228250
return;
229251
}
252+
253+
const columnDetails = getColumnDetails(col);
230254
const normalizedName = wrapStringToBackticks(col.Name);
231255

232256
const normalizedParentName = normalizeEntityPrefix(col.Parent, database);
@@ -236,9 +260,9 @@ export async function generateColumnsSuggestion(
236260
aliases.forEach((a) => {
237261
const columnNameSuggestion = `${a}.${normalizedName}`;
238262
suggestions.push({
239-
label: columnNameSuggestion,
263+
label: {label: columnNameSuggestion, description: columnDetails},
240264
insertText: columnNameSuggestion,
241-
kind: CompletionItemKind.Field,
265+
kind: CompletionItemKind.Variable,
242266
detail: 'Column',
243267
range: rangeToInsertSuggestion,
244268
sortText:
@@ -253,9 +277,12 @@ export async function generateColumnsSuggestion(
253277
columnNameSuggestion = `${wrapStringToBackticks(normalizedParentName)}.${normalizedName}`;
254278
}
255279
suggestions.push({
256-
label: columnNameSuggestion,
280+
label: {
281+
label: columnNameSuggestion,
282+
description: columnDetails,
283+
},
257284
insertText: columnNameSuggestion,
258-
kind: CompletionItemKind.Field,
285+
kind: CompletionItemKind.Variable,
259286
detail: 'Column',
260287
range: rangeToInsertSuggestion,
261288
sortText:
@@ -266,12 +293,11 @@ export async function generateColumnsSuggestion(
266293
}
267294
});
268295
if (normalizedColumns && normalizedColumns.length > 0) {
269-
const allColumsn = normalizedColumns.join(', ');
296+
const allColumns = normalizedColumns.join(', ');
270297
suggestions.push({
271-
label: allColumsn,
272-
insertText: allColumsn,
273-
kind: CompletionItemKind.Field,
274-
detail: 'All columns',
298+
label: allColumns,
299+
insertText: allColumns,
300+
kind: CompletionItemKind.Variable,
275301
range: rangeToInsertSuggestion,
276302
sortText: suggestionIndexToWeight(getSuggestionIndex('suggestAllColumns')),
277303
});
@@ -289,7 +315,7 @@ export function generateColumnAliasesSuggestion(
289315
return suggestColumnAliases?.map((columnAliasSuggestion) => ({
290316
label: columnAliasSuggestion.name,
291317
insertText: columnAliasSuggestion.name,
292-
kind: CompletionItemKind.Field,
318+
kind: CompletionItemKind.Variable,
293319
detail: 'Column alias',
294320
range: rangeToInsertSuggestion,
295321
sortText: suggestionIndexToWeight(getSuggestionIndex('suggestColumnAliases')),

0 commit comments

Comments
 (0)