ElasticSearch: Fix lucene formatted variables being wrongly escaped (#54981)

* fixed negative numbers are encoded

* Chore: move variableModel to TypedVariableModel

* add tests
This commit is contained in:
Sven Grossmann 2022-09-15 17:18:57 +02:00 committed by GitHub
parent 7ec1d137b4
commit f1e8a528d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 2 deletions

View File

@ -0,0 +1,75 @@
import { customBuilder } from '../variables/shared/testing/builders';
import { FormatRegistryID, formatRegistry } from './formatRegistry';
const dummyVar = customBuilder().withId('variable').build();
describe('formatRegistry', () => {
describe('with lucene formatter', () => {
const { formatter } = formatRegistry.get(FormatRegistryID.lucene);
it('should escape single value', () => {
expect(
formatter(
{
value: 'foo bar',
text: '',
args: [],
},
dummyVar
)
).toBe('foo\\ bar');
});
it('should not escape negative number', () => {
expect(
formatter(
{
value: '-1',
text: '',
args: [],
},
dummyVar
)
).toBe('-1');
});
it('should escape string prepended with dash', () => {
expect(
formatter(
{
value: '-test',
text: '',
args: [],
},
dummyVar
)
).toBe('\\-test');
});
it('should escape multi value', () => {
expect(
formatter(
{
value: ['foo bar', 'baz'],
text: '',
args: [],
},
dummyVar
)
).toBe('("foo\\ bar" OR "baz")');
});
it('should escape empty value', () => {
expect(
formatter(
{
value: [],
text: '',
args: [],
},
dummyVar
)
).toBe('__empty__');
});
});
});

View File

@ -1,6 +1,6 @@
import { isArray, map, replace } from 'lodash';
import { dateTime, Registry, RegistryItem, textUtil, VariableModel } from '@grafana/data';
import { dateTime, Registry, RegistryItem, textUtil, TypedVariableModel } from '@grafana/data';
import kbn from 'app/core/utils/kbn';
import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../variables/constants';
@ -13,7 +13,7 @@ export interface FormatOptions {
}
export interface FormatRegistryItem extends RegistryItem {
formatter(options: FormatOptions, variable: VariableModel): string;
formatter(options: FormatOptions, variable: TypedVariableModel): string;
}
export enum FormatRegistryID {
@ -260,6 +260,10 @@ export const formatRegistry = new Registry<FormatRegistryItem>(() => {
});
function luceneEscape(value: string) {
if (isNaN(+value) === false) {
return value;
}
return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, '\\$1');
}