in web/frontend/src/app/shared/services/monaco-qql-config.service.ts [372:480]
private getEntrySuggestions(
entry: string,
stream: string,
aliases: string[],
range: IRange,
): Observable<CompletionItem[]> {
if (['{limitExpression}', '{number}'].includes(entry)) {
return of([]);
}
if (entry === QqlSequenceKeyWord.select) {
return of([
{
label: QqlSequenceKeyWord.select,
filterText: QqlSequenceKeyWord.select,
kind: monaco.languages.CompletionItemKind.Snippet,
insertText: `${QqlSequenceKeyWord.select} * FROM`,
range,
},
]);
}
if (entry.includes('({')) {
const regExp = /(\(\{[a-z]+\}\))/g;
const label = `${entry.replace(regExp, '')}()`.toUpperCase();
const snippet = entry.replace(regExp, '(${1})').toUpperCase();
return of([
{
label: label,
filterText: label,
kind: monaco.languages.CompletionItemKind.Snippet,
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
insertText: snippet,
range,
},
]);
}
if (entry === '{stream}') {
return this.getSteamsSuggestions(range);
}
if (entry === '{expressionList}') {
const columns$ = stream ? this.getColumns(stream) : of([]);
return combineLatest([
columns$,
this.getFunctions(),
this.timeFormats(),
this.globalFiltersService.getFilters(),
]).pipe(
take(1),
map(([cols, functions, timeFormats, filters]) => {
const columns = [...cols, ...aliases].map((col) => ({
label: col.split('.').pop().replace(/"/g, ''),
filterText: col,
kind: monaco.languages.CompletionItemKind.Field,
insertText: col,
range,
}));
const funcs = functions.map((func) => {
const labelAppend = func.stateful ? '{}()' : '()';
const insertAppend = func.stateful ? '{${1}}(${2})' : '(${1})';
return {
label: `${func.name}${labelAppend}`,
filterText: `${func.name}`,
kind: monaco.languages.CompletionItemKind.Function,
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
insertText: `${func.name}${insertAppend}`,
range,
};
});
const timeFormatAutocomplete = timeFormats.map((format, formatIndex) => {
const label = `'${format}'d`;
let insertText = label;
label.match(/(\{[a-z]+\})/gi).forEach((group, index) => {
const fill = group.replace(/\{|\}/g, '');
insertText = insertText.replace(group, `\${${index + 1}:${fill}}`);
});
const replaceTimeZone = (string) =>
string.replace(/TIMEZONE/g, filters.timezone[0].name);
return {
label: replaceTimeZone(label),
filterText: `'`,
kind: monaco.languages.CompletionItemKind.Snippet,
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
insertText: replaceTimeZone(insertText),
range,
sortText: this.numToSSColumn(formatIndex + 1),
};
});
return [...columns, ...funcs, ...timeFormatAutocomplete];
}),
);
}
return of([
{
label: entry.toUpperCase(),
kind: monaco.languages.CompletionItemKind.Keyword,
insertText: entry.toUpperCase(),
range: null,
},
]);
}