From 319c1d22b067b75064444cfecd39ae909b8e96b9 Mon Sep 17 00:00:00 2001 From: ShashaankS Date: Mon, 13 Jan 2025 17:29:07 +0530 Subject: [PATCH] Added switch based mapping for filters in searchbar --- frontend/src/api/fetchAlgoliaData.ts | 27 ++++++++++++++++++++++++--- frontend/src/utils/filterMapping.ts | 20 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 frontend/src/utils/filterMapping.ts diff --git a/frontend/src/api/fetchAlgoliaData.ts b/frontend/src/api/fetchAlgoliaData.ts index a338705e1c..6a86b7ef94 100644 --- a/frontend/src/api/fetchAlgoliaData.ts +++ b/frontend/src/api/fetchAlgoliaData.ts @@ -1,6 +1,7 @@ import { SearchResponse } from 'algoliasearch' import { AlgoliaRequestType, AlgoliaResponseType } from 'types/algolia' import { ENVIRONMENT } from 'utils/credentials' +import { getParamsForFilters } from 'utils/filterMapping' import { client } from 'utils/helpers/algoliaClient' import { getParamsForIndexName } from 'utils/paramsMapping' @@ -17,17 +18,37 @@ export const fetchAlgoliaData = async ( } try { const params = getParamsForIndexName(indexName) + + let filters = '' + let searchQuery = query + + const filterRegex = /(\w+)([:><=!]+)([^ ]+)/g + let match + + while ((match = filterRegex.exec(query)) !== null) { + const [fullMatch, attribute, operator, value] = match + filters += `${attribute}${operator}${value} AND ` + searchQuery = searchQuery.replace(fullMatch, '').trim() + } + + filters = filters.trim().replace(/AND$/, '') + filters = getParamsForFilters(indexName, filters) + + if (filterKey) { + filters = filters ? `(${filters}) AND idx_key:${filterKey}` : `idx_key:${filterKey}` + } + const request: AlgoliaRequestType = { attributesToHighlight: [], hitsPerPage: 25, indexName: `${ENVIRONMENT}_${indexName}`, page: currentPage - 1, - query: query, + query: searchQuery, removeWordsIfNoResults: 'allOptional', ...params, } - if (filterKey) { - request.filters = `idx_key: ${filterKey}` + if (filters) { + request.filters = filters } const { results } = await client.search({ diff --git a/frontend/src/utils/filterMapping.ts b/frontend/src/utils/filterMapping.ts new file mode 100644 index 0000000000..13cfb8bd43 --- /dev/null +++ b/frontend/src/utils/filterMapping.ts @@ -0,0 +1,20 @@ +export const getParamsForFilters = (indexName: string, filter: string) => { + filter = filter.trim() + switch (indexName) { + case 'projects': + switch (true) { + case /^contributors([><]=?|=)(\d+)$/.test(filter): + return filter.replace(/^contributors([><]=?|=)(\d+)$/, 'idx_contributors_count$1$2') + case /^stars([><]=?|=)(\d+)$/.test(filter): + return filter.replace(/^stars([><]=?|=)(\d+)$/, 'idx_stars_count$1$2') + case /^forks([><]=?|=)(\d+)$/.test(filter): + return filter.replace(/^forks([><]=?|=)(\d+)$/, 'idx_forks_count$1$2') + case /^is:([a-zA-Z]+)$/.test(filter): + return filter.replace(/^is:([a-zA-Z]+)$/, 'idx_type:$1') + default: + return filter + } + default: + return filter + } +}