From e94752d2d71f8d57a57bd3e8270787557d9b5558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Mon, 15 Jul 2019 17:35:06 +0200 Subject: [PATCH] feat(index): merge `ruleContexts` search parameter (#3944) --- .../__tests__/mergeSearchParameters-test.ts | 27 +++++++++++++++++++ src/lib/utils/mergeSearchParameters.ts | 25 ++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/__tests__/mergeSearchParameters-test.ts b/src/lib/utils/__tests__/mergeSearchParameters-test.ts index f980374e6f..88f9255e18 100644 --- a/src/lib/utils/__tests__/mergeSearchParameters-test.ts +++ b/src/lib/utils/__tests__/mergeSearchParameters-test.ts @@ -381,4 +381,31 @@ describe('mergeSearchParameters', () => { }) ); }); + + it('merges and dedupes `ruleContexts` parameters', () => { + const actual = merge( + algoliasearchHelper.SearchParameters.make({ + ruleContexts: ['ais-genre-comedy'], + }), + algoliasearchHelper.SearchParameters.make({ + ruleContexts: ['ais-genre-thriller', 'ais-genre-comedy'], + }), + algoliasearchHelper.SearchParameters.make({ + ruleContexts: ['ais-rating-4'], + }), + algoliasearchHelper.SearchParameters.make({ + ruleContexts: [], + }) + ); + + expect(actual).toEqual( + algoliasearchHelper.SearchParameters.make({ + ruleContexts: [ + 'ais-genre-comedy', + 'ais-genre-thriller', + 'ais-rating-4', + ], + }) + ); + }); }); diff --git a/src/lib/utils/mergeSearchParameters.ts b/src/lib/utils/mergeSearchParameters.ts index 1a59c74497..20478465cf 100644 --- a/src/lib/utils/mergeSearchParameters.ts +++ b/src/lib/utils/mergeSearchParameters.ts @@ -1,5 +1,6 @@ import { SearchParameters } from 'algoliasearch-helper'; import findIndex from './findIndex'; +import uniq from './uniq'; type Merger = ( left: SearchParameters, @@ -17,6 +18,7 @@ const mergeWithRest: Merger = (left, right) => { tagRefinements, hierarchicalFacets, hierarchicalFacetsRefinements, + ruleContexts, ...rest } = right; @@ -103,6 +105,23 @@ const mergeHierarchicalFacetsRefinements: Merger = (left, right) => }, }); +const mergeRuleContexts: Merger = (left, right) => { + const ruleContexts: string[] = uniq( + ([] as any) + .concat(left.ruleContexts) + .concat(right.ruleContexts) + .filter(Boolean) + ); + + if (ruleContexts.length > 0) { + return left.setQueryParameters({ + ruleContexts, + }); + } + + return left; +}; + const merge = (...parameters: SearchParameters[]): SearchParameters => parameters.reduce((left, right) => { const hierarchicalFacetsRefinementsMerged = mergeHierarchicalFacetsRefinements( @@ -137,7 +156,11 @@ const merge = (...parameters: SearchParameters[]): SearchParameters => facetRefinementsMerged, right ); - const facetsMerged = mergeFacets(disjunctiveFacetsMerged, right); + const ruleContextsMerged = mergeRuleContexts( + disjunctiveFacetsMerged, + right + ); + const facetsMerged = mergeFacets(ruleContextsMerged, right); return mergeWithRest(facetsMerged, right); });