Bail earlier when the experimental feature is not enabled

This commit is contained in:
Louis Dureuil 2024-03-28 12:06:59 +01:00
parent 466d718a05
commit 4564a38ae7
No known key found for this signature in database
4 changed files with 24 additions and 31 deletions

View File

@ -74,10 +74,10 @@ pub async fn search(
let index = index_scheduler.index(&index_uid)?; let index = index_scheduler.index(&index_uid)?;
let features = index_scheduler.features(); let features = index_scheduler.features();
let search_kind = search_kind(&search_query, &index_scheduler, &index)?; let search_kind = search_kind(&search_query, &index_scheduler, &index, features)?;
let _permit = search_queue.try_get_search_permit().await?; let _permit = search_queue.try_get_search_permit().await?;
let search_result = tokio::task::spawn_blocking(move || { let search_result = tokio::task::spawn_blocking(move || {
perform_facet_search(&index, search_query, facet_query, facet_name, features, search_kind) perform_facet_search(&index, search_query, facet_query, facet_name, search_kind)
}) })
.await?; .await?;

View File

@ -1,7 +1,7 @@
use actix_web::web::Data; use actix_web::web::Data;
use actix_web::{web, HttpRequest, HttpResponse}; use actix_web::{web, HttpRequest, HttpResponse};
use deserr::actix_web::{AwebJson, AwebQueryParameter}; use deserr::actix_web::{AwebJson, AwebQueryParameter};
use index_scheduler::IndexScheduler; use index_scheduler::{IndexScheduler, RoFeatures};
use meilisearch_types::deserr::query_params::Param; use meilisearch_types::deserr::query_params::Param;
use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError}; use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError};
use meilisearch_types::error::deserr_codes::*; use meilisearch_types::error::deserr_codes::*;
@ -204,12 +204,11 @@ pub async fn search_with_url_query(
let index = index_scheduler.index(&index_uid)?; let index = index_scheduler.index(&index_uid)?;
let features = index_scheduler.features(); let features = index_scheduler.features();
let search_kind = search_kind(&query, index_scheduler.get_ref(), &index)?; let search_kind = search_kind(&query, index_scheduler.get_ref(), &index, features)?;
let _permit = search_queue.try_get_search_permit().await?; let _permit = search_queue.try_get_search_permit().await?;
let search_result = let search_result =
tokio::task::spawn_blocking(move || perform_search(&index, query, features, search_kind)) tokio::task::spawn_blocking(move || perform_search(&index, query, search_kind)).await?;
.await?;
if let Ok(ref search_result) = search_result { if let Ok(ref search_result) = search_result {
aggregate.succeed(search_result); aggregate.succeed(search_result);
} }
@ -245,12 +244,11 @@ pub async fn search_with_post(
let features = index_scheduler.features(); let features = index_scheduler.features();
let search_kind = search_kind(&query, index_scheduler.get_ref(), &index)?; let search_kind = search_kind(&query, index_scheduler.get_ref(), &index, features)?;
let _permit = search_queue.try_get_search_permit().await?; let _permit = search_queue.try_get_search_permit().await?;
let search_result = let search_result =
tokio::task::spawn_blocking(move || perform_search(&index, query, features, search_kind)) tokio::task::spawn_blocking(move || perform_search(&index, query, search_kind)).await?;
.await?;
if let Ok(ref search_result) = search_result { if let Ok(ref search_result) = search_result {
aggregate.succeed(search_result); aggregate.succeed(search_result);
if search_result.degraded { if search_result.degraded {
@ -269,7 +267,16 @@ pub fn search_kind(
query: &SearchQuery, query: &SearchQuery,
index_scheduler: &IndexScheduler, index_scheduler: &IndexScheduler,
index: &milli::Index, index: &milli::Index,
features: RoFeatures,
) -> Result<SearchKind, ResponseError> { ) -> Result<SearchKind, ResponseError> {
if query.vector.is_some() {
features.check_vector("Passing `vector` as a query parameter")?;
}
if query.hybrid.is_some() {
features.check_vector("Passing `hybrid` as a query parameter")?;
}
// regardless of anything, always do a semantic search when we don't have a vector and the query is whitespace or missing // regardless of anything, always do a semantic search when we don't have a vector and the query is whitespace or missing
if query.vector.is_none() { if query.vector.is_none() {
match &query.q { match &query.q {

View File

@ -81,12 +81,11 @@ pub async fn multi_search_with_post(
}) })
.with_index(query_index)?; .with_index(query_index)?;
let search_kind = let search_kind = search_kind(&query, index_scheduler.get_ref(), &index, features)
search_kind(&query, index_scheduler.get_ref(), &index).with_index(query_index)?; .with_index(query_index)?;
let search_result = tokio::task::spawn_blocking(move || { let search_result =
perform_search(&index, query, features, search_kind) tokio::task::spawn_blocking(move || perform_search(&index, query, search_kind))
})
.await .await
.with_index(query_index)?; .with_index(query_index)?;

View File

@ -6,7 +6,6 @@ use std::time::{Duration, Instant};
use deserr::Deserr; use deserr::Deserr;
use either::Either; use either::Either;
use index_scheduler::RoFeatures;
use indexmap::IndexMap; use indexmap::IndexMap;
use meilisearch_auth::IndexSearchRules; use meilisearch_auth::IndexSearchRules;
use meilisearch_types::deserr::DeserrJsonError; use meilisearch_types::deserr::DeserrJsonError;
@ -448,21 +447,12 @@ fn prepare_search<'t>(
index: &'t Index, index: &'t Index,
rtxn: &'t RoTxn, rtxn: &'t RoTxn,
query: &'t SearchQuery, query: &'t SearchQuery,
features: RoFeatures,
search_kind: &SearchKind, search_kind: &SearchKind,
time_budget: TimeBudget, time_budget: TimeBudget,
) -> Result<(milli::Search<'t>, bool, usize, usize), MeilisearchHttpError> { ) -> Result<(milli::Search<'t>, bool, usize, usize), MeilisearchHttpError> {
let mut search = index.search(rtxn); let mut search = index.search(rtxn);
search.time_budget(time_budget); search.time_budget(time_budget);
if query.vector.is_some() {
features.check_vector("Passing `vector` as a query parameter")?;
}
if query.hybrid.is_some() {
features.check_vector("Passing `hybrid` as a query parameter")?;
}
match search_kind { match search_kind {
SearchKind::KeywordOnly => { SearchKind::KeywordOnly => {
if let Some(q) = &query.q { if let Some(q) = &query.q {
@ -551,7 +541,6 @@ fn prepare_search<'t>(
pub fn perform_search( pub fn perform_search(
index: &Index, index: &Index,
query: SearchQuery, query: SearchQuery,
features: RoFeatures,
search_kind: SearchKind, search_kind: SearchKind,
) -> Result<SearchResult, MeilisearchHttpError> { ) -> Result<SearchResult, MeilisearchHttpError> {
let before_search = Instant::now(); let before_search = Instant::now();
@ -562,7 +551,7 @@ pub fn perform_search(
}; };
let (search, is_finite_pagination, max_total_hits, offset) = let (search, is_finite_pagination, max_total_hits, offset) =
prepare_search(index, &rtxn, &query, features, &search_kind, time_budget)?; prepare_search(index, &rtxn, &query, &search_kind, time_budget)?;
let milli::SearchResult { let milli::SearchResult {
documents_ids, documents_ids,
@ -780,7 +769,6 @@ pub fn perform_facet_search(
search_query: SearchQuery, search_query: SearchQuery,
facet_query: Option<String>, facet_query: Option<String>,
facet_name: String, facet_name: String,
features: RoFeatures,
search_kind: SearchKind, search_kind: SearchKind,
) -> Result<FacetSearchResult, MeilisearchHttpError> { ) -> Result<FacetSearchResult, MeilisearchHttpError> {
let before_search = Instant::now(); let before_search = Instant::now();
@ -790,8 +778,7 @@ pub fn perform_facet_search(
None => TimeBudget::default(), None => TimeBudget::default(),
}; };
let (search, _, _, _) = let (search, _, _, _) = prepare_search(index, &rtxn, &search_query, &search_kind, time_budget)?;
prepare_search(index, &rtxn, &search_query, features, &search_kind, time_budget)?;
let mut facet_search = SearchForFacetValues::new( let mut facet_search = SearchForFacetValues::new(
facet_name, facet_name,
search, search,