From b67a0a9c5ae1c85e55cb6b8a034a2deb39c20be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Fri, 12 Jan 2024 10:58:49 +0100 Subject: [PATCH] feat: add ability to check for existence of a field --- .changeset/nine-bears-speak.md | 6 ++++ .../elasticsearch/query/filters/value.ts | 29 ++++++++++++++----- .../core/src/protocol/search/filters/value.ts | 4 ++- 3 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 .changeset/nine-bears-speak.md diff --git a/.changeset/nine-bears-speak.md b/.changeset/nine-bears-speak.md new file mode 100644 index 00000000..915d0c6d --- /dev/null +++ b/.changeset/nine-bears-speak.md @@ -0,0 +1,6 @@ +--- +"@openstapps/backend": minor +"@openstapps/core": minor +--- + +Add the ability to filter by existence of a field diff --git a/backend/backend/src/storage/elasticsearch/query/filters/value.ts b/backend/backend/src/storage/elasticsearch/query/filters/value.ts index c531254f..5bfc3103 100644 --- a/backend/backend/src/storage/elasticsearch/query/filters/value.ts +++ b/backend/backend/src/storage/elasticsearch/query/filters/value.ts @@ -21,16 +21,31 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js'; */ export function buildValueFilter( filter: SCSearchValueFilter, -): QueryDslSpecificQueryContainer<'term'> | QueryDslSpecificQueryContainer<'terms'> { - return Array.isArray(filter.arguments.value) - ? { - terms: { - [`${filter.arguments.field}.raw`]: filter.arguments.value, +): + | QueryDslSpecificQueryContainer<'exists'> + | QueryDslSpecificQueryContainer<'term'> + | QueryDslSpecificQueryContainer<'terms'> { + switch (typeof filter.arguments.value) { + case 'undefined': { + return { + exists: { + field: filter.arguments.field, }, - } - : { + }; + } + case 'string': { + return { term: { [`${filter.arguments.field}.raw`]: filter.arguments.value, }, }; + } + case 'object': { + return { + terms: { + [`${filter.arguments.field}.raw`]: filter.arguments.value, + }, + }; + } + } } diff --git a/packages/core/src/protocol/search/filters/value.ts b/packages/core/src/protocol/search/filters/value.ts index c818bba1..0107d7ae 100644 --- a/packages/core/src/protocol/search/filters/value.ts +++ b/packages/core/src/protocol/search/filters/value.ts @@ -33,6 +33,8 @@ export interface SCValueFilterArguments extends SCSearchAbstractFilterArguments /** * Value to filter. One or more values has to match the field exactly. + * + * Leaving the value out will check if the field exists. */ - value: string | string[]; + value?: string | string[]; }