Skip to content

Commit efbaead

Browse files
meili-bors[bot]atoulmetcurquiza
authored
Merge #1252
1252: Fix `HierarchicalMenu` when `keepZeroFacets` is set to true r=curquiza a=atoulmet # Pull Request ## Related issue Fixes #1040 ## What does this PR do? The `initialFacetDistribution` were missing the hierarchical facets we get from the search, which was breaking the `HierarchicalMenu`. This PR aims to fix it by adding `fillMissingFacets` function that is called at every search. It also updates the React playground to `instant-search` v7. ## PR checklist Please check if your PR fulfills the following requirements: - [x] Does this PR fix an existing issue, or have you listed the changes applied in the PR description (and why they are needed)? - [x] Have you read the contributing guidelines? - [x] Have you made sure that the title is accurate and descriptive of the changes? Thank you so much for contributing to Meilisearch! Co-authored-by: Alexia Toulmet <alexia.toulmet@gmail.com> Co-authored-by: curquiza <clementine@meilisearch.com>
2 parents 40597fa + abd298e commit efbaead

File tree

8 files changed

+139
-22
lines changed

8 files changed

+139
-22
lines changed

.changeset/giant-clouds-smell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@meilisearch/instant-meilisearch": patch
3+
---
4+
5+
Fix HierarchicalMenu when keepZeroFacets is set to true
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { fillMissingFacets } from '../init-facets-distribution'
2+
3+
describe('Fill missing facets', () => {
4+
it('should fill missing facets without changing the results', () => {
5+
const initialFacetDistribution = {
6+
movies: {
7+
'categories.lvl0': {
8+
goods: 6,
9+
},
10+
genres: {
11+
Action: 2,
12+
},
13+
},
14+
}
15+
16+
const searchResults = [
17+
{
18+
hits: [{ id: 1 }, { id: 2 }, { id: 3 }],
19+
processingTimeMs: 0,
20+
query: '',
21+
indexUid: 'movies',
22+
pagination: {
23+
finite: true,
24+
hitsPerPage: 0,
25+
page: 0,
26+
},
27+
facetDistribution: {
28+
'categories.lvl0': {
29+
goods: 42,
30+
},
31+
'categories.lvl1': {
32+
'goods > to drink': 1,
33+
},
34+
genres: {
35+
Action: 1,
36+
},
37+
},
38+
},
39+
]
40+
41+
const result = fillMissingFacets(initialFacetDistribution, searchResults)
42+
expect(result).toEqual({
43+
movies: {
44+
'categories.lvl0': {
45+
goods: 6,
46+
},
47+
'categories.lvl1': {
48+
'goods > to drink': 1,
49+
},
50+
genres: {
51+
Action: 2,
52+
},
53+
},
54+
})
55+
})
56+
})

packages/instant-meilisearch/src/cache/init-facets-distribution.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
SearchContext,
44
MeiliSearchMultiSearchParams,
55
MultiSearchResolver,
6+
MeilisearchMultiSearchResult,
67
} from '../types'
78
import { MeiliParamsCreator } from '../adapter'
89
import { removeDuplicate } from '../utils'
@@ -53,3 +54,16 @@ export async function initFacetDistribution(
5354

5455
return initialFacetDistribution
5556
}
57+
58+
export function fillMissingFacets(
59+
initialFacetDistribution: Record<string, FacetDistribution>,
60+
meilisearchResults: MeilisearchMultiSearchResult[]
61+
) {
62+
for (const searchResult of meilisearchResults) {
63+
initialFacetDistribution[searchResult.indexUid] = {
64+
...(searchResult.facetDistribution || {}),
65+
...(initialFacetDistribution[searchResult.indexUid] || {}),
66+
}
67+
}
68+
return initialFacetDistribution
69+
}

packages/instant-meilisearch/src/client/instant-meilisearch-client.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
SearchCache,
2727
initFacetDistribution,
2828
getParametersWithoutFilters,
29+
fillMissingFacets,
2930
} from '../cache/'
3031
import { constructClientAgents } from './agents'
3132

@@ -122,6 +123,12 @@ export function instantMeiliSearch(
122123
instantSearchPagination // Create issue on pagination
123124
)
124125

126+
// Fill the missing facet values if keepZeroFacets is true
127+
initialFacetDistribution = fillMissingFacets(
128+
initialFacetDistribution,
129+
meilisearchResults
130+
)
131+
125132
const instantSearchResponse = adaptSearchResults<T>(
126133
meilisearchResults,
127134
initialFacetDistribution,

playgrounds/local-react/src/components/MultiIndex.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
InfiniteHits,
1010
Pagination,
1111
Hits,
12-
} from 'react-instantsearch-dom'
12+
} from 'react-instantsearch'
1313
import { instantMeiliSearch } from '@meilisearch/instant-meilisearch'
1414

1515
const searchClient = instantMeiliSearch('http://localhost:7700', 'masterKey', {

playgrounds/local-react/src/components/SingleMovieIndex.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
Highlight,
99
ClearRefinements,
1010
RefinementList,
11-
} from 'react-instantsearch-dom'
11+
} from 'react-instantsearch'
1212
import { instantMeiliSearch } from '@meilisearch/instant-meilisearch'
1313

1414
const searchClient = instantMeiliSearch('http://localhost:7700', 'masterKey', {

playgrounds/react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"dependencies": {
2323
"react": "^17.0.1",
2424
"react-dom": "^17.0.1",
25-
"react-instantsearch-dom": "^6.40.4",
25+
"react-instantsearch": "^7.1.0",
2626
"@meilisearch/instant-meilisearch": "0.13.5"
2727
},
2828
"devDependencies": {

yarn.lock

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3848,6 +3848,13 @@ algoliasearch-helper@3.14.0:
38483848
dependencies:
38493849
"@algolia/events" "^4.0.1"
38503850

3851+
algoliasearch-helper@3.14.2:
3852+
version "3.14.2"
3853+
resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.14.2.tgz#c34cfe6cefcfecd65c60bcb8bf9b68134472d28c"
3854+
integrity sha512-FjDSrjvQvJT/SKMW74nPgFpsoPUwZCzGbCqbp8HhBFfSk/OvNFxzCaCmuO0p7AWeLy1gD+muFwQEkBwcl5H4pg==
3855+
dependencies:
3856+
"@algolia/events" "^4.0.1"
3857+
38513858
algoliasearch@^4.17.2:
38523859
version "4.17.2"
38533860
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.17.2.tgz#ca861340e04a78da8dc5f8c5646ee38c3d8b7ec7"
@@ -4893,25 +4900,10 @@ caniuse-api@^3.0.0:
48934900
lodash.memoize "^4.1.2"
48944901
lodash.uniq "^4.5.0"
48954902

4896-
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001400:
4897-
version "1.0.30001443"
4898-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001443.tgz#8fc85f912d5471c9821acacf9e715c421ca0dd1f"
4899-
integrity sha512-jUo8svymO8+Mkj3qbUbVjR8zv8LUGpGkUM/jKvc9SO2BvjCI980dp9fQbf/dyLs6RascPzgR4nhAKFA4OHeSaA==
4900-
4901-
caniuse-lite@^1.0.30001426:
4902-
version "1.0.30001445"
4903-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz#cf2d4eb93f2bcdf0310de9dd6d18be271bc0b447"
4904-
integrity sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg==
4905-
4906-
caniuse-lite@^1.0.30001449:
4907-
version "1.0.30001450"
4908-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f"
4909-
integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==
4910-
4911-
caniuse-lite@^1.0.30001502:
4912-
version "1.0.30001502"
4913-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz#f7e4a76eb1d2d585340f773767be1fefc118dca8"
4914-
integrity sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg==
4903+
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001502:
4904+
version "1.0.30001538"
4905+
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz"
4906+
integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==
49154907

49164908
caseless@~0.12.0:
49174909
version "0.12.0"
@@ -8428,6 +8420,25 @@ instantsearch.js@4.56.8, instantsearch.js@^4.48.1, instantsearch.js@^4.56.2:
84288420
qs "^6.5.1 < 6.10"
84298421
search-insights "^2.6.0"
84308422

8423+
instantsearch.js@4.57.0:
8424+
version "4.57.0"
8425+
resolved "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.57.0.tgz#9165111679fcf5688f08c33078dcb21cd3ef2779"
8426+
integrity sha512-oaWmX4gUI4U8fcj77FmR3UPHfHOYpJoeHhek+9wM4bZ+VJ8uAQZOV/aBGka7Kmvln8NLZ7rqn+Hm84tDunIBog==
8427+
dependencies:
8428+
"@algolia/events" "^4.0.1"
8429+
"@algolia/ui-components-highlight-vdom" "^1.2.1"
8430+
"@algolia/ui-components-shared" "^1.2.1"
8431+
"@types/dom-speech-recognition" "^0.0.1"
8432+
"@types/google.maps" "^3.45.3"
8433+
"@types/hogan.js" "^3.0.0"
8434+
"@types/qs" "^6.5.3"
8435+
algoliasearch-helper "3.14.2"
8436+
hogan.js "^3.0.2"
8437+
htm "^3.0.0"
8438+
preact "^10.10.0"
8439+
qs "^6.5.1 < 6.10"
8440+
search-insights "^2.6.0"
8441+
84318442
internal-slot@^1.0.2:
84328443
version "1.0.3"
84338444
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
@@ -12318,6 +12329,16 @@ react-instantsearch-core@6.40.4:
1231812329
prop-types "^15.6.2"
1231912330
react-fast-compare "^3.0.0"
1232012331

12332+
react-instantsearch-core@7.1.0:
12333+
version "7.1.0"
12334+
resolved "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.1.0.tgz#bf8ddc34655b5bd383a69f00979425ac5cc73c3f"
12335+
integrity sha512-f+QZqUhQ1my/c//kw23Tn8jO1LQVqGRh8ObCbHnDzSPyI9Kp5+ETvI0BbXby1I4iObIjE1ApLhugBkli77zsTQ==
12336+
dependencies:
12337+
"@babel/runtime" "^7.1.2"
12338+
algoliasearch-helper "3.14.2"
12339+
instantsearch.js "4.57.0"
12340+
use-sync-external-store "^1.0.0"
12341+
1232112342
react-instantsearch-dom@^6.40.4:
1232212343
version "6.40.4"
1232312344
resolved "https://registry.yarnpkg.com/react-instantsearch-dom/-/react-instantsearch-dom-6.40.4.tgz#9e56bb66626a66da523bd343e2cb5cd6362efbe4"
@@ -12330,6 +12351,15 @@ react-instantsearch-dom@^6.40.4:
1233012351
react-fast-compare "^3.0.0"
1233112352
react-instantsearch-core "6.40.4"
1233212353

12354+
react-instantsearch@^7.1.0:
12355+
version "7.1.0"
12356+
resolved "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.1.0.tgz#812bd7c28ccdd08cc4e6087e07c144eb85097dee"
12357+
integrity sha512-AdOP2+ubNVZCkODi45IXpWo9AklTjEGm9xqFQ227zt6CA6NLVhY5otFGkWPBrQwwbEnSKO5PH563pfNGnCMsRQ==
12358+
dependencies:
12359+
"@babel/runtime" "^7.1.2"
12360+
instantsearch.js "4.57.0"
12361+
react-instantsearch-core "7.1.0"
12362+
1233312363
react-is@^16.13.1:
1233412364
version "16.13.1"
1233512365
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -14569,6 +14599,11 @@ url@^0.11.0:
1456914599
punycode "1.3.2"
1457014600
querystring "0.2.0"
1457114601

14602+
use-sync-external-store@^1.0.0:
14603+
version "1.2.0"
14604+
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
14605+
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
14606+
1457214607
use@^3.1.0:
1457314608
version "3.1.1"
1457414609
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"

0 commit comments

Comments
 (0)