Allow search for subscription:name (#461)

This commit is contained in:
Hongbo Wu 2022-04-22 08:47:41 +08:00 committed by GitHub
parent 9c72f99520
commit 71aa66ea9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 1 deletions

View file

@ -99,7 +99,8 @@
"type": "text"
},
"subscription": {
"type": "keyword"
"type": "keyword",
"normalizer": "lowercase_normalizer"
}
}
}

View file

@ -16,6 +16,7 @@ import {
SortBy,
SortOrder,
SortParams,
SubscriptionFilter,
} from '../utils/search'
import { client, INDEX_ALIAS } from './index'
import { EntityType } from '../datalayer/pubsub'
@ -170,6 +171,17 @@ const appendPublishedDateFilter = (
})
}
const appendSubscriptionFilter = (
body: SearchBody,
filter: SubscriptionFilter
): void => {
body.query.bool.filter.push({
term: {
subscription: filter.name,
},
})
}
export const createPage = async (
page: Page,
ctx: PageContext
@ -322,6 +334,7 @@ export const searchPages = async (
hasFilters?: HasFilter[]
savedDateFilter?: DateRangeFilter
publishedDateFilter?: DateRangeFilter
subscriptionFilter?: SubscriptionFilter
},
userId: string
): Promise<[Page[], number] | undefined> => {
@ -338,6 +351,7 @@ export const searchPages = async (
hasFilters = [],
savedDateFilter,
publishedDateFilter,
subscriptionFilter,
} = args
// default order is descending
const sortOrder = sort?.order || SortOrder.DESCENDING
@ -406,6 +420,9 @@ export const searchPages = async (
if (publishedDateFilter) {
appendPublishedDateFilter(body, publishedDateFilter)
}
if (subscriptionFilter) {
appendSubscriptionFilter(body, subscriptionFilter)
}
console.log('searching pages in elastic', JSON.stringify(body))

View file

@ -11,6 +11,11 @@ export interface SearchBody {
userId: string
}
}
| {
term: {
subscription: string
}
}
| { term: { pageType: string } }
| { exists: { field: string } }
| {

View file

@ -463,6 +463,7 @@ export const getArticlesResolver = authorized<
hasFilters: searchQuery.hasFilters,
savedDateFilter: searchQuery.savedDateFilter,
publishedDateFilter: searchQuery.publishedDateFilter,
subscriptionFilter: searchQuery.subscriptionFilter,
},
})
@ -481,6 +482,7 @@ export const getArticlesResolver = authorized<
hasFilters: searchQuery.hasFilters,
savedDateFilter: searchQuery.savedDateFilter,
publishedDateFilter: searchQuery.publishedDateFilter,
subscriptionFilter: searchQuery.subscriptionFilter,
},
claims.uid
)) || [[], 0]
@ -859,6 +861,7 @@ export const searchResolver = authorized<
hasFilters: searchQuery.hasFilters,
savedDateFilter: searchQuery.savedDateFilter,
publishedDateFilter: searchQuery.publishedDateFilter,
subscriptionFilter: searchQuery.subscriptionFilter,
},
claims.uid
)) || [[], 0]

View file

@ -33,6 +33,7 @@ export type SearchFilter = {
hasFilters: HasFilter[]
savedDateFilter?: DateRangeFilter
publishedDateFilter?: DateRangeFilter
subscriptionFilter?: SubscriptionFilter
}
export enum LabelFilterType {
@ -71,6 +72,10 @@ export type SortParams = {
order?: SortOrder
}
export type SubscriptionFilter = {
name: string
}
const parseIsFilter = (str: string | undefined): ReadFilter => {
switch (str?.toUpperCase()) {
case 'READ':
@ -195,6 +200,18 @@ const parseDateRangeFilter = (str?: string): DateRangeFilter | undefined => {
}
}
const parseSubscriptionFilter = (
str?: string
): SubscriptionFilter | undefined => {
if (str === undefined) {
return undefined
}
return {
name: str.toLowerCase(),
}
}
export const parseSearchQuery = (query: string | undefined): SearchFilter => {
const searchQuery = query ? query.replace(/\W\s":/g, '') : undefined
const result: SearchFilter = {
@ -225,6 +242,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => {
'has',
'saved',
'published',
'subscription',
],
tokenize: true,
})
@ -283,6 +301,9 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => {
case 'published':
result.publishedDateFilter = parseDateRangeFilter(keyword.value)
break
case 'subscription':
result.subscriptionFilter = parseSubscriptionFilter(keyword.value)
break
}
}
}