Skip to content
This repository has been archived by the owner on Jul 11, 2023. It is now read-only.

Commit

Permalink
fix(facetValues): use existing facet filters in multi queries for hie…
Browse files Browse the repository at this point in the history
…rarchical facet values (#915)
  • Loading branch information
dhayab committed Sep 9, 2022
1 parent 22fdc9a commit bae388c
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 10 deletions.
31 changes: 30 additions & 1 deletion src/requestBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,37 @@ var requestBuilder = {
level === 0
);

// Keep facet filters unrelated to current hierarchical attributes
function hasHierarchicalFacetFilter(value) {
return hierarchicalFacet.attributes.some(function(attribute) {
return attribute === value.split(':')[0];
});
}

var filteredFacetFilters = (params.facetFilters || []).reduce(function(acc, facetFilter) {
if (Array.isArray(facetFilter)) {
var filtered = facetFilter.filter(function(filterValue) {
return !hasHierarchicalFacetFilter(filterValue);
});

if (filtered.length > 0) {
acc.push(filtered);
}
}

if (typeof facetFilter === 'string' && !hasHierarchicalFacetFilter(facetFilter)) {
acc.push(facetFilter);
}

return acc;
}, []);

var parent = filtersMap[level - 1];
params.facetFilters = level > 0 ? [parent.attribute + ':' + parent.value] : undefined;
if (level > 0) {
params.facetFilters = filteredFacetFilters.concat(parent.attribute + ':' + parent.value);
} else {
params.facetFilters = filteredFacetFilters.length > 0 ? filteredFacetFilters : undefined;
}

queries.push({indexName: index, params: params});
});
Expand Down
39 changes: 30 additions & 9 deletions test/spec/requestBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ test('does only a single query if refinements are empty', function() {
expect(queries).toHaveLength(1);
});

test('does multiple queries to retrieve all facet values of hierarchical parent levels', function() {
describe('hierarchical facets', function() {
var searchParams = new SearchParameters({
hierarchicalFacets: [{
name: 'categories.lvl0',
Expand All @@ -78,17 +78,38 @@ test('does multiple queries to retrieve all facet values of hierarchical parent
}
});

var queries = getQueries(searchParams.index, searchParams);
test('retrieve facet values of parent levels with multiple queries', function() {
var queries = getQueries(searchParams.index, searchParams);

expect(queries).toHaveLength(4);

expect(queries).toHaveLength(4);
// Root
expect(queries[2].params.facets).toEqual(['categories.lvl0']);
expect(queries[2].params.facetsFilters).toBeUndefined();

// Level 1
expect(queries[3].params.facets).toEqual('categories.lvl1');
expect(queries[3].params.facetFilters).toEqual(['categories.lvl0:beers']);
});

// Root
expect(queries[2].params.facets).toEqual(['categories.lvl0']);
expect(queries[2].params.facetsFilters).toBeUndefined();
test('take other facet filters into account', function() {
var newSearchParams = searchParams
.addDisjunctiveFacet('brand')
.addDisjunctiveFacetRefinement('brand', 'Incipio')
;

// Level 1
expect(queries[3].params.facets).toEqual('categories.lvl1');
expect(queries[3].params.facetFilters).toEqual(['categories.lvl0:beers']);
var queries = getQueries(newSearchParams.index, newSearchParams);

expect(queries).toHaveLength(5);

// Root
expect(queries[3].params.facets).toEqual(['categories.lvl0']);
expect(queries[3].params.facetFilters).toEqual([['brand:Incipio']]);

// Level 1
expect(queries[4].params.facets).toEqual('categories.lvl1');
expect(queries[4].params.facetFilters).toEqual([['brand:Incipio'], 'categories.lvl0:beers']);
});
});

test('orders parameters alphabetically in every query', function() {
Expand Down

0 comments on commit bae388c

Please sign in to comment.