From a40d1f074b4a39000170cca939c4f99f98c58b06 Mon Sep 17 00:00:00 2001 From: putrasattvika2 Date: Wed, 5 Nov 2025 09:00:30 +0900 Subject: [PATCH] Add IN query to quick filters --- .../QueryEditor/FilterEditor/index.tsx | 15 ++++++++++++++- src/datasource/base.ts | 5 ++++- src/modifyQuery.ts | 18 ++++++++++++++++++ src/queryDef.ts | 2 ++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/components/QueryEditor/FilterEditor/index.tsx b/src/components/QueryEditor/FilterEditor/index.tsx index e30bdbc..7cea17a 100644 --- a/src/components/QueryEditor/FilterEditor/index.tsx +++ b/src/components/QueryEditor/FilterEditor/index.tsx @@ -130,7 +130,7 @@ export const FilterEditorRow = ({ value, onSubmit }: FilterEditorRowProps) => { }} /> - {!['exists', 'not exists'].includes(value.filter.operator) && ( + {['=', '!=', 'term', 'not term'].includes(value.filter.operator) && ( { }} /> )} + {['in', 'not in'].includes(value.filter.operator) && ( + dispatch(changeFilterValue({ id: value.id, value: e.currentTarget.value }))} + onKeyUp={(e) => { + if (e.key === 'Enter') { + onSubmit(); + } + }} + /> + )} ); diff --git a/src/datasource/base.ts b/src/datasource/base.ts index 2f3d624..dc93cd8 100644 --- a/src/datasource/base.ts +++ b/src/datasource/base.ts @@ -394,7 +394,10 @@ export class BaseQuickwitDataSource if (!adhocFilters) { return query; } - let finalQuery = query; + + // Surround the query with () to ensure that the filters are properly AND'd + let finalQuery = '(' + query + ')'; + adhocFilters.forEach((filter) => { finalQuery = addAddHocFilter(finalQuery, filter); }); diff --git a/src/modifyQuery.ts b/src/modifyQuery.ts index 7f1d8a9..ddd268a 100644 --- a/src/modifyQuery.ts +++ b/src/modifyQuery.ts @@ -52,6 +52,24 @@ export function addAddHocFilter(query: string, filter: AdHocVariableFilter): str case 'not exists': addHocFilter = `-${key}:*`; break; + case 'in': + addHocFilter = createAdhocFilterIn(key, value); + break; + case 'not in': + addHocFilter = `(NOT (${createAdhocFilterIn(key, value)}))`; + break; } return concatenate(query, addHocFilter); } + +function createAdhocFilterIn(key: string, value: string): string { + const values = value.split(' '); + + // OR is faster than IN for smaller number of values + if (values.length < 10) { + const conditions = values.map(v => `${key}:${v}`); + return `(${conditions.join(' OR ')})`; + } + + return `${key}:IN [${value}]`; +} diff --git a/src/queryDef.ts b/src/queryDef.ts index 7655f6e..43b262b 100644 --- a/src/queryDef.ts +++ b/src/queryDef.ts @@ -44,6 +44,8 @@ export const filterOperations = [ { label: 'not term', value: 'not term' }, { label: 'exists', value: 'exists' }, { label: 'not exists', value: 'not exists' }, + { label: 'in', value: 'in' }, + { label: 'not in', value: 'not in' }, ]; export function defaultFilter(id = newFilterId()): QueryFilter {