From fc18004a5d7fdce1a3b1aa0183fa5698153877ad Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 23 Feb 2022 16:43:07 +0800 Subject: [PATCH] add labels in search query --- packages/api/src/datalayer/links/index.ts | 14 ++++++++++++-- packages/api/src/resolvers/article/index.ts | 6 ++++-- packages/api/src/utils/search.ts | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/api/src/datalayer/links/index.ts b/packages/api/src/datalayer/links/index.ts index 10a8d991e..70ecc56bf 100644 --- a/packages/api/src/datalayer/links/index.ts +++ b/packages/api/src/datalayer/links/index.ts @@ -403,6 +403,7 @@ class UserArticleModel extends DataModel< inFilter: InFilter readFilter: ReadFilter typeFilter: PageType | undefined + labelFilters?: string[] }, userId: string, tx = this.kx, @@ -441,6 +442,16 @@ class UserArticleModel extends DataModel< } } + // search by labels using lowercase + if (args.labelFilters) { + queryPromise + .innerJoin(Table.LINK_LABELS, 'link_labels.link_id', 'links.id') + .innerJoin(Table.LABELS, 'labels.id', 'link_labels.label_id') + .whereRaw('LOWER(omnivore.labels.name) = ANY(?)', [args.labelFilters]) + } + + console.log(queryPromise.toString()) + if (notNullField) { queryPromise.whereNotNull(notNullField) } @@ -469,12 +480,11 @@ class UserArticleModel extends DataModel< .orderBy('omnivore.links.id', sortOrder) .limit(limit) - // console.log('query', queryPromise.toString()) const rows = await queryPromise - for (const row of rows) { this.loader.prime(row.id, row) } + return [rows, parseInt(totalCount as string)] } diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index c21f13f85..56a3872d1 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -539,8 +539,8 @@ export const getArticlesResolver = authorized< const first = params.first || 10 // Perform basic sanitization. Right now we just allow alphanumeric, space and quote - // so queries can contain phrases like "human race". In the future we will need to - // split out terms like "label:unread". + // so queries can contain phrases like "human race"; + // We can also split out terms like "label:unread". const searchQuery = parseSearchQuery(params.query || undefined) analytics.track({ @@ -551,6 +551,7 @@ export const getArticlesResolver = authorized< inFilter: searchQuery.inFilter, readFilter: searchQuery.readFilter, typeFilter: searchQuery.typeFilter, + labelFilters: searchQuery.labelFilters, env: env.server.apiEnv, }, }) @@ -566,6 +567,7 @@ export const getArticlesResolver = authorized< inFilter: searchQuery.inFilter, readFilter: searchQuery.readFilter, typeFilter: searchQuery.typeFilter, + labelFilters: searchQuery.labelFilters, }, claims.uid, tx, diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 4769e4638..2f14fd196 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -86,7 +86,10 @@ const parseLabelFilters = ( return labelFilters } - return labelFilters ? labelFilters.concat(str) : [str] + // use lower case for label names + const label = str.toLowerCase() + + return labelFilters ? labelFilters.concat(label) : [label] } export const parseSearchQuery = (query: string | undefined): SearchFilter => {