use super::search_core::{asr_search_result, search_results_from_snapshot};
use super::{
exact_shard, open_store, search_index_state, validate_repo_name, validate_top_k, AsrError,
AsrResult, SearchOutput, MAX_TOP_K,
};
pub(crate) fn search(query: &str, repo_name: &str, top_k: usize) -> AsrResult<SearchOutput> {
validate_repo_name(repo_name)?;
let query = query.trim();
if query.is_empty() {
return Err(AsrError::new(
"invalid_query",
"Search query must not be empty",
));
}
exact_shard::validate_asr_query(query)?;
validate_top_k(top_k, MAX_TOP_K)?;
let (paths, store) = open_store()?;
let snapshot = super::require_ready_index_snapshot(&paths, &store, repo_name)?;
let raw_results = search_results_from_snapshot(query, &snapshot, top_k)?;
let results = raw_results
.iter()
.map(|result| asr_search_result(query, result))
.collect();
let exact_shard = snapshot.exact_shard.summary.clone();
Ok(SearchOutput {
query: query.to_string(),
repo: snapshot.repo.name,
top_k,
index_state: search_index_state(snapshot.state, false, exact_shard),
results,
})
}