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(
&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}

View File

@ -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");

View File

@ -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"

View File

@ -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": {

View File

@ -8,7 +8,7 @@ use crate::is_faceted_by;
#[repr(transparent)]
#[serde(transparent)]
pub struct AttributePatterns {
#[schema(value_type = Vec<String>)]
#[schema(example = json!(["title", "overview_*", "release_date"]))]
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)]
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,

View File

@ -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<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 {
equality: bool,
comparison: bool,

View File

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