diff --git a/meilisearch-core/src/bucket_sort.rs b/meilisearch-core/src/bucket_sort.rs index f0fc71bd0..6c9b87301 100644 --- a/meilisearch-core/src/bucket_sort.rs +++ b/meilisearch-core/src/bucket_sort.rs @@ -100,6 +100,12 @@ where debug!("found {} documents", docids.len()); debug!("number of postings {:?}", queries.len()); + if let Some(f) = facet_count_docids { + // hardcoded value, until approximation optimization + result.exhaustive_facets_count = Some(true); + result.facets = Some(facet_count(f, &docids)); + } + if let Some(facets_docids) = facets_docids { let intersection = sdset::duo::OpBuilder::new(docids.as_ref(), facets_docids.as_set()) .intersection() @@ -107,12 +113,6 @@ where docids = Cow::Owned(intersection); } - if let Some(f) = facet_count_docids { - // hardcoded value, until approximation optimization - result.exhaustive_facets_count = Some(true); - result.facets = Some(facet_count(f, &docids)); - } - let before = Instant::now(); mk_arena!(arena); let mut bare_matches = cleanup_bare_matches(&mut arena, &docids, queries); @@ -243,6 +243,12 @@ where debug!("found {} documents", docids.len()); debug!("number of postings {:?}", queries.len()); + if let Some(f) = facet_count_docids { + // hardcoded value, until approximation optimization + result.exhaustive_facets_count = Some(true); + result.facets = Some(facet_count(f, &docids)); + } + if let Some(facets_docids) = facets_docids { let intersection = OpBuilder::new(docids.as_ref(), facets_docids.as_set()) .intersection() @@ -250,12 +256,6 @@ where docids = Cow::Owned(intersection); } - if let Some(f) = facet_count_docids { - // hardcoded value, until approximation optimization - result.exhaustive_facets_count = Some(true); - result.facets = Some(facet_count(f, &docids)); - } - let before = Instant::now(); mk_arena!(arena); let mut bare_matches = cleanup_bare_matches(&mut arena, &docids, queries); diff --git a/meilisearch-http/tests/search.rs b/meilisearch-http/tests/search.rs index 450e99794..18d0139bd 100644 --- a/meilisearch-http/tests/search.rs +++ b/meilisearch-http/tests/search.rs @@ -1466,7 +1466,6 @@ async fn test_facet_count() { server.update_all_settings(body).await; // same as before, but now facets are set: test_post_get_search!(server, query, |response, _status_code|{ - println!("{}", response); assert!(response.get("exhaustiveFacetsCount").is_some()); assert_eq!(response.get("facetsDistribution").unwrap().as_object().unwrap().values().count(), 1); // assert that case is preserved @@ -1696,3 +1695,37 @@ async fn update_documents_with_facet_distribution() { let (response2, _) = server.search_post(search).await; assert_json_eq!(expected_facet_distribution, response2["facetsDistribution"].clone()); } + +#[actix_rt::test] +async fn test_facet_count_with_facet_filter() { + let mut server = common::Server::test_server().await; + let body = json!({ + "attributesForFaceting": ["gender"] + }); + server.update_all_settings(body).await; + let query = json!({ + "q": "a", + "facetsDistribution": ["gender"], + "facetFilters": ["gender:male"], + }); + + test_post_get_search!(server, query, |response, _status_code|{ + assert!(response.get("exhaustiveFacetsCount").is_some()); + let facets_distribution = response.get("facetsDistribution").unwrap().as_object(); + assert_eq!(facets_distribution.unwrap()["gender"]["male"], 37); + assert_eq!(facets_distribution.unwrap()["gender"]["female"], 39); + }); + // facet distribution should remain the same when facet filter changes + let query = json!({ + "q": "a", + "facetsDistribution": ["gender"], + "facetFilters": [["gender:male", "gender:female"]], + }); + + test_post_get_search!(server, query, |response, _status_code|{ + assert!(response.get("exhaustiveFacetsCount").is_some()); + let facets_distribution = response.get("facetsDistribution").unwrap().as_object(); + assert_eq!(facets_distribution.unwrap()["gender"]["male"], 37); + assert_eq!(facets_distribution.unwrap()["gender"]["female"], 39); + }); +}