use async_trait::async_trait;
use crate::common::namespace::Namespace;
use crate::common::pagination::{Page, PageParams};
use crate::store::health::HealthReport;
use crate::vector::{
config::VectorConfig,
error::Result,
filter::MetadataFilter,
result::{VectorRecord, VectorResult},
};
#[derive(Debug, Clone)]
pub struct SearchOptions {
pub limit: usize,
pub filter: Option<MetadataFilter>,
pub min_similarity: Option<f32>,
pub include_vectors: bool,
}
impl Default for SearchOptions {
fn default() -> Self {
Self {
limit: 20,
filter: None,
min_similarity: None,
include_vectors: false,
}
}
}
impl SearchOptions {
pub fn with_limit(mut self, limit: usize) -> Self {
self.limit = limit;
self
}
pub fn with_filter(mut self, filter: MetadataFilter) -> Self {
self.filter = Some(filter);
self
}
pub fn with_min_similarity(mut self, min: f32) -> Self {
self.min_similarity = Some(min);
self
}
pub fn include_vectors(mut self) -> Self {
self.include_vectors = true;
self
}
}
#[derive(Debug, Clone)]
#[derive(Default)]
pub struct ListOptions {
pub filter: Option<MetadataFilter>,
pub include_vectors: bool,
}
#[async_trait]
pub trait VectorAdapter: Send + Sync {
fn name(&self) -> &'static str;
fn is_connected(&self) -> bool;
fn config(&self) -> &VectorConfig;
async fn upsert(
&self,
id: &str,
vector: Vec<f32>,
metadata: Option<crate::common::metadata::Metadata>,
namespace: Option<&Namespace>,
) -> Result<()>;
async fn nearest_neighbors(
&self,
query: &[f32],
namespace: Option<&Namespace>,
options: SearchOptions,
) -> Result<Vec<VectorResult>>;
async fn list(
&self,
namespace: Option<&Namespace>,
page: PageParams,
options: ListOptions,
) -> Result<Page<VectorRecord>>;
async fn delete(&self, id: &str, namespace: Option<&Namespace>) -> Result<bool>;
async fn delete_namespace(&self, namespace: &Namespace) -> Result<usize>;
async fn count(&self, namespace: Option<&Namespace>) -> Result<usize>;
async fn healthcheck(&self) -> HealthReport;
}