use crate::traits::{DatasetStore, EmbeddingProvider};
use crate::{AppError, SearchResult};
pub struct SearchService<S, E>
where
S: DatasetStore,
E: EmbeddingProvider,
{
store: S,
embedding: E,
}
impl<S, E> Clone for SearchService<S, E>
where
S: DatasetStore + Clone,
E: EmbeddingProvider + Clone,
{
fn clone(&self) -> Self {
Self {
store: self.store.clone(),
embedding: self.embedding.clone(),
}
}
}
impl<S, E> SearchService<S, E>
where
S: DatasetStore,
E: EmbeddingProvider,
{
pub fn new(store: S, embedding: E) -> Self {
Self { store, embedding }
}
pub async fn search(&self, query: &str, limit: usize) -> Result<Vec<SearchResult>, AppError> {
let query_vector = self.embedding.generate(query).await?;
self.store.search(query_vector, limit).await
}
}