From d875b25049b2f58f5ad382824cf68c375582aff7 Mon Sep 17 00:00:00 2001 From: Matias Chomicki Date: Wed, 12 Apr 2023 15:39:43 +0200 Subject: [PATCH] Loki search words: process negative expressions as negative search words --- public/app/plugins/datasource/loki/queryUtils.test.ts | 8 ++++++-- public/app/plugins/datasource/loki/queryUtils.ts | 9 ++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/public/app/plugins/datasource/loki/queryUtils.test.ts b/public/app/plugins/datasource/loki/queryUtils.test.ts index f79ce8fd6e0..ce149e32e09 100644 --- a/public/app/plugins/datasource/loki/queryUtils.test.ts +++ b/public/app/plugins/datasource/loki/queryUtils.test.ts @@ -63,6 +63,10 @@ describe('getHighlighterExpressionsFromQuery', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" |~ `y`')).toEqual(['x', 'y']); }); + it('returns expressions for query with negative filter chain using both backticks and quotes', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} != "x" !~ `y`')).toEqual(['-x', '-y']); + }); + it('returns expression for query with log parser', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" | logfmt')).toEqual(['x']); }); @@ -71,8 +75,8 @@ describe('getHighlighterExpressionsFromQuery', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" |~ "y" | logfmt')).toEqual(['x', 'y']); }); - it('returns drops expressions for query with negative filter chain using quotes', () => { - expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" != "y"')).toEqual(['x']); + it('returns expressions for query with negative filter chain using quotes', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" != "y"')).toEqual(['x', '-y']); }); it('returns expressions for query with filter chain using backticks', () => { diff --git a/public/app/plugins/datasource/loki/queryUtils.ts b/public/app/plugins/datasource/loki/queryUtils.ts index 9ad5b5a2c7b..baae038778e 100644 --- a/public/app/plugins/datasource/loki/queryUtils.ts +++ b/public/app/plugins/datasource/loki/queryUtils.ts @@ -17,6 +17,8 @@ import { MetricExpr, Matcher, Identifier, + Nre, + Neq, } from '@grafana/lezer-logql'; import { DataQuery } from '@grafana/schema'; @@ -31,7 +33,7 @@ export function formatQuery(selector: string | undefined): string { /** * Returns search terms from a LogQL query. - * E.g., `{} |= foo |=bar != baz` returns `['foo', 'bar']`. + * E.g.: `{} |= foo |=bar != baz` returns `['foo', 'bar', '-baz']`. */ export function getHighlighterExpressionsFromQuery(input: string): string[] { const results = []; @@ -49,9 +51,10 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { for (let filter of filters) { const pipeExact = filter.getChild(Filter)?.getChild(PipeExact); const pipeMatch = filter.getChild(Filter)?.getChild(PipeMatch); + const negativeExp = filter.getChild(Filter)?.getChild(Neq) || filter.getChild(Filter)?.getChild(Nre); const string = filter.getChild(String); - if ((!pipeExact && !pipeMatch) || !string) { + if ((!pipeExact && !pipeMatch && !negativeExp) || !string) { continue; } @@ -76,7 +79,7 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { } if (resultTerm) { - results.push(resultTerm); + results.push(negativeExp ? `-${resultTerm}` : resultTerm); } } return results;