diskann_tools/utils/
gen_associated_data_from_range.rs1use std::io::Write;
7
8use diskann_providers::storage::StorageWriteProvider;
9use diskann_utils::io::Metadata;
10
11use super::CMDResult;
12
13pub fn gen_associated_data_from_range<S: StorageWriteProvider>(
14 storage_provider: &S,
15 associated_data_path: &str,
16 start: u32,
17 end: u32,
18) -> CMDResult<()> {
19 let mut file = storage_provider.create_for_write(associated_data_path)?;
20
21 let num_ints = end - start + 1;
23 let int_length: u32 = 1;
24
25 Metadata::new(num_ints, int_length)?.write(&mut file)?;
27
28 for i in start..=end {
30 file.write_all(&i.to_le_bytes())?;
31 }
32
33 Ok(())
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use byteorder::{LittleEndian, ReadBytesExt};
40 use diskann_providers::storage::{StorageReadProvider, VirtualStorageProvider};
41
42 #[test]
43 fn test_gen_associated_data_from_range() {
44 let storage_provider = VirtualStorageProvider::new_memory();
45 let path = "/test_gen_associated_data_from_range.bin";
46
47 gen_associated_data_from_range(&storage_provider, path, 0, 9).unwrap();
49
50 let mut file = storage_provider.open_reader(path).unwrap();
52
53 let num_ints = file.read_u32::<LittleEndian>().unwrap();
55 let int_length = file.read_u32::<LittleEndian>().unwrap();
56
57 assert_eq!(num_ints, 10);
58 assert_eq!(int_length, 1);
59
60 for expected in 0u32..=9 {
62 let actual = file.read_u32::<LittleEndian>().unwrap();
63 assert_eq!(actual, expected);
64 }
65 }
66
67 #[test]
68 fn test_gen_associated_data_from_range_single_value() {
69 let storage_provider = VirtualStorageProvider::new_memory();
70 let path = "/test_gen_associated_data_single.bin";
71
72 gen_associated_data_from_range(&storage_provider, path, 42, 42).unwrap();
74
75 let mut file = storage_provider.open_reader(path).unwrap();
76
77 let num_ints = file.read_u32::<LittleEndian>().unwrap();
78 let int_length = file.read_u32::<LittleEndian>().unwrap();
79
80 assert_eq!(num_ints, 1);
81 assert_eq!(int_length, 1);
82
83 let value = file.read_u32::<LittleEndian>().unwrap();
84 assert_eq!(value, 42);
85 }
86
87 #[test]
88 fn test_gen_associated_data_from_range_large() {
89 let storage_provider = VirtualStorageProvider::new_memory();
90 let path = "/test_gen_associated_data_large.bin";
91
92 gen_associated_data_from_range(&storage_provider, path, 100, 199).unwrap();
94
95 let mut file = storage_provider.open_reader(path).unwrap();
96
97 let num_ints = file.read_u32::<LittleEndian>().unwrap();
98 let int_length = file.read_u32::<LittleEndian>().unwrap();
99
100 assert_eq!(num_ints, 100);
101 assert_eq!(int_length, 1);
102
103 for expected in 100u32..=199 {
104 let actual = file.read_u32::<LittleEndian>().unwrap();
105 assert_eq!(actual, expected);
106 }
107 }
108}