pub const HNSW_SEGMENT_MAGIC: [u8; 8] = *b"VCNHNSW\x01";
pub const FORMAT_VERSION: u32 = 1;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub enum GraphWalEntry {
InsertNode {
doc_id: u32,
level: u8,
vector: Vec<f32>,
neighbors_per_level: Vec<Vec<u32>>,
},
DeleteNode {
doc_id: u32,
},
UpdateNeighbors {
node_id: u32,
level: u8,
neighbors: Vec<u32>,
},
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn test_graph_wal_entry_postcard_roundtrip() {
let entries = vec![
GraphWalEntry::InsertNode {
doc_id: 42,
level: 2,
vector: vec![1.0, 2.0, 3.0],
neighbors_per_level: vec![vec![1, 2, 3], vec![4, 5], vec![6]],
},
GraphWalEntry::DeleteNode { doc_id: 99 },
GraphWalEntry::UpdateNeighbors {
node_id: 10,
level: 0,
neighbors: vec![20, 30, 40],
},
];
for entry in &entries {
let bytes = postcard::to_allocvec(entry).unwrap();
let decoded: GraphWalEntry = postcard::from_bytes(&bytes).unwrap();
assert_eq!(&decoded, entry);
}
}
}