8000 refactor: group perform_search parameters into SearchParams struct · meilisearch/meilisearch@344ad66 · GitHub
[go: up one dir, main page]

Skip to content

Commit 344ad66

Browse files
committed
refactor: group perform_search parameters into SearchParams struct
- Create SearchParams struct to group related parameters - Update perform_search function to use SearchParams instead of 8 individual parameters - Fix clippy warning about too many arguments - Update all callers to use new SearchParams struct
1 parent af6d53c commit 344ad66

File tree

4 files changed

+72
-62
lines changed

4 files changed

+72
-62
lines changed

crates/meilisearch/src/routes/indexes/search.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ use crate::metrics::MEILISEARCH_DEGRADED_SEARCH_REQUESTS;
2424
use crate::routes::indexes::search_analytics::{SearchAggregator, SearchGET, SearchPOST};
2525
use crate::search::{
2626
add_search_rules, perform_search, HybridQuery, MatchingStrategy, RankingScoreThreshold,
27-
RetrieveVectors, SearchKind, SearchQuery, SearchResult, SemanticRatio, DEFAULT_CROP_LENGTH,
28-
DEFAULT_CROP_MARKER, DEFAULT_HIGHLIGHT_POST_TAG, DEFAULT_HIGHLIGHT_PRE_TAG,
29-
DEFAULT_SEARCH_LIMIT, DEFAULT_SEARCH_OFFSET, DEFAULT_SEMANTIC_RATIO, INCLUDE_METADATA_HEADER,
27+
RetrieveVectors, SearchKind, SearchParams, SearchQuery, SearchResult, SemanticRatio,
28+
DEFAULT_CROP_LENGTH, DEFAULT_CROP_MARKER, DEFAULT_HIGHLIGHT_POST_TAG,
29+
DEFAULT_HIGHLIGHT_PRE_TAG, DEFAULT_SEARCH_LIMIT, DEFAULT_SEARCH_OFFSET, DEFAULT_SEMANTIC_RATIO,
30+
INCLUDE_METADATA_HEADER,
3031
};
3132
use crate::search_queue::SearchQueue;
3233

@@ -345,21 +346,20 @@ pub async fn search_with_url_query(
345346
search_kind(&query, index_scheduler.get_ref(), index_uid.to_string(), &index)?;
346347
let retrieve_vector = RetrieveVectors::new(query.retrieve_vectors);
347348
let permit = search_queue.try_get_search_permit().await?;
348-
let include_metadata = req
349-
.headers()
350-
.get(INCLUDE_METADATA_HEADER)
351-
.is_some();
349+
let include_metadata = req.headers().get(INCLUDE_METADATA_HEADER).is_some();
352350

353351
let search_result = tokio::task::spawn_blocking(move || {
354352
perform_search(
355-
index_uid.to_string(),
353+
SearchParams {
354+
index_uid: index_uid.to_string(),
355+
query,
356+
search_kind,
357+
retrieve_vectors: retrieve_vector,
358+
features: index_scheduler.features(),
359+
request_uid,
360+
include_metadata,
361+
},
356362
&index,
357-
query,
358-
search_kind,
359-
retrieve_vector,
360-
index_scheduler.features(),
361-
request_uid,
362-
include_metadata,
363363
)
364364
})
365365
.await;
@@ -459,22 +459,21 @@ pub async fn search_with_post(
459459
search_kind(&query, index_scheduler.get_ref(), index_uid.to_string(), &index)?;
460460
let retrieve_vectors = RetrieveVectors::new(query.retrieve_vectors);
461461

462-
let include_metadata = req
463-
.headers()
464-
.get(INCLUDE_METADATA_HEADER)
465-
.is_some();
462+
let include_metadata = req.headers().get(INCLUDE_METADATA_HEADER).is_some();
466463

467464
let permit = search_queue.try_get_search_permit().await?;
468465
let search_result = tokio::task::spawn_blocking(move || {
469466
perform_search(
470-
index_uid.to_string(),
467+
SearchParams {
468+
index_uid: index_uid.to_string(),
469+
query,
470+
search_kind,
471+
retrieve_vectors,
472+
features: index_scheduler.features(),
473+
request_uid,
474+
include_metadata,
475+
},
471476
&index,
472-
query,
473-
search_kind,
474-
retrieve_vectors,
475-
index_scheduler.features(),
476-
request_uid,
477-
include_metadata,
478477
)
479478
})
480479
.await;

crates/meilisearch/src/routes/multi_search.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use crate::extractors::sequential_extractor::SeqHandler;
2020
use crate::routes::indexes::search::search_kind;
2121
use crate::search::{
2222
add_search_rules, perform_federated_search, perform_search, FederatedSearch,
23-
FederatedSearchResult, RetrieveVectors, SearchQueryWithIndex, SearchResultWithIndex,
24-
PROXY_SEARCH_HEADER, PROXY_SEARCH_HEADER_VALUE, INCLUDE_METADATA_HEADER,
23+
FederatedSearchResult, RetrieveVectors, SearchParams, SearchQueryWithIndex,
24+
SearchResultWithIndex, INCLUDE_METADATA_HEADER, PROXY_SEARCH_HEADER, PROXY_SEARCH_HEADER_VALUE,
2525
};
2626
use crate::search_queue::SearchQueue;
2727

@@ -202,10 +202,7 @@ pub async fn multi_search_with_post(
202202
.headers()
203203
.get(PROXY_SEARCH_HEADER)
204204
.is_some_and(|value| value.as_bytes() == PROXY_SEARCH_HEADER_VALUE.as_bytes());
205-
let include_metadata = req
206-
.headers()
207-
.get(INCLUDE_METADATA_HEADER)
208-
.is_some();
205+
let include_metadata = req.headers().get(INCLUDE_METADATA_HEADER).is_some();
209206
let search_result = perform_federated_search(
210207
&index_scheduler,
211208
queries,
@@ -233,10 +230,7 @@ pub async fn multi_search_with_post(
233230
HttpResponse::Ok().json(search_result?)
234231
}
235232
None => {
236-
let include_metadata = req
237-
.headers()
238-
.get(INCLUDE_METADATA_HEADER)
239-
.is_some();
233+
let include_metadata = req.headers().get(INCLUDE_METADATA_HEADER).is_some();
240234

241235
// Explicitly expect a `(ResponseError, usize)` for the error type rather than `ResponseError` only,
242236
// so that `?` doesn't work if it doesn't use `with_index`, ensuring that it is not forgotten in case of code
@@ -289,14 +283,16 @@ pub async fn multi_search_with_post(
289283

290284
let search_result = tokio::task::spawn_blocking(move || {
291285
perform_search(
292-
index_uid_str.clone(),
286+
SearchParams {
287+
index_uid: index_uid_str.clone(),
288+
query,
289+
search_kind,
290+
retrieve_vectors: retrieve_vector,
291+
features,
292+
request_uid,
293+
include_metadata,
294+
},
293295
&index,
294-
query,
295-
search_kind,
296-
retrieve_vector,
297-
features,
298-
request_uid,
299-
include_metadata,
300296
)
301297
})
302298
.await

crates/meilisearch/src/search/federated/perform.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,11 @@ pub async fn perform_federated_search(
118118
let after_waiting_remote_results = std::time::Instant::now();
119119

120120
// 3. merge hits and metadata across indexes and hosts
121-
// 3.1. merge metadata
121+
// 3.1. merge federation metadata
122122
let (estimated_total_hits, degraded, used_negative_operator, facets, max_remote_duration) =
123123
merge_metadata(&mut results_by_index, &remote_results);
124124

125-
// 3.1.1. Build metadata in the same order as the original queries
125+
// 3.2. Build metadata in the same order as the original queries
126126
let query_metadata = if include_metadata {
127127
let mut query_metadata = Vec::new();
128128

@@ -132,11 +132,15 @@ pub async fn perform_federated_search(
132132
for remote_result in &remote_results {
133133
if let Some(remote_metadata) = &remote_result.metadata {
134134
for remote_meta in remote_metadata {
135-
if let Some(remote_name) = &remote_meta.remote {
136-
let key = (remote_name.clone(), remote_meta.index_uid.clone());
137-
if let Some(primary_key) = &remote_meta.primary_key {
138-
remote_primary_keys.insert(key, primary_key.clone());
139-
}
135+
if let SearchMetadata {
136+
remote: Some(remote_name),
137+
primary_key: Some(primary_key),
138+
index_uid,
139+
..
140+
} = &remote_meta
141+
{
142+
let key = (remote_name, index_uid);
143+
remote_primary_keys.insert(key, primary_key);
140144
}
141145
}
142146
}
@@ -156,8 +160,8 @@ pub async fn perform_federated_search(
156160
Some(remote_name) => {
157161
// For remote queries, try to get primary key from remote results
158162
// Use composite key (remote, index_uid) to avoid collisions
159-
let lookup_key = (remote_name.clone(), index_uid.clone());
160-
remote_primary_keys.get(&lookup_key).cloned()
163+
let lookup_key = (remote_name, &index_uid);
164+
remote_primary_keys.get(&lookup_key).map(|pk| pk.to_string())
161165
}
162166
None => {
163167
// For local queries, get primary key from local index

crates/meilisearch/src/search/mod.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ use crate::error::MeilisearchHttpError;
4343
mod federated;
4444
pub use federated::{
4545
perform_federated_search, FederatedSearch, FederatedSearchResult, Federation,
46-
FederationOptions, MergeFacets, PROXY_SEARCH_HEADER, PROXY_SEARCH_HEADER_VALUE, INCLUDE_METADATA_HEADER,
46+
FederationOptions, MergeFacets, INCLUDE_METADATA_HEADER, PROXY_SEARCH_HEADER,
47+
PROXY_SEARCH_HEADER_VALUE,
4748
};
4849

4950
mod ranking_rules;
@@ -1138,16 +1139,26 @@ pub fn prepare_search<'t>(
11381139
Ok((search, is_finite_pagination, max_total_hits, offset))
11391140
}
11401141

1141-
pub fn perform_search(
1142-
index_uid: String,
1143-
index: &Index,
1144-
query: SearchQuery,
1145-
search_kind: SearchKind,
1146-
retrieve_vectors: RetrieveVectors,
1147-
features: RoFeatures,
1148-
request_uid: Uuid,
1149-
include_metadata: bool,
1150-
) -> Result<SearchResult, ResponseError> {
1142+
pub struct SearchParams {
1143+
pub index_uid: String,
1144+
pub query: SearchQuery,
1145+
pub search_kind: SearchKind,
1146+
pub retrieve_vectors: RetrieveVectors,
1147+
pub features: RoFeatures,
1148+
pub request_uid: Uuid,
1149+
pub include_metadata: bool,
1150+
}
1151+
1152+
pub fn perform_search(params: SearchParams, index: &Index) -> Result<SearchResult, ResponseError> {
1153+
let SearchParams {
1154+
index_uid,
1155+
query,
1156+
search_kind,
1157+
retrieve_vectors,
1158+
features,
1159+
request_uid,
1160+
include_metadata,
1161+
} = params;
11511162
let before_search = Instant::now();
11521163
let index_uid_for_metadata = index_uid.clone();
11531164
let rtxn = index.read_txn()?;

0 commit comments

Comments
 (0)
0