diff --git a/crates/meilisearch/tests/settings/get_settings.rs b/crates/meilisearch/tests/settings/get_settings.rs index ff9ae5472..fbb97f999 100644 --- a/crates/meilisearch/tests/settings/get_settings.rs +++ b/crates/meilisearch/tests/settings/get_settings.rs @@ -523,7 +523,12 @@ async fn granular_filterable_attributes() { index.update_settings(json!({ "filterableAttributes": [ { "attributePatterns": ["name"], "features": { "facetSearch": true, "filter": {"equality": true, "comparison": false} } }, { "attributePatterns": ["age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": true} } }, - { "attributePatterns": ["id"] } + { "attributePatterns": ["id"] }, + { "attributePatterns": ["default-filterable-features-null"], "features": { "facetSearch": true } }, + { "attributePatterns": ["default-filterable-features-equality"], "features": { "facetSearch": true, "filter": {"comparison": true} } }, + { "attributePatterns": ["default-filterable-features-comparison"], "features": { "facetSearch": true, "filter": {"equality": true} } }, + { "attributePatterns": ["default-filterable-features-empty"], "features": { "facetSearch": true, "filter": {} } }, + { "attributePatterns": ["default-facet-search"], "features": { "filter": {"equality": true, "comparison": true} } }, ] })).await; assert_eq!(code, 202); index.wait_task(response.uid()).await.succeeded(); @@ -567,6 +572,66 @@ async fn granular_filterable_attributes() { "comparison": false } } + }, + { + "attributePatterns": [ + "default-filterable-features-null" + ], + "features": { + "facetSearch": true, + "filter": { + "equality": true, + "comparison": false + } + } + }, + { + "attributePatterns": [ + "default-filterable-features-equality" + ], + "features": { + "facetSearch": true, + "filter": { + "equality": true, + "comparison": true + } + } + }, + { + "attributePatterns": [ + "default-filterable-features-comparison" + ], + "features": { + "facetSearch": true, + "filter": { + "equality": true, + "comparison": false + } + } + }, + { + "attributePatterns": [ + "default-filterable-features-empty" + ], + "features": { + "facetSearch": true, + "filter": { + "equality": true, + "comparison": false + } + } + }, + { + "attributePatterns": [ + "default-facet-search" + ], + "features": { + "facetSearch": false, + "filter": { + "equality": true, + "comparison": true + } + } } ] "###); diff --git a/crates/milli/src/filterable_attributes_rules.rs b/crates/milli/src/filterable_attributes_rules.rs index ab20971a4..53af30fd6 100644 --- a/crates/milli/src/filterable_attributes_rules.rs +++ b/crates/milli/src/filterable_attributes_rules.rs @@ -71,7 +71,11 @@ impl FilterableAttributesPatterns { #[deserr(rename_all = camelCase, deny_unknown_fields)] #[derive(Default)] pub struct FilterableAttributesFeatures { + #[serde(default)] + #[deserr(default)] facet_search: bool, + #[serde(default)] + #[deserr(default)] filter: FilterFeatures, } @@ -144,11 +148,21 @@ impl Deserr for FilterableAttributesRule { } #[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Copy, Debug, Deserr, ToSchema)] +#[serde(deny_unknown_fields, rename_all = "camelCase")] +#[deserr(rename_all = camelCase, deny_unknown_fields)] pub struct FilterFeatures { + #[serde(default = "default_true")] + #[deserr(default = true)] equality: bool, + #[serde(default)] + #[deserr(default)] comparison: bool, } +fn default_true() -> bool { + true +} + impl FilterFeatures { /// Get the allowed operators for the filter. pub fn allowed_operators(&self) -> Vec {