From 04590149245ac075336746dc03593a5d13c17d7f Mon Sep 17 00:00:00 2001 From: chaiL Date: Tue, 18 Aug 2026 10:23:46 +0300 Subject: [PATCH 1/3] fix(query): preserve query OR conditions when appending AND filters --- src/utils/lucene.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/lucene.ts b/src/utils/lucene.ts index 0fd9c52..c336248 100644 --- a/src/utils/lucene.ts +++ b/src/utils/lucene.ts @@ -150,7 +150,7 @@ export function concatenate(query: string, filter: string, operator?: 'AND'|'OR' return filter; } - return operator ? `${query} ${operator} ${filter}` : `${query} ${filter}` + return operator ? `(${query}) ${operator} ${filter}` : `(${query}) ${filter}` } export class LuceneQuery { From 933c52387e7482aa3522d4aa025ae13f6ea7c28e Mon Sep 17 00:00:00 2001 From: chaiL Date: Tue, 18 Aug 2026 10:59:41 +0300 Subject: [PATCH 2/3] update filter concatenation expectations with parentheses --- src/modifyQuery.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modifyQuery.test.ts b/src/modifyQuery.test.ts index aa4772d..51d9083 100644 --- a/src/modifyQuery.test.ts +++ b/src/modifyQuery.test.ts @@ -44,7 +44,7 @@ describe('addAddHocFilter', () => { operator: '=', value: '["paperclip"]', }); - expect(result).toBe('status:200 AND attributes.tags:"paperclip"'); + expect(result).toBe('(status:200) AND attributes.tags:"paperclip"'); }); it('handles single-element array with spaces in value', () => { @@ -181,7 +181,7 @@ describe('addAddHocFilter', () => { operator: '=', value: 'BlogController', }); - expect(result).toBe('status:200 AND attributes.controller:"BlogController"'); + expect(result).toBe('(status:200) AND attributes.controller:"BlogController"'); }); it('renders numeric equality filters as unquoted literals', () => { From 47cee6cb6ed397ce3ae7befc0cea6c5086cb63ab Mon Sep 17 00:00:00 2001 From: chaiL Date: Tue, 18 Aug 2026 11:00:10 +0300 Subject: [PATCH 3/3] add test for AND OR precedence --- src/modifyQuery.test.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/modifyQuery.test.ts b/src/modifyQuery.test.ts index 51d9083..588170a 100644 --- a/src/modifyQuery.test.ts +++ b/src/modifyQuery.test.ts @@ -46,7 +46,7 @@ describe('addAddHocFilter', () => { }); expect(result).toBe('(status:200) AND attributes.tags:"paperclip"'); }); - + it('handles single-element array with spaces in value', () => { const result = addAddHocFilter('', { key: 'attributes.tags', @@ -163,6 +163,16 @@ describe('addAddHocFilter', () => { }); expect(result).toBe('-attributes.tags:paperclip'); }); + + it('wraps an OR query before appending an AND filter', () => { + const result = addAddHocFilter('status:200 OR status:201', { + key: 'attributes.controller', + operator: '=', + value: 'BlogController', + }); + + expect(result).toBe('(status:200 OR status:201) AND attributes.controller:"BlogController"'); + }); }); describe('scalar value filters', () => {