use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use thiserror::Error;
pub use ndarray::{Array1, ArrayView1};
#[derive(Error, Debug)]
pub enum VectraDBError {
#[error("Vector dimension mismatch: expected {expected}, got {actual}")]
DimensionMismatch { expected: usize, actual: usize },
#[error("Vector not found: {id}")]
VectorNotFound { id: String },
#[error("Invalid vector data")]
InvalidVector,
#[error("Database error: {0}")]
DatabaseError(#[from] anyhow::Error),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorMetadata {
pub id: String,
pub dimension: usize,
pub created_at: u64,
pub updated_at: u64,
pub tags: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorDocument {
pub metadata: VectorMetadata,
pub data: Array1<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SimilarityResult {
pub id: String,
pub score: f32,
pub metadata: VectorMetadata,
}
pub trait VectorDatabase {
fn create_vector(
&mut self,
id: String,
vector: Array1<f32>,
tags: Option<HashMap<String, String>>,
) -> Result<(), VectraDBError>;
fn get_vector(&self, id: &str) -> Result<VectorDocument, VectraDBError>;
fn update_vector(
&mut self,
id: &str,
vector: Array1<f32>,
tags: Option<HashMap<String, String>>,
) -> Result<(), VectraDBError>;
fn delete_vector(&mut self, id: &str) -> Result<(), VectraDBError>;
fn upsert_vector(
&mut self,
id: String,
vector: Array1<f32>,
tags: Option<HashMap<String, String>>,
) -> Result<(), VectraDBError>;
fn search_similar(
&self,
query_vector: Array1<f32>,
top_k: usize,
) -> Result<Vec<SimilarityResult>, VectraDBError>;
fn list_vectors(&self) -> Result<Vec<String>, VectraDBError>;
fn get_stats(&self) -> Result<DatabaseStats, VectraDBError>;
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DatabaseStats {
pub total_vectors: usize,
pub dimension: usize,
pub memory_usage: u64,
}
pub mod indexing;
pub mod similarity;
pub mod storage;
pub mod vector_operations;
pub use similarity::*;
pub use vector_operations::*;