diff --git a/index-scheduler/src/batch.rs b/index-scheduler/src/batch.rs index 5a886acf8..9089acb69 100644 --- a/index-scheduler/src/batch.rs +++ b/index-scheduler/src/batch.rs @@ -1343,6 +1343,9 @@ impl IndexScheduler { for (task, (_, settings)) in tasks.iter_mut().zip(settings) { let checked_settings = settings.clone().check(); + if checked_settings.proximity_precision.set().is_some() { + self.features.features().check_proximity_precision()?; + } task.details = Some(Details::SettingsUpdate { settings: Box::new(settings) }); apply_settings_to_builder(&checked_settings, &mut builder); diff --git a/index-scheduler/src/features.rs b/index-scheduler/src/features.rs index 1db27bcd5..ae2823c30 100644 --- a/index-scheduler/src/features.rs +++ b/index-scheduler/src/features.rs @@ -81,6 +81,19 @@ impl RoFeatures { .into()) } } + + pub fn check_proximity_precision(&self) -> Result<()> { + if self.runtime.proximity_precision { + Ok(()) + } else { + Err(FeatureNotEnabledError { + disabled_action: "Using `proximityPrecision` index setting", + feature: "proximity precision", + issue_link: "https://github.com/orgs/meilisearch/discussions/710", + } + .into()) + } + } } impl FeatureData { diff --git a/meilisearch-types/src/features.rs b/meilisearch-types/src/features.rs index 33afe2d24..f0cbce340 100644 --- a/meilisearch-types/src/features.rs +++ b/meilisearch-types/src/features.rs @@ -7,6 +7,7 @@ pub struct RuntimeTogglableFeatures { pub vector_store: bool, pub metrics: bool, pub export_puffin_reports: bool, + pub proximity_precision: bool, } #[derive(Default, Debug, Clone, Copy)] diff --git a/meilisearch/src/routes/features.rs b/meilisearch/src/routes/features.rs index e7fd8de22..29e922eba 100644 --- a/meilisearch/src/routes/features.rs +++ b/meilisearch/src/routes/features.rs @@ -48,6 +48,8 @@ pub struct RuntimeTogglableFeatures { pub metrics: Option, #[deserr(default)] pub export_puffin_reports: Option, + #[deserr(default)] + pub proximity_precision: Option, } async fn patch_features( @@ -70,6 +72,10 @@ async fn patch_features( .0 .export_puffin_reports .unwrap_or(old_features.export_puffin_reports), + proximity_precision: new_features + .0 + .proximity_precision + .unwrap_or(old_features.proximity_precision), }; // explicitly destructure for analytics rather than using the `Serialize` implementation, because @@ -80,6 +86,7 @@ async fn patch_features( vector_store, metrics, export_puffin_reports, + proximity_precision, } = new_features; analytics.publish( @@ -89,6 +96,7 @@ async fn patch_features( "vector_store": vector_store, "metrics": metrics, "export_puffin_reports": export_puffin_reports, + "proximity_precision": proximity_precision, }), Some(&req), ); diff --git a/meilisearch/tests/features/mod.rs b/meilisearch/tests/features/mod.rs index abb006ac8..812a5c6bb 100644 --- a/meilisearch/tests/features/mod.rs +++ b/meilisearch/tests/features/mod.rs @@ -21,7 +21,8 @@ async fn experimental_features() { "scoreDetails": false, "vectorStore": false, "metrics": false, - "exportPuffinReports": false + "exportPuffinReports": false, + "proximityPrecision": false } "###); @@ -33,7 +34,8 @@ async fn experimental_features() { "scoreDetails": false, "vectorStore": true, "metrics": false, - "exportPuffinReports": false + "exportPuffinReports": false, + "proximityPrecision": false } "###); @@ -45,7 +47,8 @@ async fn experimental_features() { "scoreDetails": false, "vectorStore": true, "metrics": false, - "exportPuffinReports": false + "exportPuffinReports": false, + "proximityPrecision": false } "###); @@ -58,7 +61,8 @@ async fn experimental_features() { "scoreDetails": false, "vectorStore": true, "metrics": false, - "exportPuffinReports": false + "exportPuffinReports": false, + "proximityPrecision": false } "###); @@ -71,7 +75,8 @@ async fn experimental_features() { "scoreDetails": false, "vectorStore": true, "metrics": false, - "exportPuffinReports": false + "exportPuffinReports": false, + "proximityPrecision": false } "###); } @@ -91,7 +96,8 @@ async fn experimental_feature_metrics() { "scoreDetails": false, "vectorStore": false, "metrics": true, - "exportPuffinReports": false + "exportPuffinReports": false, + "proximityPrecision": false } "###); @@ -146,7 +152,7 @@ async fn errors() { meili_snap::snapshot!(code, @"400 Bad Request"); meili_snap::snapshot!(meili_snap::json_string!(response), @r###" { - "message": "Unknown field `NotAFeature`: expected one of `scoreDetails`, `vectorStore`, `metrics`, `exportPuffinReports`", + "message": "Unknown field `NotAFeature`: expected one of `scoreDetails`, `vectorStore`, `metrics`, `exportPuffinReports`, `proximityPrecision`", "code": "bad_request", "type": "invalid_request", "link": "https://docs.meilisearch.com/errors#bad_request"