Skip to content
This repository was archived by the owner on May 12, 2026. It is now read-only.

Commit bcae3dd

Browse files
committed
Use IN set query for multi-element arrays
Single-element arrays still produce a simple term query. Multi-element arrays now produce field:IN ["a" "b"] which maps to tantivy's TermSetQuery — cleaner than chaining OR clauses. Refs quickwit-oss/quickwit-datasource#179
1 parent 5d1d897 commit bcae3dd

2 files changed

Lines changed: 17 additions & 6 deletions

File tree

src/modifyQuery.test.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ describe('addAddHocFilter', () => {
1111
expect(result).toBe('attributes.tags:paperclip');
1212
});
1313

14-
it('unwraps multi-element array into OR of term queries', () => {
14+
it('unwraps multi-element array into IN set query', () => {
1515
const result = addAddHocFilter('', {
1616
key: 'attributes.tags',
1717
operator: '=',
1818
value: '["paperclip","stapler"]',
1919
});
20-
expect(result).toBe('attributes.tags:paperclip OR attributes.tags:stapler');
20+
expect(result).toBe('attributes.tags:IN ["paperclip" "stapler"]');
2121
});
2222

23-
it('negated array produces negated term queries', () => {
23+
it('negated single-element array produces negated term query', () => {
2424
const result = addAddHocFilter('', {
2525
key: 'attributes.tags',
2626
operator: '!=',
@@ -29,6 +29,15 @@ describe('addAddHocFilter', () => {
2929
expect(result).toBe('-attributes.tags:paperclip');
3030
});
3131

32+
it('negated multi-element array produces negated IN set query', () => {
33+
const result = addAddHocFilter('', {
34+
key: 'attributes.tags',
35+
operator: '!=',
36+
value: '["paperclip","stapler"]',
37+
});
38+
expect(result).toBe('-attributes.tags:IN ["paperclip" "stapler"]');
39+
});
40+
3241
it('appends array filter to existing query with AND', () => {
3342
const result = addAddHocFilter('status:200', {
3443
key: 'attributes.tags',

src/modifyQuery.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ export function addAddHocFilter(query: string, filter: AdHocVariableFilter): str
4040
}
4141
const modifier = filter.operator === '=' ? '' : '-';
4242
const key = escapeFilter(filter.key);
43-
const termFilters = arrayElements.map((el) => `${modifier}${key}:${escapeFilterValue(el)}`);
44-
const combined = termFilters.join(' OR ');
45-
return concatenate(query, combined, 'AND');
43+
if (arrayElements.length === 1) {
44+
return concatenate(query, `${modifier}${key}:${escapeFilterValue(arrayElements[0])}`, 'AND');
45+
}
46+
const terms = arrayElements.map((el) => `"${escapeFilterValue(el)}"`).join(' ');
47+
return concatenate(query, `${modifier}${key}:IN [${terms}]`, 'AND');
4648
}
4749
return LuceneQuery.parse(query).addFilter(filter.key, filter.value, filter.operator === '=' ? '' : '-').toString();
4850
}

0 commit comments

Comments
 (0)