Skip to content

Commit 4e2d78e

Browse files
committed
Impl parser-safe query modifications, fixes #56
1 parent 2843709 commit 4e2d78e

File tree

2 files changed

+16
-14
lines changed

2 files changed

+16
-14
lines changed

src/datasource/base.ts

+5-10
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { getQueryResponseProcessor } from 'datasource/processResponse';
3535

3636
import { SECOND } from 'utils/time';
3737
import { GConstructor } from 'utils/mixins';
38+
import { LuceneQuery } from '@/utils/lucene';
3839

3940
export type BaseQuickwitDataSourceConstructor = GConstructor<BaseQuickwitDataSource>
4041

@@ -113,24 +114,18 @@ export class BaseQuickwitDataSource
113114
return query;
114115
}
115116

116-
let expression = query.query ?? '';
117+
let lquery = LuceneQuery.parse(query.query ?? '')
117118
switch (action.type) {
118119
case 'ADD_FILTER': {
119-
if (expression.length > 0) {
120-
expression += ' AND ';
121-
}
122-
expression += `${action.options.key}:"${action.options.value}"`;
120+
lquery = lquery.addFilter(action.options.key, action.options.value)
123121
break;
124122
}
125123
case 'ADD_FILTER_OUT': {
126-
if (expression.length > 0) {
127-
expression += ' AND ';
128-
}
129-
expression += `-${action.options.key}:"${action.options.value}"`;
124+
lquery = lquery.addFilter(action.options.key, action.options.value, '-')
130125
break;
131126
}
132127
}
133-
return { ...query, query: expression };
128+
return { ...query, query: lquery.toString() };
134129
}
135130

136131
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=false){
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)