From 7d1c2d97bf29efe7503287cb18173fd8e6d349eb Mon Sep 17 00:00:00 2001 From: Kerollmops Date: Tue, 26 Apr 2022 17:59:53 +0200 Subject: [PATCH 1/2] Return facets even when there is no values associated to it --- milli/src/search/facet/facet_distribution.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/milli/src/search/facet/facet_distribution.rs b/milli/src/search/facet/facet_distribution.rs index 2208ee636..ddbcb2b68 100644 --- a/milli/src/search/facet/facet_distribution.rs +++ b/milli/src/search/facet/facet_distribution.rs @@ -243,9 +243,7 @@ impl<'a> FacetDistribution<'a> { for (fid, name) in fields_ids_map.iter() { if crate::is_faceted(name, &fields) { let values = self.facet_values(fid)?; - if !values.is_empty() { - distribution.insert(name.to_string(), values); - } + distribution.insert(name.to_string(), values); } } From a4d343aade38b97a53baedcba7cad37c5665a712 Mon Sep 17 00:00:00 2001 From: Kerollmops Date: Tue, 26 Apr 2022 18:12:58 +0200 Subject: [PATCH 2/2] Add a test to check for the returned facet distribution --- milli/tests/search/facet_distribution.rs | 77 ++++++++++++++++++++++++ milli/tests/search/mod.rs | 1 + 2 files changed, 78 insertions(+) create mode 100644 milli/tests/search/facet_distribution.rs diff --git a/milli/tests/search/facet_distribution.rs b/milli/tests/search/facet_distribution.rs new file mode 100644 index 000000000..d3aece2ab --- /dev/null +++ b/milli/tests/search/facet_distribution.rs @@ -0,0 +1,77 @@ +use std::io::Cursor; + +use big_s::S; +use heed::EnvOpenOptions; +use maplit::hashset; +use milli::documents::{DocumentBatchBuilder, DocumentBatchReader}; +use milli::update::{IndexDocuments, IndexDocumentsConfig, IndexerConfig, Settings}; +use milli::{FacetDistribution, Index}; + +#[test] +fn test_facet_distribution_with_no_facet_values() { + let path = tempfile::tempdir().unwrap(); + let mut options = EnvOpenOptions::new(); + options.map_size(10 * 1024 * 1024); // 10 MB + let index = Index::new(options, &path).unwrap(); + + let mut wtxn = index.write_txn().unwrap(); + let config = IndexerConfig::default(); + let mut builder = Settings::new(&mut wtxn, &index, &config); + + builder.set_filterable_fields(hashset! { + S("genres"), + S("tags"), + }); + builder.execute(|_| ()).unwrap(); + + // index documents + let config = IndexerConfig { max_memory: Some(10 * 1024 * 1024), ..Default::default() }; + let indexing_config = IndexDocumentsConfig { autogenerate_docids: true, ..Default::default() }; + + let mut builder = + IndexDocuments::new(&mut wtxn, &index, &config, indexing_config, |_| ()).unwrap(); + let mut cursor = Cursor::new(Vec::new()); + let mut documents_builder = DocumentBatchBuilder::new(&mut cursor).unwrap(); + let reader = Cursor::new( + r#"[ + { + "id": 123, + "title": "What a week, hu...", + "genres": [], + "tags": ["blue"] + }, + { + "id": 345, + "title": "I am the pig!", + "tags": ["red"] + } + ]"#, + ); + + for doc in serde_json::Deserializer::from_reader(reader).into_iter::() { + let doc = Cursor::new(serde_json::to_vec(&doc.unwrap()).unwrap()); + documents_builder.extend_from_json(doc).unwrap(); + } + + documents_builder.finish().unwrap(); + + cursor.set_position(0); + + // index documents + let content = DocumentBatchReader::from_reader(cursor).unwrap(); + builder.add_documents(content).unwrap(); + builder.execute().unwrap(); + + wtxn.commit().unwrap(); + + let txn = index.read_txn().unwrap(); + let mut distrib = FacetDistribution::new(&txn, &index); + distrib.facets(vec!["genres"]); + let result = distrib.execute().unwrap(); + assert_eq!(result["genres"].len(), 0); + + let mut distrib = FacetDistribution::new(&txn, &index); + distrib.facets(vec!["tags"]); + let result = distrib.execute().unwrap(); + assert_eq!(result["tags"].len(), 2); +} diff --git a/milli/tests/search/mod.rs b/milli/tests/search/mod.rs index c72ca8ba3..12e9861fa 100644 --- a/milli/tests/search/mod.rs +++ b/milli/tests/search/mod.rs @@ -13,6 +13,7 @@ use serde::Deserialize; use slice_group_by::GroupBy; mod distinct; +mod facet_distribution; mod filters; mod query_criteria; mod sort;