use futures::future::BoxFuture;
use serde::Deserialize;
use serde_json::Value;
use crate::embeddings::{DocumentEmbeddings, EmbeddingError};
pub mod in_memory_store;
#[derive(Debug, thiserror::Error)]
pub enum VectorStoreError {
#[error("Embedding error: {0}")]
EmbeddingError(#[from] EmbeddingError),
#[error("Json error: {0}")]
JsonError(#[from] serde_json::Error),
#[error("Datastore error: {0}")]
DatastoreError(#[from] Box<dyn std::error::Error + Send + Sync>),
}
pub trait VectorStore: Send + Sync {
type Q;
fn add_documents(
&mut self,
documents: Vec<DocumentEmbeddings>,
) -> impl std::future::Future<Output = Result<(), VectorStoreError>> + Send;
fn get_document_embeddings(
&self,
id: &str,
) -> impl std::future::Future<Output = Result<Option<DocumentEmbeddings>, VectorStoreError>> + Send;
fn get_document<T: for<'a> Deserialize<'a>>(
&self,
id: &str,
) -> impl std::future::Future<Output = Result<Option<T>, VectorStoreError>> + Send;
fn get_document_by_query(
&self,
query: Self::Q,
) -> impl std::future::Future<Output = Result<Option<DocumentEmbeddings>, VectorStoreError>> + Send;
}
pub trait VectorStoreIndex: Send + Sync {
fn top_n<T: for<'a> Deserialize<'a> + std::marker::Send>(
&self,
query: &str,
n: usize,
) -> impl std::future::Future<Output = Result<Vec<(f64, String, T)>, VectorStoreError>> + Send;
fn top_n_ids(
&self,
query: &str,
n: usize,
) -> impl std::future::Future<Output = Result<Vec<(f64, String)>, VectorStoreError>> + Send;
}
pub type TopNResults = Result<Vec<(f64, String, Value)>, VectorStoreError>;
pub trait VectorStoreIndexDyn: Send + Sync {
fn top_n<'a>(&'a self, query: &'a str, n: usize) -> BoxFuture<'a, TopNResults>;
fn top_n_ids<'a>(
&'a self,
query: &'a str,
n: usize,
) -> BoxFuture<'a, Result<Vec<(f64, String)>, VectorStoreError>>;
}
impl<I: VectorStoreIndex> VectorStoreIndexDyn for I {
fn top_n<'a>(
&'a self,
query: &'a str,
n: usize,
) -> BoxFuture<'a, Result<Vec<(f64, String, Value)>, VectorStoreError>> {
Box::pin(self.top_n(query, n))
}
fn top_n_ids<'a>(
&'a self,
query: &'a str,
n: usize,
) -> BoxFuture<'a, Result<Vec<(f64, String)>, VectorStoreError>> {
Box::pin(self.top_n_ids(query, n))
}
}