Commit 5e748243 by Michael Huynh

Handle suggestions for alternate syntax aggregation contexts

In aggregation contexts using the alternate syntax form, labels will
precede metrics. A cursor at the label position cannot provide
meaningful suggestions unless a metric is specified. In the latter case,
no suggestions are presented at all.

Related: #13690
parent 4f601761
...@@ -156,7 +156,7 @@ export default class PromQlLanguageProvider extends LanguageProvider { ...@@ -156,7 +156,7 @@ export default class PromQlLanguageProvider extends LanguageProvider {
} }
getAggregationCompletionItems({ value }: TypeaheadInput): TypeaheadOutput { getAggregationCompletionItems({ value }: TypeaheadInput): TypeaheadOutput {
let refresher: Promise<any> = null; const refresher: Promise<any> = null;
const suggestions: CompletionItemGroup[] = []; const suggestions: CompletionItemGroup[] = [];
// Stitch all query lines together to support multi-line queries // Stitch all query lines together to support multi-line queries
...@@ -172,12 +172,30 @@ export default class PromQlLanguageProvider extends LanguageProvider { ...@@ -172,12 +172,30 @@ export default class PromQlLanguageProvider extends LanguageProvider {
return text; return text;
}, ''); }, '');
const leftSide = queryText.slice(0, queryOffset); // Try search for selector part on the left-hand side, such as `sum (m) by (l)`
const openParensAggregationIndex = leftSide.lastIndexOf('('); const openParensAggregationIndex = queryText.lastIndexOf('(', queryOffset);
const openParensSelectorIndex = leftSide.slice(0, openParensAggregationIndex).lastIndexOf('('); let openParensSelectorIndex = queryText.lastIndexOf('(', openParensAggregationIndex - 1);
const closeParensSelectorIndex = leftSide.slice(openParensSelectorIndex).indexOf(')') + openParensSelectorIndex; let closeParensSelectorIndex = queryText.indexOf(')', openParensSelectorIndex);
// Try search for selector part of an alternate aggregation clause, such as `sum by (l) (m)`
if (openParensSelectorIndex === -1) {
const closeParensAggregationIndex = queryText.indexOf(')', queryOffset);
closeParensSelectorIndex = queryText.indexOf(')', closeParensAggregationIndex + 1);
openParensSelectorIndex = queryText.lastIndexOf('(', closeParensSelectorIndex);
}
let selectorString = leftSide.slice(openParensSelectorIndex + 1, closeParensSelectorIndex); const result = {
refresher,
suggestions,
context: 'context-aggregation',
};
// Suggestions are useless for alternative aggregation clauses without a selector in context
if (openParensSelectorIndex === -1) {
return result;
}
let selectorString = queryText.slice(openParensSelectorIndex + 1, closeParensSelectorIndex);
// Range vector syntax not accounted for by subsequent parse so discard it if present // Range vector syntax not accounted for by subsequent parse so discard it if present
selectorString = selectorString.replace(/\[[^\]]+\]$/, ''); selectorString = selectorString.replace(/\[[^\]]+\]$/, '');
...@@ -188,14 +206,10 @@ export default class PromQlLanguageProvider extends LanguageProvider { ...@@ -188,14 +206,10 @@ export default class PromQlLanguageProvider extends LanguageProvider {
if (labelKeys) { if (labelKeys) {
suggestions.push({ label: 'Labels', items: labelKeys.map(wrapLabel) }); suggestions.push({ label: 'Labels', items: labelKeys.map(wrapLabel) });
} else { } else {
refresher = this.fetchSeriesLabels(selector); result.refresher = this.fetchSeriesLabels(selector);
} }
return { return result;
refresher,
suggestions,
context: 'context-aggregation',
};
} }
getLabelCompletionItems({ text, wrapperClasses, labelKey, value }: TypeaheadInput): TypeaheadOutput { getLabelCompletionItems({ text, wrapperClasses, labelKey, value }: TypeaheadInput): TypeaheadOutput {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment