From 451e9beaf0e69faa8a906d41344ee85db1e031f4 Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Thu, 16 Jan 2020 16:09:49 +0000 Subject: [PATCH] Explore/Loki: Filter expression only treated as regex when regex operator is used (#21538) * Explore/Loki: Filter expression only treated as regex when regex operator is used Closes #17963 * Adds test cases to verify new behavior --- public/app/plugins/datasource/loki/query_utils.test.ts | 8 ++++++++ public/app/plugins/datasource/loki/query_utils.ts | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/public/app/plugins/datasource/loki/query_utils.test.ts b/public/app/plugins/datasource/loki/query_utils.test.ts index c10d57a349b..c49e73cf7b3 100644 --- a/public/app/plugins/datasource/loki/query_utils.test.ts +++ b/public/app/plugins/datasource/loki/query_utils.test.ts @@ -92,4 +92,12 @@ describe('getHighlighterExpressionsFromQuery', () => { it('returns null if filter term is not wrapped in double quotes', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= x')).toEqual(null); }); + + it('escapes filter term if regex filter operator is not used', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x[yz].w"')).toEqual(['x\\[yz\\]\\.w']); + }); + + it('does not escape filter term if regex filter operator is used', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} |~ "x[yz].w" |~ "z.+"')).toEqual(['x[yz].w', 'z.+']); + }); }); diff --git a/public/app/plugins/datasource/loki/query_utils.ts b/public/app/plugins/datasource/loki/query_utils.ts index 7fe32d6395e..cea7f220a2c 100644 --- a/public/app/plugins/datasource/loki/query_utils.ts +++ b/public/app/plugins/datasource/loki/query_utils.ts @@ -1,4 +1,5 @@ import { LokiExpression } from './types'; +import escapeRegExp from 'lodash/escapeRegExp'; const selectorRegexp = /(?:^|\s){[^{]*}/g; export function parseQuery(input: string): LokiExpression { @@ -45,6 +46,7 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { break; } // Drop terms for negative filters + const filterOperator = expression.substr(filterStart, 2); const skip = expression.substr(filterStart).search(/!=|!~/) === 0; expression = expression.substr(filterStart + 2); if (skip) { @@ -65,7 +67,8 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { if (quotedTerm) { const unwrappedFilterTerm = quotedTerm[1]; - results.push(unwrappedFilterTerm); + const regexOperator = filterOperator === '|~'; + results.push(regexOperator ? unwrappedFilterTerm : escapeRegExp(unwrappedFilterTerm)); } else { return null; }