use super::types::{RecallEntry, RecallOutput, RecallSearchInput};
pub async fn search(input: &RecallSearchInput) -> Result<RecallOutput, String> {
let limit = input.limit.unwrap_or(5);
let db = cosh_recall::embed::VecDb::connect_readonly(&input.db_uri, &input.table_name)
.await
.map_err(|e| format!("failed to connect to vector db: {e}"))?;
if input.vector_dim != db.vector_dim() {
return Err(format!(
"vector dimension mismatch: input has {}, but table schema has {}",
input.vector_dim,
db.vector_dim()
));
}
let entries = db
.get(&input.query_vector, limit)
.await
.map_err(|e| format!("vector search failed: {e}"))?;
let results: Vec<RecallEntry> = entries
.into_iter()
.map(|e| RecallEntry {
id: e.id,
content: e.content,
})
.collect();
Ok(RecallOutput {
query: input.query.clone(),
results,
})
}