From 63e753bde07c916e1f717cdf14b60f1a07e5f4fb Mon Sep 17 00:00:00 2001 From: ManyTheFish Date: Wed, 5 Mar 2025 12:05:40 +0100 Subject: [PATCH] Apply PR requests related to settings API --- crates/meilisearch/tests/search/errors.rs | 10 +++---- .../meilisearch/tests/search/facet_search.rs | 16 +++++----- crates/meilisearch/tests/search/filters.rs | 30 +++++++++---------- .../tests/settings/get_settings.rs | 12 ++++---- crates/milli/src/attribute_patterns.rs | 5 ++-- .../milli/src/filterable_attributes_rules.rs | 10 +++---- crates/milli/src/index.rs | 4 +-- 7 files changed, 44 insertions(+), 43 deletions(-) diff --git a/crates/meilisearch/tests/search/errors.rs b/crates/meilisearch/tests/search/errors.rs index 05f084a0e..05d2d2563 100644 --- a/crates/meilisearch/tests/search/errors.rs +++ b/crates/meilisearch/tests/search/errors.rs @@ -881,7 +881,7 @@ async fn search_with_pattern_filter_settings_errors() { test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, &json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": false, "comparison": true} @@ -907,7 +907,7 @@ async fn search_with_pattern_filter_settings_errors() { test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, &json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": false, "comparison": true} @@ -933,7 +933,7 @@ async fn search_with_pattern_filter_settings_errors() { // Check if the Comparison filter works with patterns test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["cattos","doggos.age"]}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["cattos","doggos.age"]}]}), &json!({ "filter": "doggos.age > 2" }), @@ -954,7 +954,7 @@ async fn search_with_pattern_filter_settings_errors() { test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, &json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": false} @@ -980,7 +980,7 @@ async fn search_with_pattern_filter_settings_errors() { test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, &json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": false} diff --git a/crates/meilisearch/tests/search/facet_search.rs b/crates/meilisearch/tests/search/facet_search.rs index 33b906d0f..25f894757 100644 --- a/crates/meilisearch/tests/search/facet_search.rs +++ b/crates/meilisearch/tests/search/facet_search.rs @@ -510,7 +510,7 @@ async fn facet_search_with_filterable_attributes_rules() { test_settings_documents_indexing_swapping_and_facet_search( &DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["genres"], "features": {"facetSearch": true, "filter": {"equality": false, "comparison": false}}}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["genres"], "features": {"facetSearch": true, "filter": {"equality": false, "comparison": false}}}]}), &json!({"facetName": "genres", "facetQuery": "a"}), |response, code| { snapshot!(code, @"200 OK"); @@ -531,7 +531,7 @@ async fn facet_search_with_filterable_attributes_rules() { test_settings_documents_indexing_swapping_and_facet_search( &NESTED_DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["doggos.name"], "features": {"facetSearch": true, "filter": {"equality": false, "comparison": false}}}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["doggos.name"], "features": {"facetSearch": true, "filter": {"equality": false, "comparison": false}}}]}), &json!({"facetName": "doggos.name", "facetQuery": "b"}), |response, code| { snapshot!(code, @"200 OK"); @@ -555,7 +555,7 @@ async fn facet_search_with_filterable_attributes_rules_errors() { test_settings_documents_indexing_swapping_and_facet_search( &DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["genres"]}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["genres"]}]}), &json!({"facetName": "genres", "facetQuery": "a"}), |response, code| { snapshot!(code, @"400 Bad Request"); @@ -566,7 +566,7 @@ async fn facet_search_with_filterable_attributes_rules_errors() { test_settings_documents_indexing_swapping_and_facet_search( &DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["genres"], "features": {"facetSearch": false, "filter": {"equality": true, "comparison": true}}}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["genres"], "features": {"facetSearch": false, "filter": {"equality": true, "comparison": true}}}]}), &json!({"facetName": "genres", "facetQuery": "a"}), |response, code| { snapshot!(code, @"400 Bad Request"); @@ -576,7 +576,7 @@ async fn facet_search_with_filterable_attributes_rules_errors() { test_settings_documents_indexing_swapping_and_facet_search( &DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["genres"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["genres"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}]}), &json!({"facetName": "genres", "facetQuery": "a"}), |response, code| { snapshot!(code, @"400 Bad Request"); @@ -586,7 +586,7 @@ async fn facet_search_with_filterable_attributes_rules_errors() { test_settings_documents_indexing_swapping_and_facet_search( &NESTED_DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["doggos.name"]}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["doggos.name"]}]}), &json!({"facetName": "invalid.name", "facetQuery": "b"}), |response, code| { snapshot!(code, @"400 Bad Request"); @@ -597,7 +597,7 @@ async fn facet_search_with_filterable_attributes_rules_errors() { test_settings_documents_indexing_swapping_and_facet_search( &NESTED_DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["doggos.name"], "features": {"facetSearch": false, "filter": {"equality": true, "comparison": true}}}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["doggos.name"], "features": {"facetSearch": false, "filter": {"equality": true, "comparison": true}}}]}), &json!({"facetName": "doggos.name", "facetQuery": "b"}), |response, code| { snapshot!(code, @"400 Bad Request"); @@ -607,7 +607,7 @@ async fn facet_search_with_filterable_attributes_rules_errors() { test_settings_documents_indexing_swapping_and_facet_search( &NESTED_DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["doggos.name"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["doggos.name"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}]}), &json!({"facetName": "doggos.name", "facetQuery": "b"}), |response, code| { snapshot!(code, @"400 Bad Request"); diff --git a/crates/meilisearch/tests/search/filters.rs b/crates/meilisearch/tests/search/filters.rs index 375a4ef63..818ffabaa 100644 --- a/crates/meilisearch/tests/search/filters.rs +++ b/crates/meilisearch/tests/search/filters.rs @@ -125,7 +125,7 @@ async fn search_with_pattern_filter_settings() { // Check if the Equality filter works with patterns test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, - &json!({"filterableAttributes": [{"patterns": ["cattos","doggos.age"]}]}), + &json!({"filterableAttributes": [{"attributePatterns": ["cattos","doggos.age"]}]}), &json!({ "filter": "cattos = pésti" }), @@ -158,7 +158,7 @@ async fn search_with_pattern_filter_settings() { test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, &json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": false} @@ -197,7 +197,7 @@ async fn search_with_pattern_filter_settings() { test_settings_documents_indexing_swapping_and_search( &NESTED_DOCUMENTS, &json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": false, "comparison": true} @@ -282,7 +282,7 @@ async fn search_with_pattern_filter_settings_scenario_1() { let (task, code) = index .update_settings(json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": false} @@ -348,7 +348,7 @@ async fn search_with_pattern_filter_settings_scenario_1() { // Update the settings activate comparison filter let (task, code) = index .update_settings(json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": true} @@ -460,7 +460,7 @@ async fn search_with_pattern_filter_settings_scenario_1() { // Update the settings deactivate equality filter let (task, code) = index .update_settings(json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": false, "comparison": true} @@ -560,7 +560,7 @@ async fn search_with_pattern_filter_settings_scenario_1() { // rollback the settings let (task, code) = index .update_settings(json!({"filterableAttributes": [{ - "patterns": ["cattos","doggos.age"], + "attributePatterns": ["cattos","doggos.age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": false} @@ -633,9 +633,9 @@ async fn test_filterable_attributes_priority() { &NESTED_DOCUMENTS, &json!({"filterableAttributes": [ // deactivated filter - {"patterns": ["doggos.a*"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, + {"attributePatterns": ["doggos.a*"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, // activated filter - {"patterns": ["doggos.*"]}, + {"attributePatterns": ["doggos.*"]}, ]}), &json!({ "filter": "doggos.name = bobby" @@ -671,9 +671,9 @@ async fn test_filterable_attributes_priority() { &NESTED_DOCUMENTS, &json!({"filterableAttributes": [ // deactivated filter - {"patterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, + {"attributePatterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, // activated filter - {"patterns": ["doggos.*"]}, + {"attributePatterns": ["doggos.*"]}, ]}), &json!({ "filter": "doggos.name = bobby" @@ -709,9 +709,9 @@ async fn test_filterable_attributes_priority() { &NESTED_DOCUMENTS, &json!({"filterableAttributes": [ // deactivated filter - {"patterns": ["doggos.a*"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, + {"attributePatterns": ["doggos.a*"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, // activated filter - {"patterns": ["doggos.*"]}, + {"attributePatterns": ["doggos.*"]}, ]}), &json!({ "filter": "doggos.age > 2" @@ -735,9 +735,9 @@ async fn test_filterable_attributes_priority() { &NESTED_DOCUMENTS, &json!({"filterableAttributes": [ // deactivated filter - {"patterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, + {"attributePatterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, // activated filter - {"patterns": ["doggos.*"]}, + {"attributePatterns": ["doggos.*"]}, ]}), &json!({ "filter": "doggos EXISTS" diff --git a/crates/meilisearch/tests/settings/get_settings.rs b/crates/meilisearch/tests/settings/get_settings.rs index 16ab9a7ae..ff9ae5472 100644 --- a/crates/meilisearch/tests/settings/get_settings.rs +++ b/crates/meilisearch/tests/settings/get_settings.rs @@ -521,9 +521,9 @@ async fn granular_filterable_attributes() { let (response, code) = index.update_settings(json!({ "filterableAttributes": [ - { "patterns": ["name"], "features": { "facetSearch": true, "filter": {"equality": true, "comparison": false} } }, - { "patterns": ["age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": true} } }, - { "patterns": ["id"] } + { "attributePatterns": ["name"], "features": { "facetSearch": true, "filter": {"equality": true, "comparison": false} } }, + { "attributePatterns": ["age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": true} } }, + { "attributePatterns": ["id"] } ] })).await; assert_eq!(code, 202); index.wait_task(response.uid()).await.succeeded(); @@ -533,7 +533,7 @@ async fn granular_filterable_attributes() { snapshot!(json_string!(response["filterableAttributes"]), @r###" [ { - "patterns": [ + "attributePatterns": [ "name" ], "features": { @@ -545,7 +545,7 @@ async fn granular_filterable_attributes() { } }, { - "patterns": [ + "attributePatterns": [ "age" ], "features": { @@ -557,7 +557,7 @@ async fn granular_filterable_attributes() { } }, { - "patterns": [ + "attributePatterns": [ "id" ], "features": { diff --git a/crates/milli/src/attribute_patterns.rs b/crates/milli/src/attribute_patterns.rs index b08341bd3..c7045c68e 100644 --- a/crates/milli/src/attribute_patterns.rs +++ b/crates/milli/src/attribute_patterns.rs @@ -8,7 +8,7 @@ use crate::is_faceted_by; #[repr(transparent)] #[serde(transparent)] pub struct AttributePatterns { - #[schema(value_type = Vec)] + #[schema(example = json!(["title", "overview_*", "release_date"]))] pub patterns: Vec, } @@ -121,7 +121,8 @@ pub fn match_distinct_field(distinct_field: Option<&str>, field: &str) -> Patter #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum PatternMatch { - /// The field is a parent of the of a nested field that matches the pattern + /// The field is a parent of a nested field that matches the pattern + /// For example, the field is `toto`, and the pattern is `toto.titi` Parent, /// The field matches the pattern Match, diff --git a/crates/milli/src/filterable_attributes_rules.rs b/crates/milli/src/filterable_attributes_rules.rs index 08bccee9b..efef46810 100644 --- a/crates/milli/src/filterable_attributes_rules.rs +++ b/crates/milli/src/filterable_attributes_rules.rs @@ -50,7 +50,7 @@ impl FilterableAttributesRule { #[serde(deny_unknown_fields, rename_all = "camelCase")] #[deserr(rename_all = camelCase, deny_unknown_fields)] pub struct FilterableAttributesPatterns { - pub patterns: AttributePatterns, + pub attribute_patterns: AttributePatterns, #[serde(default)] #[deserr(default)] pub features: FilterableAttributesFeatures, @@ -58,15 +58,15 @@ pub struct FilterableAttributesPatterns { impl FilterableAttributesPatterns { pub fn match_str(&self, field: &str) -> PatternMatch { - self.patterns.match_str(field) + self.attribute_patterns.match_str(field) } pub fn features(&self) -> FilterableAttributesFeatures { - self.features.clone() + self.features } } -#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, Deserr, ToSchema)] +#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Copy, Debug, Deserr, ToSchema)] #[serde(deny_unknown_fields, rename_all = "camelCase")] #[deserr(rename_all = camelCase, deny_unknown_fields)] #[derive(Default)] @@ -143,7 +143,7 @@ impl Deserr for FilterableAttributesRule { } } -#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, Deserr, ToSchema)] +#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Copy, Debug, Deserr, ToSchema)] pub struct FilterFeatures { equality: bool, comparison: bool, diff --git a/crates/milli/src/index.rs b/crates/milli/src/index.rs index ff87eba7c..5bc434517 100644 --- a/crates/milli/src/index.rs +++ b/crates/milli/src/index.rs @@ -868,12 +868,12 @@ impl Index { pub(crate) fn put_filterable_attributes_rules( &self, wtxn: &mut RwTxn<'_>, - #[allow(clippy::ptr_arg)] fields: &Vec, + fields: &[FilterableAttributesRule], ) -> heed::Result<()> { self.main.remap_types::>().put( wtxn, main_key::FILTERABLE_FIELDS_KEY, - fields, + &fields, ) }