use std::fmt::Write;
use super::*;
use crate::diskann_index::format::DiskANNVectorVersion;
use crate::mvcc::{DatabaseId, StorageTransactionId};
fn entry(document: u64) -> DiskANNOriginEntry {
let writer = StorageTransactionId::new(DatabaseId::from_bytes([23; 16]), 7).unwrap();
let version = DiskANNVectorVersion::new(writer, 9).unwrap();
DiskANNOriginEntry::new(
document,
DiskANNCanonicalOrigin::new(version, 2, 0).unwrap(),
)
}
fn generation() -> DiskANNGeneration {
DiskANNGeneration::new([11; 16], 1, 2, 3).unwrap()
}
fn reseal(bytes: &mut [u8]) {
let mut hash = Sha256::new();
hash.update(&bytes[..64]);
hash.update(&bytes[96..]);
bytes[64..96].copy_from_slice(&hash.finalize());
}
#[test]
fn origin_batch_matches_independently_packed_empty_tensor_record() {
let control = StorageReadControl::with_limit(8192);
let layout = DiskANNOriginLayout::new(generation(), 2, 1).unwrap();
let bytes = layout.encode(0, &[entry(42)], &control).unwrap();
let expected = "555141444e4f520001000000600000000b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0100000000000000020000000000000003000000000000006000000000000000414b9ee0ec165d2c1881809f893218f1438d39e61f412e78850fa9edc21a224d02000000400000000100000000000000000000000000000001000000000000002a00000000000000555141564f524731171717171717171717171717171717170700000000000000090000000000000002000000000000000000000000000000";
let mut actual = String::new();
for byte in bytes.iter() {
write!(&mut actual, "{byte:02x}").unwrap();
}
assert_eq!(actual, expected);
let batch = layout.decode(0, &bytes, &control).unwrap();
assert_eq!(batch.entry(0), Some(entry(42)));
assert_eq!(batch.entry(1), None);
assert_eq!(batch.entry(usize::MAX), None);
assert_eq!(
format!("{:x}", Sha256::digest(batch.bytes())),
"0459b7b642df56be0f84dae6de64ff21042a13ac5644b194d685973808bb2c05"
);
}
#[test]
fn origin_codec_rejects_rechecksummed_shapes_versions_order_and_foreign_generations() {
let control = StorageReadControl::with_limit(16 << 10);
let layout = DiskANNOriginLayout::new(generation(), 2, 1).unwrap();
let bytes = layout.encode(0, &[entry(42)], &control).unwrap();
for offset in [8, 96, 100, 104, 112, 120, 136, 160, 168, 176, 180] {
let mut corrupt = bytes.to_vec();
corrupt[offset] = if [160, 168].contains(&offset) {
0
} else {
corrupt[offset] ^ 1
};
reseal(&mut corrupt);
assert!(
layout.decode(0, &corrupt, &control).is_err(),
"offset {offset}"
);
}
let foreign =
DiskANNOriginLayout::new(DiskANNGeneration::new([12; 16], 1, 2, 3).unwrap(), 2, 1).unwrap();
assert!(foreign.decode(0, &bytes, &control).is_err());
assert!(layout.decode(1, &bytes, &control).is_err());
assert!(layout
.decode(0, &bytes[..bytes.len() - 1], &control)
.is_err());
let two = DiskANNOriginLayout::new(generation(), 2, 2).unwrap();
assert!(two.encode(0, &[entry(42), entry(42)], &control).is_err());
assert!(two.encode(0, &[entry(42), entry(41)], &control).is_err());
let maximum = DiskANNOriginLayout::new(generation(), 2, u64::MAX).unwrap();
assert!(maximum.encoded_bytes(u64::MAX).is_err());
let first = u64::MAX - 63;
let entries: Vec<_> = (0..63).map(entry).collect();
let encoded = maximum.encode(first, &entries, &control).unwrap();
assert_eq!(maximum.decode(first, &encoded, &control).unwrap().len(), 63);
assert!(DiskANNOriginSummary::new(0, [0; 32]).is_err());
}