11import type {
22 ColumnAliasSuggestion ,
33 KeywordSuggestion ,
4+ VariableSuggestion ,
45} from '@gravity-ui/websql-autocomplete/shared' ;
56import type { YQLEntity , YqlAutocompleteResult } from '@gravity-ui/websql-autocomplete/yql' ;
67import * 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+
110115function removeStartSlash ( value : string ) {
111116 if ( value . startsWith ( '/' ) ) {
112117 return value . slice ( 1 ) ;
@@ -199,7 +204,8 @@ function getColumnDetails(col: AutocompleteColumn) {
199204
200205export 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
342366export 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 ,
0 commit comments