From 0de67c4d2ae21fb7ed891b93ea43dcef28946e32 Mon Sep 17 00:00:00 2001 From: Tomasz Szuba Date: Thu, 21 Oct 2021 13:54:44 +0200 Subject: [PATCH] Handle single-item array filter in Lunr search engine Signed-off-by: Tomasz Szuba --- .changeset/spicy-foxes-joke.md | 5 +++++ .../search-backend-node/src/engines/LunrSearchEngine.ts | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/spicy-foxes-joke.md diff --git a/.changeset/spicy-foxes-joke.md b/.changeset/spicy-foxes-joke.md new file mode 100644 index 0000000000..c1ed318f6d --- /dev/null +++ b/.changeset/spicy-foxes-joke.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-node': patch +--- + +Handle special case when filter array has single value optimizing Lunr search behaviour. diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index f22762cb9f..ea51ffe8e1 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -80,11 +80,17 @@ export class LunrSearchEngine implements SearchEngine { }); if (filters) { - Object.entries(filters).forEach(([field, value]) => { + Object.entries(filters).forEach(([field, fieldValue]) => { if (!q.allFields.includes(field)) { // Throw for unknown field, as this will be a non match throw new Error(`unrecognised field ${field}`); } + // Arrays are poorly supported, but we can make it better for single-item arrays, + // which should be a common case + const value = + Array.isArray(fieldValue) && fieldValue.length === 1 + ? fieldValue[0] + : fieldValue; // Require that the given field has the given value if (['string', 'number', 'boolean'].includes(typeof value)) {