From d42f257f9ec4cd518b189b6217d2cafffe5836c7 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 6 Dec 2023 21:09:30 +0800 Subject: [PATCH] fix searching for multiple labels in iOS --- packages/api/src/services/library_item.ts | 8 ++++---- packages/api/src/utils/search.ts | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 4264fbc1a..3baad9cc3 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -181,15 +181,14 @@ export const buildQuery = ( return null } - const param = 'implicit_field' - const alias = 'rank' + const param = `implicit_field_${parameters.length}` + const alias = `rank_${parameters.length}` selects.push({ column: `ts_rank_cd(library_item.search_tsv, websearch_to_tsquery('english', :${param}))`, alias, }) - // always sort by rank first - orders.unshift({ by: alias, order: SortOrder.DESCENDING }) + orders.push({ by: alias, order: SortOrder.DESCENDING }) return escapeQueryWithParameters( `websearch_to_tsquery('english', :${param}) @@ library_item.search_tsv`, @@ -532,6 +531,7 @@ export const buildQuery = ( } case 'use': case 'mode': + case 'event': // mode is ignored and used only by the frontend return null case 'readPosition': diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 167b80acf..196cd652f 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -7,6 +7,8 @@ export const parseSearchQuery = (query: string): LiqeQuery => { .replace('in:library', 'no:subscription') // compatibility with old search // wrap the value behind colon in quotes if it's not already .replace(/(\w+):("([^"]+)"|([^")\s]+))/g, '$1:"$3$4"') + // remove any quotes that are in the array value for example: label:"test","test2" -> label:"test,test2" + .replace(/","/g, ',') return parse(searchQuery) }