mod resolve;
pub(super) use resolve::merge;
use super::VersionResult;
use crate::{
hnsw_index::{HNSWGraphMeta, HNSWNodeSnapshot},
read_control::StorageReadControl,
HNSWIndexParams,
};
use uqa_core::{
memory::{Budgeted, BudgetedVec},
DocId,
};
#[derive(Clone, Copy)]
pub struct HNSWRecordHeader {
pub dimensions: u32,
pub params: HNSWIndexParams,
pub meta: HNSWGraphMeta,
pub revision: Option<u64>,
}
#[derive(Clone, Copy)]
pub enum HNSWRecordKey {
Structure,
Document(DocId),
Vectors,
Nodes,
Node(u64),
Edge {
source: u64,
layer: usize,
target: u64,
},
}
pub enum HNSWRecordValue<'a> {
Header {
meta: HNSWGraphMeta,
revision: Option<u64>,
},
Node(&'a HNSWNodeSnapshot),
Edge,
}
pub trait HNSWRecordLayout: Send + Sync {
fn metadata_key(
&self,
key: &[u8],
control: &StorageReadControl,
) -> VersionResult<Option<BudgetedVec<u8>>>;
fn key(
&self,
metadata: &[u8],
address: HNSWRecordKey,
control: &StorageReadControl,
) -> VersionResult<BudgetedVec<u8>>;
fn edges_prefix(
&self,
metadata: &[u8],
source: Option<u64>,
control: &StorageReadControl,
) -> VersionResult<Option<BudgetedVec<u8>>>;
fn header(
&self,
key: &[u8],
value: &[u8],
control: &StorageReadControl,
) -> VersionResult<HNSWRecordHeader>;
fn vector_id(&self, key: &[u8], control: &StorageReadControl) -> VersionResult<(DocId, u32)>;
fn vector(
&self,
key: &[u8],
value: &[u8],
control: &StorageReadControl,
) -> VersionResult<(DocId, u32, BudgetedVec<f32>)>;
fn node(
&self,
key: &[u8],
value: &[u8],
control: &StorageReadControl,
) -> VersionResult<Budgeted<HNSWNodeSnapshot>>;
fn edge(
&self,
key: &[u8],
value: &[u8],
control: &StorageReadControl,
) -> VersionResult<(u64, usize, u64)>;
fn encode(
&self,
key: &[u8],
template: &[u8],
value: HNSWRecordValue<'_>,
control: &StorageReadControl,
) -> VersionResult<BudgetedVec<u8>>;
}