1
1
import type {
2
2
ColumnAliasSuggestion ,
3
3
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' ;
7
6
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api' ;
8
7
9
8
import type { AutocompleteEntityType , TAutocompleteEntity } from '../../../types/api/autocomplete' ;
@@ -123,24 +122,27 @@ function normalizeEntityPrefix(value = '', database: string) {
123
122
return removeStartSlash ( cleanedValue ) ;
124
123
}
125
124
126
- type SuggestionType = keyof Omit < YqlAutocompleteResult , 'errors' | 'suggestDatabases' > ;
125
+ type SuggestionType =
126
+ | keyof Omit < YqlAutocompleteResult , 'errors' | 'suggestDatabases' >
127
+ | 'suggestAllColumns' ;
127
128
128
129
const SuggestionsWeight : Record < SuggestionType , number > = {
129
130
suggestTemplates : 0 ,
130
131
suggestPragmas : 1 ,
131
132
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 ,
144
146
} ;
145
147
146
148
function getSuggestionIndex ( suggestionType : SuggestionType ) {
@@ -181,6 +183,7 @@ export async function generateColumnsSuggestion(
181
183
return [ ] ;
182
184
}
183
185
const suggestions : monaco . languages . CompletionItem [ ] = [ ] ;
186
+ const normalizedColumns = suggestColumns . all ? ( [ ] as string [ ] ) : undefined ;
184
187
const multi = suggestColumns . tables . length > 1 ;
185
188
186
189
const normalizedTableNames =
@@ -228,6 +231,7 @@ export async function generateColumnsSuggestion(
228
231
229
232
const normalizedParentName = normalizeEntityPrefix ( col . Parent , database ) ;
230
233
const aliases = tableNameToAliasMap [ normalizedParentName ] ;
234
+ const currentSuggestionIndex = suggestions . length ;
231
235
if ( aliases ?. length ) {
232
236
aliases . forEach ( ( a ) => {
233
237
const columnNameSuggestion = `${ a } .${ normalizedName } ` ;
@@ -237,8 +241,11 @@ export async function generateColumnsSuggestion(
237
241
kind : CompletionItemKind . Field ,
238
242
detail : 'Column' ,
239
243
range : rangeToInsertSuggestion ,
240
- sortText : suggestionIndexToWeight ( getSuggestionIndex ( 'suggestColumns' ) ) ,
244
+ sortText :
245
+ suggestionIndexToWeight ( getSuggestionIndex ( 'suggestColumns' ) ) +
246
+ suggestionIndexToWeight ( currentSuggestionIndex ) ,
241
247
} ) ;
248
+ normalizedColumns ?. push ( columnNameSuggestion ) ;
242
249
} ) ;
243
250
} else {
244
251
let columnNameSuggestion = normalizedName ;
@@ -251,10 +258,24 @@ export async function generateColumnsSuggestion(
251
258
kind : CompletionItemKind . Field ,
252
259
detail : 'Column' ,
253
260
range : rangeToInsertSuggestion ,
254
- sortText : suggestionIndexToWeight ( getSuggestionIndex ( 'suggestColumns' ) ) ,
261
+ sortText :
262
+ suggestionIndexToWeight ( getSuggestionIndex ( 'suggestColumns' ) ) +
263
+ suggestionIndexToWeight ( currentSuggestionIndex ) ,
255
264
} ) ;
265
+ normalizedColumns ?. push ( columnNameSuggestion ) ;
256
266
}
257
267
} ) ;
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
+ }
258
279
return suggestions ;
259
280
}
260
281
@@ -309,6 +330,7 @@ export async function generateEntitiesSuggestion(
309
330
if ( isDir && ! withBackticks ) {
310
331
labelAsSnippet = `\`${ label } $0\`` ;
311
332
}
333
+ const suggestionIndex = acc . length ;
312
334
acc . push ( {
313
335
label,
314
336
insertText : labelAsSnippet ?? label ,
@@ -321,7 +343,10 @@ export async function generateEntitiesSuggestion(
321
343
command : label . endsWith ( '/' )
322
344
? { id : 'editor.action.triggerSuggest' , title : '' }
323
345
: 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 ) ,
325
350
} ) ;
326
351
return acc ;
327
352
} , [ ] as monaco . languages . CompletionItem [ ] ) ;
0 commit comments