Skip to content

Commit 3285e1e

Browse files
committed
Impl parser-safe query modifications, fixes #56
1 parent bbc88eb commit 3285e1e

File tree

2 files changed

+16
-14
lines changed

2 files changed

+16
-14
lines changed

src/datasource.ts

+5-10
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import { ReactNode } from 'react';
5050
import { fieldTypeMap } from 'utils';
5151
import { addAddHocFilter } from 'modifyQuery';
5252
import { LogContextProvider, LogRowContextOptions } from './LogContext/LogContextProvider';
53+
import { LuceneQuery } from 'utils/lucene';
5354

5455
export const REF_ID_STARTER_LOG_VOLUME = 'log-volume-';
5556

@@ -244,24 +245,18 @@ export class QuickwitDataSource
244245
return query;
245246
}
246247

247-
let expression = query.query ?? '';
248+
let lquery = LuceneQuery.parse(query.query ?? '')
248249
switch (action.type) {
249250
case 'ADD_FILTER': {
250-
if (expression.length > 0) {
251-
expression += ' AND ';
252-
}
253-
expression += `${action.options.key}:"${action.options.value}"`;
251+
lquery = lquery.addFilter(action.options.key, action.options.value)
254252
break;
255253
}
256254
case 'ADD_FILTER_OUT': {
257-
if (expression.length > 0) {
258-
expression += ' AND ';
259-
}
260-
expression += `-${action.options.key}:"${action.options.value}"`;
255+
lquery = lquery.addFilter(action.options.key, action.options.value, '-')
261256
break;
262257
}
263258
}
264-
return { ...query, query: expression };
259+
return { ...query, query: lquery.toString() };
265260
}
266261

267262
getDataQueryRequest(queryDef: TermsQuery, range: TimeRange) {

src/utils/lucene.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,15 @@ function removeNodeFromTree(ast: AST, node: NodeTerm): AST {
142142
/**
143143
* Merge a query with a filter.
144144
*/
145-
export function concatenate(query: string, filter: string, condition = 'AND'): string {
145+
export function concatenate(query: string, filter: string, operator?: 'AND'|'OR'): string {
146146
if (!filter) {
147147
return query;
148148
}
149-
return query.trim() === '' ? filter : `${query} ${condition} ${filter}`;
149+
if (query.trim() === '' ) {
150+
return filter;
151+
}
152+
153+
return operator ? `${query} ${operator} ${filter}` : `${query} ${filter}`
150154
}
151155

152156
export class LuceneQuery {
@@ -185,14 +189,17 @@ export class LuceneQuery {
185189
return this.findFilter(key, value, modifier) !== null;
186190
}
187191

188-
addFilter(key: string, value: string, modifier: ModifierType = ''){
192+
addFilter(key: string, value: string, modifier: ModifierType = '', parens=true){
189193
if (this.hasFilter(key, value, modifier)) {
190194
return this;
191195
}
192196

193197
key = escapeFilter(key);
194198
value = escapeFilterValue(value);
195-
const filter = `${modifier}${key}:"${value}"`;
199+
let filter = `${modifier}${key}:"${value}"`;
200+
if (parens) {
201+
filter = `(${filter})`
202+
}
196203

197204
return LuceneQuery.parse(concatenate(this.toString(), filter));
198205
}

0 commit comments

Comments
 (0)