raw/
raw.rs

1use std::{borrow::Cow, collections::BTreeSet, fs, path::Path};
2
3use vecdb::{
4    AnyStoredVec, AnyVec, CollectableVec, Database, GenericStoredVec, RawVec, Stamp, VecIterator,
5    Version,
6};
7
8#[allow(clippy::upper_case_acronyms)]
9type VEC = RawVec<usize, u32>;
10
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12    let _ = fs::remove_dir_all("raw");
13
14    let version = Version::TWO;
15
16    let database = Database::open(Path::new("raw"))?;
17
18    let mut options = (&database, "vec", version).into();
19
20    {
21        let mut vec: VEC = RawVec::forced_import_with(options)?;
22
23        (0..21_u32).for_each(|v| {
24            vec.push(v);
25        });
26
27        let mut iter = vec.into_iter();
28        assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
29        assert!(iter.get(1) == Some(Cow::Borrowed(&1)));
30        assert!(iter.get(2) == Some(Cow::Borrowed(&2)));
31        assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
32        assert!(iter.get(21).is_none());
33        drop(iter);
34
35        vec.flush()?;
36
37        assert!(vec.header().stamp() == Stamp::new(0));
38    }
39
40    {
41        let mut vec: VEC = RawVec::forced_import_with(options)?;
42
43        vec.mut_header().update_stamp(Stamp::new(100));
44
45        assert!(vec.header().stamp() == Stamp::new(100));
46
47        let mut iter = vec.into_iter();
48        assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
49        assert!(iter.get(1) == Some(Cow::Borrowed(&1)));
50        assert!(iter.get(2) == Some(Cow::Borrowed(&2)));
51        assert!(iter.get(3) == Some(Cow::Borrowed(&3)));
52        assert!(iter.get(4) == Some(Cow::Borrowed(&4)));
53        assert!(iter.get(5) == Some(Cow::Borrowed(&5)));
54        assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
55        assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
56        assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
57        drop(iter);
58
59        vec.push(21);
60        vec.push(22);
61
62        assert!(vec.stored_len() == 21);
63        assert!(vec.pushed_len() == 2);
64        assert!(vec.len() == 23);
65
66        let mut iter = vec.into_iter();
67        assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
68        assert!(iter.get(21) == Some(Cow::Borrowed(&21)));
69        assert!(iter.get(22) == Some(Cow::Borrowed(&22)));
70        assert!(iter.get(23).is_none());
71        drop(iter);
72
73        vec.flush()?;
74    }
75
76    {
77        let mut vec: VEC = RawVec::forced_import_with(options)?;
78
79        assert!(vec.header().stamp() == Stamp::new(100));
80
81        assert!(vec.stored_len() == 23);
82        assert!(vec.pushed_len() == 0);
83        assert!(vec.len() == 23);
84
85        let mut iter = vec.into_iter();
86        assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
87        assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
88        assert!(iter.get(21) == Some(Cow::Borrowed(&21)));
89        assert!(iter.get(22) == Some(Cow::Borrowed(&22)));
90        drop(iter);
91
92        vec.truncate_if_needed(14)?;
93
94        assert_eq!(vec.stored_len(), 14);
95        assert_eq!(vec.pushed_len(), 0);
96        assert_eq!(vec.len(), 14);
97
98        let mut iter = vec.into_iter();
99        assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
100        assert_eq!(iter.get(5), Some(Cow::Borrowed(&5)));
101        assert_eq!(iter.get(20), None);
102        drop(iter);
103
104        assert_eq!(
105            vec.collect_signed_range(Some(-5), None)?,
106            vec![9, 10, 11, 12, 13]
107        );
108
109        vec.push(vec.len() as u32);
110        assert_eq!(
111            VecIterator::last(vec.into_iter()),
112            Some((14, Cow::Borrowed(&14)))
113        );
114
115        assert_eq!(
116            vec.into_iter()
117                .map(|(_, v)| v.into_owned())
118                .collect::<Vec<_>>(),
119            vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
120        );
121
122        vec.flush()?;
123    }
124
125    {
126        let mut vec: VEC = RawVec::forced_import_with(options)?;
127
128        assert_eq!(
129            VecIterator::last(vec.into_iter()),
130            Some((14, Cow::Borrowed(&14)))
131        );
132
133        assert_eq!(
134            vec.into_iter()
135                .map(|(_, v)| v.into_owned())
136                .collect::<Vec<_>>(),
137            vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
138        );
139
140        vec.reset()?;
141
142        assert_eq!(vec.pushed_len(), 0);
143        assert_eq!(vec.stored_len(), 0);
144        assert_eq!(vec.len(), 0);
145
146        (0..21_u32).for_each(|v| {
147            vec.push(v);
148        });
149
150        assert_eq!(vec.pushed_len(), 21);
151        assert_eq!(vec.stored_len(), 0);
152        assert_eq!(vec.len(), 21);
153
154        let mut iter = vec.into_iter();
155        assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
156        assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
157        assert!(iter.get(21).is_none());
158        drop(iter);
159
160        let reader = vec.create_static_reader();
161        assert_eq!(vec.take(10, &reader)?, Some(10));
162        assert_eq!(vec.holes(), &BTreeSet::from([10]));
163        assert!(vec.get_or_read(10, &reader)?.is_none());
164        drop(reader);
165
166        vec.flush()?;
167
168        assert!(vec.holes() == &BTreeSet::from([10]));
169    }
170
171    {
172        let mut vec: VEC = RawVec::forced_import_with(options)?;
173
174        assert!(vec.holes() == &BTreeSet::from([10]));
175
176        let reader = vec.create_static_reader();
177        assert!(vec.get_or_read(10, &reader)?.is_none());
178        drop(reader);
179
180        vec.update(10, 10)?;
181        vec.update(0, 10)?;
182
183        let reader = vec.create_static_reader();
184        assert_eq!(vec.holes(), &BTreeSet::new());
185        assert_eq!(vec.get_or_read(0, &reader)?, Some(Cow::Borrowed(&10)));
186        assert_eq!(vec.get_or_read(10, &reader)?, Some(Cow::Borrowed(&10)));
187        drop(reader);
188
189        vec.flush()?;
190    }
191
192    options = options.with_saved_stamped_changes(10);
193
194    {
195        let mut vec: VEC = RawVec::forced_import_with(options)?;
196
197        assert_eq!(
198            vec.collect()?,
199            vec![
200                10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
201            ]
202        );
203
204        vec.truncate_if_needed(10)?;
205
206        let reader = vec.create_static_reader();
207        vec.take(5, &reader)?;
208        vec.update(3, 5)?;
209        vec.push(21);
210        drop(reader);
211
212        assert_eq!(
213            vec.collect_holed()?,
214            vec![
215                Some(10),
216                Some(1),
217                Some(2),
218                Some(5),
219                Some(4),
220                None,
221                Some(6),
222                Some(7),
223                Some(8),
224                Some(9),
225                Some(21)
226            ]
227        );
228
229        vec.stamped_flush(Stamp::new(1))?;
230    }
231
232    {
233        let mut vec: VEC = RawVec::forced_import_with(options)?;
234
235        assert_eq!(vec.collect()?, vec![10, 1, 2, 5, 4]);
236
237        let reader = vec.create_static_reader();
238        vec.take(0, &reader)?;
239        vec.update(1, 5)?;
240        vec.push(5);
241        vec.push(6);
242        vec.push(7);
243        drop(reader);
244
245        assert_eq!(
246            vec.collect_holed()?,
247            vec![
248                None,
249                Some(5),
250                Some(2),
251                Some(5),
252                Some(4),
253                None,
254                Some(6),
255                Some(7),
256                Some(8),
257                Some(9),
258                Some(21),
259                Some(5),
260                Some(6),
261                Some(7)
262            ]
263        );
264
265        vec.stamped_flush(Stamp::new(2))?;
266    }
267
268    {
269        let mut vec: VEC = RawVec::forced_import_with(options)?;
270
271        assert_eq!(
272            vec.collect_holed()?,
273            vec![
274                None,
275                Some(5),
276                Some(2),
277                Some(5),
278                Some(4),
279                None,
280                Some(6),
281                Some(7),
282                Some(8),
283                Some(9),
284                Some(21),
285                Some(5),
286                Some(6),
287                Some(7)
288            ]
289        );
290
291        vec.rollback_stamp(Stamp::new(2))?;
292
293        assert_eq!(
294            vec.collect_holed()?,
295            vec![
296                Some(10),
297                Some(1),
298                Some(2),
299                Some(5),
300                Some(4),
301                None,
302                Some(6),
303                Some(7),
304                Some(8),
305                Some(9),
306                Some(21)
307            ]
308        );
309
310        vec.rollback_stamp(Stamp::new(1))?;
311
312        assert_eq!(
313            vec.collect()?,
314            vec![
315                10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
316            ]
317        );
318
319        // vec.stamped_flush(Stamp::new(1))?;
320    }
321
322    Ok(())
323}