Apply PR requests related to settings API

This commit is contained in:
ManyTheFish 2025-03-05 12:05:40 +01:00
parent 5fa4b5c50a
commit 63e753bde0
7 changed files with 44 additions and 43 deletions

View File

@ -881,7 +881,7 @@ async fn search_with_pattern_filter_settings_errors() {
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{ &json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": false, "comparison": true} "filter": {"equality": false, "comparison": true}
@ -907,7 +907,7 @@ async fn search_with_pattern_filter_settings_errors() {
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{ &json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": false, "comparison": true} "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 // Check if the Comparison filter works with patterns
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{"patterns": ["cattos","doggos.age"]}]}), &json!({"filterableAttributes": [{"attributePatterns": ["cattos","doggos.age"]}]}),
&json!({ &json!({
"filter": "doggos.age > 2" "filter": "doggos.age > 2"
}), }),
@ -954,7 +954,7 @@ async fn search_with_pattern_filter_settings_errors() {
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{ &json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": true, "comparison": 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( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{ &json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": true, "comparison": false} "filter": {"equality": true, "comparison": false}

View File

@ -510,7 +510,7 @@ async fn facet_search_with_filterable_attributes_rules() {
test_settings_documents_indexing_swapping_and_facet_search( test_settings_documents_indexing_swapping_and_facet_search(
&DOCUMENTS, &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"}), &json!({"facetName": "genres", "facetQuery": "a"}),
|response, code| { |response, code| {
snapshot!(code, @"200 OK"); snapshot!(code, @"200 OK");
@ -531,7 +531,7 @@ async fn facet_search_with_filterable_attributes_rules() {
test_settings_documents_indexing_swapping_and_facet_search( test_settings_documents_indexing_swapping_and_facet_search(
&NESTED_DOCUMENTS, &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"}), &json!({"facetName": "doggos.name", "facetQuery": "b"}),
|response, code| { |response, code| {
snapshot!(code, @"200 OK"); 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( test_settings_documents_indexing_swapping_and_facet_search(
&DOCUMENTS, &DOCUMENTS,
&json!({"filterableAttributes": [{"patterns": ["genres"]}]}), &json!({"filterableAttributes": [{"attributePatterns": ["genres"]}]}),
&json!({"facetName": "genres", "facetQuery": "a"}), &json!({"facetName": "genres", "facetQuery": "a"}),
|response, code| { |response, code| {
snapshot!(code, @"400 Bad Request"); 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( test_settings_documents_indexing_swapping_and_facet_search(
&DOCUMENTS, &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"}), &json!({"facetName": "genres", "facetQuery": "a"}),
|response, code| { |response, code| {
snapshot!(code, @"400 Bad Request"); 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( test_settings_documents_indexing_swapping_and_facet_search(
&DOCUMENTS, &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"}), &json!({"facetName": "genres", "facetQuery": "a"}),
|response, code| { |response, code| {
snapshot!(code, @"400 Bad Request"); 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( test_settings_documents_indexing_swapping_and_facet_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{"patterns": ["doggos.name"]}]}), &json!({"filterableAttributes": [{"attributePatterns": ["doggos.name"]}]}),
&json!({"facetName": "invalid.name", "facetQuery": "b"}), &json!({"facetName": "invalid.name", "facetQuery": "b"}),
|response, code| { |response, code| {
snapshot!(code, @"400 Bad Request"); 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( test_settings_documents_indexing_swapping_and_facet_search(
&NESTED_DOCUMENTS, &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"}), &json!({"facetName": "doggos.name", "facetQuery": "b"}),
|response, code| { |response, code| {
snapshot!(code, @"400 Bad Request"); 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( test_settings_documents_indexing_swapping_and_facet_search(
&NESTED_DOCUMENTS, &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"}), &json!({"facetName": "doggos.name", "facetQuery": "b"}),
|response, code| { |response, code| {
snapshot!(code, @"400 Bad Request"); snapshot!(code, @"400 Bad Request");

View File

@ -125,7 +125,7 @@ async fn search_with_pattern_filter_settings() {
// Check if the Equality filter works with patterns // Check if the Equality filter works with patterns
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{"patterns": ["cattos","doggos.age"]}]}), &json!({"filterableAttributes": [{"attributePatterns": ["cattos","doggos.age"]}]}),
&json!({ &json!({
"filter": "cattos = pésti" "filter": "cattos = pésti"
}), }),
@ -158,7 +158,7 @@ async fn search_with_pattern_filter_settings() {
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{ &json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": true, "comparison": false} "filter": {"equality": true, "comparison": false}
@ -197,7 +197,7 @@ async fn search_with_pattern_filter_settings() {
test_settings_documents_indexing_swapping_and_search( test_settings_documents_indexing_swapping_and_search(
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [{ &json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": false, "comparison": true} "filter": {"equality": false, "comparison": true}
@ -282,7 +282,7 @@ async fn search_with_pattern_filter_settings_scenario_1() {
let (task, code) = index let (task, code) = index
.update_settings(json!({"filterableAttributes": [{ .update_settings(json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": true, "comparison": 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 // Update the settings activate comparison filter
let (task, code) = index let (task, code) = index
.update_settings(json!({"filterableAttributes": [{ .update_settings(json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": true, "comparison": true} "filter": {"equality": true, "comparison": true}
@ -460,7 +460,7 @@ async fn search_with_pattern_filter_settings_scenario_1() {
// Update the settings deactivate equality filter // Update the settings deactivate equality filter
let (task, code) = index let (task, code) = index
.update_settings(json!({"filterableAttributes": [{ .update_settings(json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": false, "comparison": true} "filter": {"equality": false, "comparison": true}
@ -560,7 +560,7 @@ async fn search_with_pattern_filter_settings_scenario_1() {
// rollback the settings // rollback the settings
let (task, code) = index let (task, code) = index
.update_settings(json!({"filterableAttributes": [{ .update_settings(json!({"filterableAttributes": [{
"patterns": ["cattos","doggos.age"], "attributePatterns": ["cattos","doggos.age"],
"features": { "features": {
"facetSearch": false, "facetSearch": false,
"filter": {"equality": true, "comparison": false} "filter": {"equality": true, "comparison": false}
@ -633,9 +633,9 @@ async fn test_filterable_attributes_priority() {
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [ &json!({"filterableAttributes": [
// deactivated filter // 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 // activated filter
{"patterns": ["doggos.*"]}, {"attributePatterns": ["doggos.*"]},
]}), ]}),
&json!({ &json!({
"filter": "doggos.name = bobby" "filter": "doggos.name = bobby"
@ -671,9 +671,9 @@ async fn test_filterable_attributes_priority() {
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [ &json!({"filterableAttributes": [
// deactivated filter // deactivated filter
{"patterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, {"attributePatterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}},
// activated filter // activated filter
{"patterns": ["doggos.*"]}, {"attributePatterns": ["doggos.*"]},
]}), ]}),
&json!({ &json!({
"filter": "doggos.name = bobby" "filter": "doggos.name = bobby"
@ -709,9 +709,9 @@ async fn test_filterable_attributes_priority() {
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [ &json!({"filterableAttributes": [
// deactivated filter // 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 // activated filter
{"patterns": ["doggos.*"]}, {"attributePatterns": ["doggos.*"]},
]}), ]}),
&json!({ &json!({
"filter": "doggos.age > 2" "filter": "doggos.age > 2"
@ -735,9 +735,9 @@ async fn test_filterable_attributes_priority() {
&NESTED_DOCUMENTS, &NESTED_DOCUMENTS,
&json!({"filterableAttributes": [ &json!({"filterableAttributes": [
// deactivated filter // deactivated filter
{"patterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}}, {"attributePatterns": ["doggos"], "features": {"facetSearch": false, "filter": {"equality": false, "comparison": false}}},
// activated filter // activated filter
{"patterns": ["doggos.*"]}, {"attributePatterns": ["doggos.*"]},
]}), ]}),
&json!({ &json!({
"filter": "doggos EXISTS" "filter": "doggos EXISTS"

View File

@ -521,9 +521,9 @@ async fn granular_filterable_attributes() {
let (response, code) = let (response, code) =
index.update_settings(json!({ "filterableAttributes": [ index.update_settings(json!({ "filterableAttributes": [
{ "patterns": ["name"], "features": { "facetSearch": true, "filter": {"equality": true, "comparison": false} } }, { "attributePatterns": ["name"], "features": { "facetSearch": true, "filter": {"equality": true, "comparison": false} } },
{ "patterns": ["age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": true} } }, { "attributePatterns": ["age"], "features": { "facetSearch": false, "filter": {"equality": true, "comparison": true} } },
{ "patterns": ["id"] } { "attributePatterns": ["id"] }
] })).await; ] })).await;
assert_eq!(code, 202); assert_eq!(code, 202);
index.wait_task(response.uid()).await.succeeded(); index.wait_task(response.uid()).await.succeeded();
@ -533,7 +533,7 @@ async fn granular_filterable_attributes() {
snapshot!(json_string!(response["filterableAttributes"]), @r###" snapshot!(json_string!(response["filterableAttributes"]), @r###"
[ [
{ {
"patterns": [ "attributePatterns": [
"name" "name"
], ],
"features": { "features": {
@ -545,7 +545,7 @@ async fn granular_filterable_attributes() {
} }
}, },
{ {
"patterns": [ "attributePatterns": [
"age" "age"
], ],
"features": { "features": {
@ -557,7 +557,7 @@ async fn granular_filterable_attributes() {
} }
}, },
{ {
"patterns": [ "attributePatterns": [
"id" "id"
], ],
"features": { "features": {

View File

@ -8,7 +8,7 @@ use crate::is_faceted_by;
#[repr(transparent)] #[repr(transparent)]
#[serde(transparent)] #[serde(transparent)]
pub struct AttributePatterns { pub struct AttributePatterns {
#[schema(value_type = Vec<String>)] #[schema(example = json!(["title", "overview_*", "release_date"]))]
pub patterns: Vec<String>, pub patterns: Vec<String>,
} }
@ -121,7 +121,8 @@ pub fn match_distinct_field(distinct_field: Option<&str>, field: &str) -> Patter
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PatternMatch { 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, Parent,
/// The field matches the pattern /// The field matches the pattern
Match, Match,

View File

@ -50,7 +50,7 @@ impl FilterableAttributesRule {
#[serde(deny_unknown_fields, rename_all = "camelCase")] #[serde(deny_unknown_fields, rename_all = "camelCase")]
#[deserr(rename_all = camelCase, deny_unknown_fields)] #[deserr(rename_all = camelCase, deny_unknown_fields)]
pub struct FilterableAttributesPatterns { pub struct FilterableAttributesPatterns {
pub patterns: AttributePatterns, pub attribute_patterns: AttributePatterns,
#[serde(default)] #[serde(default)]
#[deserr(default)] #[deserr(default)]
pub features: FilterableAttributesFeatures, pub features: FilterableAttributesFeatures,
@ -58,15 +58,15 @@ pub struct FilterableAttributesPatterns {
impl FilterableAttributesPatterns { impl FilterableAttributesPatterns {
pub fn match_str(&self, field: &str) -> PatternMatch { pub fn match_str(&self, field: &str) -> PatternMatch {
self.patterns.match_str(field) self.attribute_patterns.match_str(field)
} }
pub fn features(&self) -> FilterableAttributesFeatures { 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")] #[serde(deny_unknown_fields, rename_all = "camelCase")]
#[deserr(rename_all = camelCase, deny_unknown_fields)] #[deserr(rename_all = camelCase, deny_unknown_fields)]
#[derive(Default)] #[derive(Default)]
@ -143,7 +143,7 @@ impl<E: DeserializeError> Deserr<E> for FilterableAttributesRule {
} }
} }
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, Deserr, ToSchema)] #[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Copy, Debug, Deserr, ToSchema)]
pub struct FilterFeatures { pub struct FilterFeatures {
equality: bool, equality: bool,
comparison: bool, comparison: bool,

View File

@ -868,12 +868,12 @@ impl Index {
pub(crate) fn put_filterable_attributes_rules( pub(crate) fn put_filterable_attributes_rules(
&self, &self,
wtxn: &mut RwTxn<'_>, wtxn: &mut RwTxn<'_>,
#[allow(clippy::ptr_arg)] fields: &Vec<FilterableAttributesRule>, fields: &[FilterableAttributesRule],
) -> heed::Result<()> { ) -> heed::Result<()> {
self.main.remap_types::<Str, SerdeJson<_>>().put( self.main.remap_types::<Str, SerdeJson<_>>().put(
wtxn, wtxn,
main_key::FILTERABLE_FIELDS_KEY, main_key::FILTERABLE_FIELDS_KEY,
fields, &fields,
) )
} }