11import 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' ;
76import * as monaco from 'monaco-editor/esm/vs/editor/editor.api' ;
87
98import 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
128129const 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
146148function 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 [ ] ) ;
0 commit comments