use super::{
VectorIndexChangeToken, VectorIndexDescriptor, VectorIndexError, VectorIndexObservation,
VectorIndexStatus, VectorMutationConsistency, VectorRecord, VectorResult, VectorRevision,
VectorSearchRequest, VectorSearchResult,
};
#[async_trait::async_trait]
pub trait VectorIndex: Send + Sync {
fn descriptor(&self) -> &VectorIndexDescriptor;
fn status(&self) -> VectorIndexStatus;
fn change_token(&self) -> Option<VectorIndexChangeToken> {
None
}
async fn observe(&self) -> VectorResult<VectorIndexObservation> {
let observation = VectorIndexObservation {
status: self.status(),
change_token: None,
};
observation.verify()?;
Ok(observation)
}
fn mutation_consistency(&self) -> VectorMutationConsistency {
VectorMutationConsistency::PartitionAtomic
}
async fn replace_partition(
&self,
partition: &str,
records: Vec<VectorRecord>,
) -> VectorResult<VectorIndexStatus>;
async fn replace_partition_if_revision(
&self,
_partition: &str,
_expected_revision: VectorRevision,
_records: Vec<VectorRecord>,
) -> VectorResult<VectorIndexStatus> {
Err(VectorIndexError::ConditionalMutationUnsupported)
}
async fn remove_partition(&self, partition: &str) -> VectorResult<VectorIndexStatus>;
async fn remove_partition_if_revision(
&self,
_partition: &str,
_expected_revision: VectorRevision,
) -> VectorResult<VectorIndexStatus> {
Err(VectorIndexError::ConditionalMutationUnsupported)
}
async fn search(&self, request: VectorSearchRequest) -> VectorResult<VectorSearchResult>;
async fn clear(&self) -> VectorResult<VectorIndexStatus>;
}