Coverage Report

Created: 2026-08-14 08:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/vart-0.9.3/src/iter.rs
Line
Count
Source
1
use std::collections::{BinaryHeap, Bound, VecDeque};
2
use std::ops::RangeBounds;
3
use std::sync::Arc;
4
5
use crate::art::{Node, NodeType, QueryType};
6
use crate::node::LeafValue;
7
use crate::KeyTrait;
8
9
type NodeIterator<'a, P, V> = Box<dyn DoubleEndedIterator<Item = &'a Arc<Node<P, V>>> + 'a>;
10
11
// A type alias for the Item type
12
pub(crate) type IterItem<'a, V> = (&'a [u8], &'a V, u64, u64);
13
14
/// An iterator over the nodes in the Trie.
15
struct NodeIter<'a, P: KeyTrait, V: Clone> {
16
    node: NodeIterator<'a, P, V>,
17
}
18
19
impl<'a, P: KeyTrait, V: Clone> NodeIter<'a, P, V> {
20
0
    fn new<I>(iter: I) -> Self
21
0
    where
22
0
        I: DoubleEndedIterator<Item = &'a Arc<Node<P, V>>> + 'a,
23
    {
24
0
        Self {
25
0
            node: Box::new(iter),
26
0
        }
27
0
    }
28
}
29
30
impl<'a, P: KeyTrait, V: Clone> Iterator for NodeIter<'a, P, V> {
31
    type Item = &'a Arc<Node<P, V>>;
32
33
0
    fn next(&mut self) -> Option<Self::Item> {
34
0
        self.node.next()
35
0
    }
36
}
37
38
impl<P: KeyTrait, V: Clone> DoubleEndedIterator for NodeIter<'_, P, V> {
39
0
    fn next_back(&mut self) -> Option<Self::Item> {
40
0
        self.node.next_back()
41
0
    }
42
}
43
44
struct Leaf<'a, P: KeyTrait + 'a, V: Clone>(&'a P, &'a Arc<LeafValue<V>>);
45
46
impl<'a, P: KeyTrait + 'a, V: Clone> PartialEq for Leaf<'a, P, V> {
47
0
    fn eq(&self, other: &Self) -> bool {
48
0
        self.0 == other.0
49
0
    }
50
}
51
52
impl<'a, P: KeyTrait + 'a, V: Clone> Eq for Leaf<'a, P, V> {}
53
54
impl<'a, P: KeyTrait + 'a, V: Clone> PartialOrd for Leaf<'a, P, V> {
55
0
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
56
0
        Some(self.cmp(other))
57
0
    }
58
}
59
60
impl<'a, P: KeyTrait + 'a, V: Clone> Ord for Leaf<'a, P, V> {
61
0
    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
62
0
        self.0.cmp(other.0)
63
0
    }
64
}
65
66
/// An iterator over key-value pairs in the Trie.
67
pub struct Iter<'a, P: KeyTrait + 'a, V: Clone> {
68
    forward: ForwardIterState<'a, P, V>,
69
    last_forward_key: Option<&'a P>,
70
    backward: BackwardIterState<'a, P, V>,
71
    last_backward_key: Option<&'a P>,
72
    _marker: std::marker::PhantomData<P>,
73
}
74
75
impl<'a, P: KeyTrait + 'a, V: Clone> Iter<'a, P, V> {
76
0
    pub(crate) fn new(node: Option<&'a Arc<Node<P, V>>>, is_versioned: bool) -> Self {
77
0
        match node {
78
0
            Some(node) => Self {
79
0
                forward: ForwardIterState::new(node, is_versioned),
80
0
                last_forward_key: None,
81
0
                backward: BackwardIterState::new(node, is_versioned),
82
0
                last_backward_key: None,
83
0
                _marker: Default::default(),
84
0
            },
85
0
            None => Self {
86
0
                forward: ForwardIterState::empty(),
87
0
                backward: BackwardIterState::empty(),
88
0
                last_backward_key: None,
89
0
                last_forward_key: None,
90
0
                _marker: Default::default(),
91
0
            },
92
        }
93
0
    }
94
}
95
96
impl<'a, P: KeyTrait + 'a, V: Clone> Iterator for Iter<'a, P, V> {
97
    type Item = IterItem<'a, V>;
98
99
    #[inline]
100
0
    fn next(&mut self) -> Option<Self::Item> {
101
0
        while let Some(node) = self.forward.iters.last_mut() {
102
0
            let e = node.next();
103
0
            match e {
104
0
                None => {
105
0
                    self.forward.iters.pop();
106
0
                }
107
0
                Some(other) => {
108
0
                    if let NodeType::Twig(twig) = &other.node_type {
109
0
                        if self.forward.is_versioned {
110
0
                            for leaf in twig.iter() {
111
0
                                self.forward.leafs.push_back(Leaf(&twig.key, leaf));
112
0
                            }
113
0
                        } else if let Some(v) = twig.get_latest_leaf() {
114
0
                            self.forward.leafs.push_back(Leaf(&twig.key, v));
115
0
                        }
116
0
                        break;
117
0
                    } else {
118
0
                        self.forward.iters.push(NodeIter::new(other.iter()));
119
0
                    }
120
                }
121
            }
122
        }
123
124
0
        self.forward.leafs.pop_front().and_then(|leaf| {
125
0
            self.last_forward_key = Some(leaf.0);
126
0
            if self
127
0
                .last_forward_key
128
0
                .zip(self.last_backward_key)
129
0
                .is_none_or(|(k1, k2)| k1 < k2)
130
            {
131
0
                Some((leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts))
132
            } else {
133
0
                self.forward.iters.clear();
134
0
                self.forward.leafs.clear();
135
0
                None
136
            }
137
0
        })
138
0
    }
139
}
140
141
impl<'a, P: KeyTrait + 'a, V: Clone> DoubleEndedIterator for Iter<'a, P, V> {
142
0
    fn next_back(&mut self) -> Option<Self::Item> {
143
0
        while let Some(node) = self.backward.iters.last_mut() {
144
0
            let e = node.next_back();
145
0
            match e {
146
0
                None => {
147
0
                    self.backward.iters.pop();
148
0
                }
149
0
                Some(other) => {
150
0
                    if let NodeType::Twig(twig) = &other.node_type {
151
0
                        if self.backward.is_versioned {
152
0
                            for leaf in twig.iter() {
153
0
                                self.backward.leafs.push(Leaf(&twig.key, leaf));
154
0
                            }
155
0
                        } else if let Some(v) = twig.get_latest_leaf() {
156
0
                            self.backward.leafs.push(Leaf(&twig.key, v));
157
0
                        }
158
0
                        break;
159
0
                    } else {
160
0
                        self.backward.iters.push(NodeIter::new(other.iter()));
161
0
                    }
162
                }
163
            }
164
        }
165
166
0
        self.backward.leafs.pop().and_then(|leaf| {
167
0
            self.last_backward_key = Some(leaf.0);
168
0
            if self
169
0
                .last_backward_key
170
0
                .zip(self.last_forward_key)
171
0
                .is_none_or(|(k1, k2)| k1 > k2)
172
            {
173
0
                Some((leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts))
174
            } else {
175
0
                self.backward.iters.clear();
176
0
                self.backward.leafs.clear();
177
0
                None
178
            }
179
0
        })
180
0
    }
181
}
182
183
/// An internal state for the Iter iterator.
184
struct ForwardIterState<'a, P: KeyTrait + 'a, V: Clone> {
185
    iters: Vec<NodeIter<'a, P, V>>,
186
    leafs: VecDeque<Leaf<'a, P, V>>,
187
    is_versioned: bool,
188
    prefix: Vec<u8>,
189
}
190
191
impl<'a, P: KeyTrait + 'a, V: Clone> ForwardIterState<'a, P, V> {
192
0
    pub fn new(node: &'a Node<P, V>, is_versioned: bool) -> Self {
193
0
        let mut iters = Vec::new();
194
0
        let mut leafs = VecDeque::new();
195
196
0
        if let NodeType::Twig(twig) = &node.node_type {
197
0
            if is_versioned {
198
0
                for leaf in twig.iter() {
199
0
                    leafs.push_back(Leaf(&twig.key, leaf));
200
0
                }
201
0
            } else if let Some(v) = twig.get_latest_leaf() {
202
0
                leafs.push_back(Leaf(&twig.key, v));
203
0
            }
204
0
        } else {
205
0
            iters.push(NodeIter::new(node.iter()));
206
0
        }
207
208
0
        Self {
209
0
            iters,
210
0
            leafs,
211
0
            is_versioned,
212
0
            prefix: node.prefix().as_slice().to_vec(),
213
0
        }
214
0
    }
215
216
0
    pub fn empty() -> Self {
217
0
        Self {
218
0
            iters: Vec::new(),
219
0
            leafs: VecDeque::new(),
220
0
            is_versioned: false,
221
0
            prefix: Vec::new(),
222
0
        }
223
0
    }
224
225
0
    fn forward_scan<R>(node: &'a Node<P, V>, range: &R, is_versioned: bool) -> Self
226
0
    where
227
0
        R: RangeBounds<P>,
228
    {
229
0
        let mut leafs = VecDeque::new();
230
0
        let mut iters = Vec::new();
231
0
        if let NodeType::Twig(twig) = &node.node_type {
232
0
            if range.contains(&twig.key) {
233
0
                if is_versioned {
234
0
                    for leaf in twig.iter() {
235
0
                        leafs.push_back(Leaf(&twig.key, leaf));
236
0
                    }
237
0
                } else if let Some(v) = twig.get_latest_leaf() {
238
0
                    leafs.push_back(Leaf(&twig.key, v));
239
0
                }
240
0
            }
241
0
        } else {
242
0
            iters.push(NodeIter::new(node.iter()));
243
0
        }
244
245
0
        Self {
246
0
            iters,
247
0
            leafs,
248
0
            is_versioned,
249
0
            prefix: node.prefix().as_slice().to_vec(),
250
0
        }
251
0
    }
252
253
0
    fn scan_at<R>(node: &'a Node<P, V>, range: &R, query_type: QueryType) -> Self
254
0
    where
255
0
        R: RangeBounds<P>,
256
    {
257
0
        let mut leafs = VecDeque::new();
258
0
        let mut iters = Vec::new();
259
0
        if let NodeType::Twig(twig) = &node.node_type {
260
0
            if range.contains(&twig.key) {
261
0
                if let Some(v) = twig.get_leaf_by_query_ref(query_type) {
262
0
                    leafs.push_back(Leaf(&twig.key, v));
263
0
                }
264
0
            }
265
0
        } else {
266
0
            iters.push(NodeIter::new(node.iter()));
267
0
        }
268
269
0
        Self {
270
0
            iters,
271
0
            leafs,
272
0
            is_versioned: false,
273
0
            prefix: node.prefix().as_slice().to_vec(),
274
0
        }
275
0
    }
276
}
277
278
struct BackwardIterState<'a, P: KeyTrait + 'a, V: Clone> {
279
    iters: Vec<NodeIter<'a, P, V>>,
280
    leafs: BinaryHeap<Leaf<'a, P, V>>,
281
    is_versioned: bool,
282
    prefix: Vec<u8>,
283
}
284
285
impl<'a, P: KeyTrait + 'a, V: Clone> BackwardIterState<'a, P, V> {
286
0
    pub fn new(node: &'a Node<P, V>, is_versioned: bool) -> Self {
287
0
        let mut iters = Vec::new();
288
0
        let mut leafs = BinaryHeap::new();
289
290
0
        if let NodeType::Twig(twig) = &node.node_type {
291
0
            if is_versioned {
292
0
                for leaf in twig.iter() {
293
0
                    leafs.push(Leaf(&twig.key, leaf));
294
0
                }
295
0
            } else if let Some(v) = twig.get_latest_leaf() {
296
0
                leafs.push(Leaf(&twig.key, v));
297
0
            }
298
0
        } else {
299
0
            iters.push(NodeIter::new(node.iter()));
300
0
        }
301
302
0
        Self {
303
0
            iters,
304
0
            leafs,
305
0
            is_versioned,
306
0
            prefix: node.prefix().as_slice().to_vec(),
307
0
        }
308
0
    }
309
310
0
    pub fn empty() -> Self {
311
0
        Self {
312
0
            iters: Vec::new(),
313
0
            leafs: BinaryHeap::new(),
314
0
            is_versioned: false,
315
0
            prefix: Vec::new(),
316
0
        }
317
0
    }
318
319
0
    pub fn backward_scan(
320
0
        node: &'a Node<P, V>,
321
0
        range: &impl RangeBounds<P>,
322
0
        is_versioned: bool,
323
0
    ) -> Self {
324
0
        let mut iters = Vec::new();
325
0
        let mut leafs = BinaryHeap::new();
326
327
0
        if let NodeType::Twig(twig) = &node.node_type {
328
0
            if range.contains(&twig.key) {
329
0
                if is_versioned {
330
0
                    for leaf in twig.iter() {
331
0
                        leafs.push(Leaf(&twig.key, leaf));
332
0
                    }
333
0
                } else if let Some(v) = twig.get_latest_leaf() {
334
0
                    leafs.push(Leaf(&twig.key, v));
335
0
                }
336
0
            }
337
0
        } else {
338
0
            iters.push(NodeIter::new(node.iter()));
339
0
        }
340
341
0
        Self {
342
0
            iters,
343
0
            leafs,
344
0
            is_versioned,
345
0
            prefix: node.prefix().as_slice().to_vec(),
346
0
        }
347
0
    }
348
349
0
    fn backward_scan_at<R>(node: &'a Node<P, V>, range: &R, query_type: QueryType) -> Self
350
0
    where
351
0
        R: RangeBounds<P>,
352
    {
353
0
        let mut iters = Vec::new();
354
0
        let mut leafs = BinaryHeap::new();
355
356
0
        if let NodeType::Twig(twig) = &node.node_type {
357
0
            if range.contains(&twig.key) {
358
                // Apply the same query filtering as forward iteration
359
0
                if let Some(v) = twig.get_leaf_by_query_ref(query_type) {
360
0
                    leafs.push(Leaf(&twig.key, v));
361
0
                }
362
0
            }
363
0
        } else {
364
0
            iters.push(NodeIter::new(node.iter()));
365
0
        }
366
367
0
        Self {
368
0
            iters,
369
0
            leafs,
370
0
            is_versioned: false, // Not used in QueryIterator
371
0
            prefix: node.prefix().as_slice().to_vec(),
372
0
        }
373
0
    }
374
}
375
376
pub struct Range<'a, K: KeyTrait, V: Clone, R> {
377
    forward: ForwardIterState<'a, K, V>,
378
    backward: BackwardIterState<'a, K, V>,
379
    range: R,
380
    forward_prefix: Vec<u8>,
381
    forward_prefix_lengths: Vec<usize>,
382
    backward_prefix: Vec<u8>,
383
    backward_prefix_lengths: Vec<usize>,
384
    last_forward_key: Option<K>,
385
    last_backward_key: Option<K>,
386
}
387
388
impl<'a, K: KeyTrait, V: Clone, R> Range<'a, K, V, R>
389
where
390
    K: Ord,
391
    R: RangeBounds<K>,
392
{
393
0
    pub(crate) fn empty(range: R) -> Self {
394
0
        Self {
395
0
            forward: ForwardIterState::empty(),
396
0
            backward: BackwardIterState::empty(),
397
0
            range,
398
0
            forward_prefix: Vec::new(),
399
0
            forward_prefix_lengths: Vec::new(),
400
0
            backward_prefix: Vec::new(),
401
0
            backward_prefix_lengths: Vec::new(),
402
0
            last_forward_key: None,
403
0
            last_backward_key: None,
404
0
        }
405
0
    }
406
407
0
    pub(crate) fn new(node: Option<&'a Arc<Node<K, V>>>, range: R) -> Self
408
0
    where
409
0
        R: RangeBounds<K>,
410
    {
411
0
        let forward = node.map_or_else(ForwardIterState::empty, |n| {
412
0
            ForwardIterState::forward_scan(n, &range, false)
413
0
        });
414
0
        let backward = node.map_or_else(BackwardIterState::empty, |n| {
415
0
            BackwardIterState::backward_scan(n, &range, false)
416
0
        });
417
418
0
        Self {
419
0
            range,
420
0
            forward_prefix: forward.prefix.clone(),
421
0
            forward_prefix_lengths: Vec::new(),
422
0
            backward_prefix: backward.prefix.clone(),
423
0
            backward_prefix_lengths: Vec::new(),
424
0
            forward,
425
0
            backward,
426
0
            last_forward_key: None,
427
0
            last_backward_key: None,
428
0
        }
429
0
    }
430
}
431
432
#[inline]
433
0
fn is_key_out_of_range<K: KeyTrait, R>(range: &R, key: &K) -> bool
434
0
where
435
0
    R: RangeBounds<K>,
436
{
437
0
    match range.end_bound() {
438
0
        Bound::Included(k) => key > k,
439
0
        Bound::Excluded(k) => key >= k,
440
0
        Bound::Unbounded => false,
441
    }
442
0
}
443
444
0
fn handle_non_twig_node<'a, K, V, R>(
445
0
    prefix: &mut Vec<u8>,
446
0
    prefix_lengths: &mut Vec<usize>,
447
0
    range: &R,
448
0
    node: &'a Arc<Node<K, V>>,
449
0
    iters: &mut Vec<NodeIter<'a, K, V>>,
450
0
) where
451
0
    K: KeyTrait + 'a,
452
0
    R: RangeBounds<K>,
453
0
    V: Clone + 'a,
454
{
455
0
    let prefix_len_before = prefix.len();
456
0
    prefix.extend_from_slice(node.prefix().as_slice());
457
458
0
    let prefix_slice = prefix.as_slice();
459
0
    let prefix_len_after = prefix_slice.len();
460
461
0
    let start_bound_slice = get_bound_slice(range.start_bound(), prefix_len_after);
462
0
    let end_bound_slice = get_bound_slice(range.end_bound(), prefix_len_after);
463
464
0
    if is_slice_within_bounds(prefix_slice, start_bound_slice, end_bound_slice, range) {
465
0
        iters.push(NodeIter::new(node.iter()));
466
0
        prefix_lengths.push(prefix_len_before);
467
0
    } else {
468
0
        prefix.truncate(prefix_len_before);
469
0
    }
470
0
}
471
472
#[inline]
473
0
fn get_bound_slice<K>(bound: Bound<&K>, prefix_len: usize) -> &[u8]
474
0
where
475
0
    K: KeyTrait,
476
{
477
0
    match bound {
478
0
        Bound::Included(bound) | Bound::Excluded(bound) => {
479
0
            &bound.as_slice()[..prefix_len.min(bound.as_slice().len())]
480
        }
481
0
        Bound::Unbounded => &[],
482
    }
483
0
}
484
485
#[inline]
486
0
fn is_slice_within_bounds<K, R>(
487
0
    prefix_slice: &[u8],
488
0
    start_bound_slice: &[u8],
489
0
    end_bound_slice: &[u8],
490
0
    range: &R,
491
0
) -> bool
492
0
where
493
0
    K: KeyTrait,
494
0
    R: RangeBounds<K>,
495
{
496
0
    let within_start_bound = match range.start_bound() {
497
0
        Bound::Included(_) => prefix_slice >= start_bound_slice,
498
0
        Bound::Excluded(_) => prefix_slice > start_bound_slice,
499
0
        Bound::Unbounded => true,
500
    };
501
502
0
    let within_end_bound = match range.end_bound() {
503
0
        Bound::Included(_) => prefix_slice <= end_bound_slice,
504
0
        Bound::Excluded(_) => prefix_slice <= end_bound_slice,
505
0
        Bound::Unbounded => true,
506
    };
507
508
0
    within_start_bound && within_end_bound
509
0
}
510
511
impl<'a, K: KeyTrait + Ord, V: Clone, R: RangeBounds<K>> Iterator for Range<'a, K, V, R> {
512
    type Item = IterItem<'a, V>;
513
514
0
    fn next(&mut self) -> Option<Self::Item> {
515
0
        while let Some(node) = self.forward.iters.last_mut() {
516
0
            match node.next() {
517
0
                Some(other) => {
518
0
                    if let NodeType::Twig(twig) = &other.node_type {
519
0
                        if self.range.contains(&twig.key) {
520
0
                            if let Some(v) = twig.get_latest_leaf() {
521
0
                                self.forward.leafs.push_back(Leaf(&twig.key, v));
522
0
                            }
523
0
                            break;
524
0
                        } else if is_key_out_of_range(&self.range, &twig.key) {
525
0
                            self.forward.iters.clear();
526
0
                        }
527
0
                    } else {
528
0
                        handle_non_twig_node(
529
0
                            &mut self.forward_prefix,
530
0
                            &mut self.forward_prefix_lengths,
531
0
                            &self.range,
532
0
                            other,
533
0
                            &mut self.forward.iters,
534
0
                        );
535
0
                    }
536
                }
537
                None => {
538
0
                    self.forward.iters.pop();
539
0
                    if let Some(len) = self.forward_prefix_lengths.pop() {
540
0
                        self.forward_prefix.truncate(len);
541
0
                    }
542
                }
543
            }
544
        }
545
546
0
        self.forward.leafs.pop_front().and_then(|leaf| {
547
0
            self.last_forward_key = Some(leaf.0.clone());
548
0
            if self
549
0
                .last_forward_key
550
0
                .as_ref()
551
0
                .zip(self.last_backward_key.as_ref())
552
0
                .is_none_or(|(k1, k2)| k1 < k2)
553
            {
554
0
                Some((leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts))
555
            } else {
556
0
                self.forward.iters.clear();
557
0
                self.forward.leafs.clear();
558
0
                None
559
            }
560
0
        })
561
0
    }
562
}
563
564
#[inline]
565
0
fn is_key_out_of_range_backward<K: KeyTrait, R>(range: &R, key: &K) -> bool
566
0
where
567
0
    R: RangeBounds<K>,
568
{
569
    // For backward iteration, we only clear if key is below the start bound
570
0
    match range.start_bound() {
571
0
        Bound::Included(k) => key < k,
572
0
        Bound::Excluded(k) => key <= k,
573
0
        Bound::Unbounded => false,
574
    }
575
0
}
576
577
impl<K: KeyTrait + Ord, V: Clone, R: RangeBounds<K>> DoubleEndedIterator for Range<'_, K, V, R> {
578
0
    fn next_back(&mut self) -> Option<Self::Item> {
579
0
        while let Some(node) = self.backward.iters.last_mut() {
580
0
            match node.next_back() {
581
0
                Some(other) => {
582
0
                    if let NodeType::Twig(twig) = &other.node_type {
583
0
                        if self.range.contains(&twig.key) {
584
0
                            if let Some(v) = twig.get_latest_leaf() {
585
0
                                self.backward.leafs.push(Leaf(&twig.key, v));
586
0
                            }
587
0
                            break;
588
0
                        } else if is_key_out_of_range_backward(&self.range, &twig.key) {
589
0
                            self.backward.iters.clear();
590
0
                            break;
591
0
                        }
592
0
                    } else {
593
0
                        handle_non_twig_node(
594
0
                            &mut self.backward_prefix,
595
0
                            &mut self.backward_prefix_lengths,
596
0
                            &self.range,
597
0
                            other,
598
0
                            &mut self.backward.iters,
599
0
                        );
600
0
                    }
601
                }
602
                None => {
603
0
                    self.backward.iters.pop();
604
0
                    if let Some(len) = self.backward_prefix_lengths.pop() {
605
0
                        self.backward_prefix.truncate(len);
606
0
                    }
607
                }
608
            }
609
        }
610
611
0
        self.backward.leafs.pop().and_then(|leaf| {
612
0
            self.last_backward_key = Some(leaf.0.clone());
613
0
            if self
614
0
                .last_backward_key
615
0
                .as_ref()
616
0
                .zip(self.last_forward_key.as_ref())
617
0
                .is_none_or(|(k1, k2)| k1 > k2)
618
            {
619
0
                Some((leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts))
620
            } else {
621
0
                self.backward.iters.clear();
622
0
                self.backward.leafs.clear();
623
0
                None
624
            }
625
0
        })
626
0
    }
627
}
628
629
pub(crate) struct QueryIterator<'a, K: KeyTrait, V: Clone, R: RangeBounds<K>> {
630
    forward: ForwardIterState<'a, K, V>,
631
    backward: BackwardIterState<'a, K, V>,
632
    forward_prefix: Vec<u8>,
633
    forward_prefix_lengths: Vec<usize>,
634
    backward_prefix: Vec<u8>,
635
    backward_prefix_lengths: Vec<usize>,
636
    range: R,
637
    query_type: QueryType,
638
}
639
640
impl<'a, K: KeyTrait, V: Clone, R: RangeBounds<K>> QueryIterator<'a, K, V, R> {
641
0
    pub(crate) fn new(node: Option<&'a Arc<Node<K, V>>>, range: R, query_type: QueryType) -> Self {
642
0
        let forward = node.map_or_else(ForwardIterState::empty, |n| {
643
0
            ForwardIterState::scan_at(n, &range, query_type)
644
0
        });
645
0
        let backward = node.map_or_else(BackwardIterState::empty, |n| {
646
0
            BackwardIterState::backward_scan_at(n, &range, query_type)
647
0
        });
648
649
0
        let forward_prefix = forward.prefix.clone();
650
0
        let backward_prefix = backward.prefix.clone();
651
652
0
        Self {
653
0
            forward,
654
0
            backward,
655
0
            forward_prefix,
656
0
            forward_prefix_lengths: Vec::new(),
657
0
            backward_prefix,
658
0
            backward_prefix_lengths: Vec::new(),
659
0
            range,
660
0
            query_type,
661
0
        }
662
0
    }
663
}
664
665
impl<'a, K: KeyTrait, V: Clone, R: RangeBounds<K>> Iterator for QueryIterator<'a, K, V, R> {
666
    type Item = IterItem<'a, V>;
667
668
0
    fn next(&mut self) -> Option<Self::Item> {
669
        // First try to get item from the current node iteration
670
0
        while let Some(node) = self.forward.iters.last_mut() {
671
0
            match node.next() {
672
0
                Some(other) => {
673
0
                    if let NodeType::Twig(twig) = &other.node_type {
674
0
                        if self.range.contains(&twig.key) {
675
0
                            if let Some(leaf) = twig.get_leaf_by_query(self.query_type) {
676
0
                                return Some((
677
0
                                    twig.key.as_slice(),
678
0
                                    &leaf.value,
679
0
                                    leaf.version,
680
0
                                    leaf.ts,
681
0
                                ));
682
0
                            }
683
0
                        } else if is_key_out_of_range(&self.range, &twig.key) {
684
                            // stop iteration if the range end is exceeded
685
0
                            self.forward.iters.clear();
686
0
                            return None;
687
0
                        }
688
0
                    } else {
689
0
                        handle_non_twig_node(
690
0
                            &mut self.forward_prefix,
691
0
                            &mut self.forward_prefix_lengths,
692
0
                            &self.range,
693
0
                            other,
694
0
                            &mut self.forward.iters,
695
0
                        );
696
0
                    }
697
                }
698
                None => {
699
                    // Pop the iterator if no more elements
700
0
                    self.forward.iters.pop();
701
                    // Restore the prefix to its previous state
702
0
                    if let Some(prefix_len_before) = self.forward_prefix_lengths.pop() {
703
0
                        self.forward_prefix.truncate(prefix_len_before);
704
0
                    }
705
                }
706
            }
707
        }
708
709
        // If no more nodes to iterate, try the leaf queue
710
0
        self.forward
711
0
            .leafs
712
0
            .pop_front()
713
0
            .map(|leaf| (leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts))
714
0
    }
715
}
716
717
impl<K: KeyTrait + Ord, V: Clone, R: RangeBounds<K>> DoubleEndedIterator
718
    for QueryIterator<'_, K, V, R>
719
{
720
0
    fn next_back(&mut self) -> Option<Self::Item> {
721
        // First check if we have any leaves in the backward state
722
0
        if let Some(leaf) = self.backward.leafs.pop() {
723
0
            return Some((leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts));
724
0
        }
725
726
0
        while let Some(node) = self.backward.iters.last_mut() {
727
0
            match node.next_back() {
728
0
                Some(other) => {
729
0
                    if let NodeType::Twig(twig) = &other.node_type {
730
0
                        if self.range.contains(&twig.key) {
731
0
                            if let Some(leaf) = twig.get_leaf_by_query(self.query_type) {
732
0
                                return Some((
733
0
                                    twig.key.as_slice(),
734
0
                                    &leaf.value,
735
0
                                    leaf.version,
736
0
                                    leaf.ts,
737
0
                                ));
738
0
                            }
739
0
                        } else if is_key_out_of_range_backward(&self.range, &twig.key) {
740
0
                            self.backward.iters.clear();
741
0
                            break;
742
0
                        }
743
0
                    } else {
744
0
                        handle_non_twig_node(
745
0
                            &mut self.backward_prefix,
746
0
                            &mut self.backward_prefix_lengths,
747
0
                            &self.range,
748
0
                            other,
749
0
                            &mut self.backward.iters,
750
0
                        );
751
0
                    }
752
                }
753
                None => {
754
0
                    self.backward.iters.pop();
755
0
                    if let Some(len) = self.backward_prefix_lengths.pop() {
756
0
                        self.backward_prefix.truncate(len);
757
0
                    }
758
                }
759
            }
760
        }
761
762
0
        None
763
0
    }
764
}
765
766
pub struct VersionRange<'a, K: KeyTrait, V: Clone, R> {
767
    forward: ForwardIterState<'a, K, V>,
768
    range: R,
769
    forward_prefix: Vec<u8>,
770
    forward_prefix_lengths: Vec<usize>,
771
}
772
773
impl<'a, K: KeyTrait, V: Clone, R> VersionRange<'a, K, V, R>
774
where
775
    K: Ord,
776
    R: RangeBounds<K>,
777
{
778
0
    pub(crate) fn empty(range: R) -> Self {
779
0
        Self {
780
0
            forward: ForwardIterState::empty(),
781
0
            range,
782
0
            forward_prefix: Vec::new(),
783
0
            forward_prefix_lengths: Vec::new(),
784
0
        }
785
0
    }
786
787
0
    pub(crate) fn new(node: Option<&'a Arc<Node<K, V>>>, range: R) -> Self
788
0
    where
789
0
        R: RangeBounds<K>,
790
    {
791
0
        let forward = node.map_or_else(ForwardIterState::empty, |n| {
792
0
            ForwardIterState::forward_scan(n, &range, true)
793
0
        });
794
795
0
        Self {
796
0
            range,
797
0
            forward_prefix: forward.prefix.clone(),
798
0
            forward_prefix_lengths: Vec::new(),
799
0
            forward,
800
0
        }
801
0
    }
802
}
803
804
impl<'a, K: KeyTrait + Ord, V: Clone, R: RangeBounds<K>> Iterator for VersionRange<'a, K, V, R> {
805
    type Item = IterItem<'a, V>;
806
807
0
    fn next(&mut self) -> Option<Self::Item> {
808
0
        while let Some(node) = self.forward.iters.last_mut() {
809
0
            match node.next() {
810
0
                Some(other) => {
811
0
                    if let NodeType::Twig(twig) = &other.node_type {
812
0
                        if self.range.contains(&twig.key) {
813
                            // Add all versions for this key
814
0
                            for leaf in twig.iter() {
815
0
                                self.forward.leafs.push_back(Leaf(&twig.key, leaf));
816
0
                            }
817
0
                            break;
818
0
                        } else if is_key_out_of_range(&self.range, &twig.key) {
819
0
                            self.forward.iters.clear();
820
0
                        }
821
0
                    } else {
822
0
                        handle_non_twig_node(
823
0
                            &mut self.forward_prefix,
824
0
                            &mut self.forward_prefix_lengths,
825
0
                            &self.range,
826
0
                            other,
827
0
                            &mut self.forward.iters,
828
0
                        );
829
0
                    }
830
                }
831
                None => {
832
0
                    self.forward.iters.pop();
833
0
                    if let Some(len) = self.forward_prefix_lengths.pop() {
834
0
                        self.forward_prefix.truncate(len);
835
0
                    }
836
                }
837
            }
838
        }
839
840
0
        self.forward
841
0
            .leafs
842
0
            .pop_front()
843
0
            .map(|leaf| (leaf.0.as_slice(), &leaf.1.value, leaf.1.version, leaf.1.ts))
844
0
    }
845
}
846
847
#[cfg(test)]
848
mod tests {
849
    use rand::thread_rng;
850
    use rand::Rng;
851
    use std::collections::BTreeMap;
852
    use std::collections::HashMap;
853
    use std::collections::HashSet;
854
    use std::fs::File;
855
    use std::io::{BufRead, BufReader};
856
    use std::str::FromStr;
857
858
    use crate::art::Tree;
859
860
    use crate::VariableSizeKey;
861
    use crate::{FixedSizeKey, Key};
862
863
    fn from_be_bytes_key(k: &[u8]) -> u64 {
864
        let padded_k = if k.len() < 8 {
865
            let mut new_k = vec![0; 8];
866
            new_k[8 - k.len()..].copy_from_slice(k);
867
            new_k
868
        } else {
869
            k.to_vec()
870
        };
871
872
        let k_slice = &padded_k[..8];
873
        u64::from_be_bytes(k_slice.try_into().unwrap())
874
    }
875
876
    #[test]
877
    fn iter_with_versions_reads_all_versions() {
878
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
879
880
        // Insert multiple versions for a few keys
881
        let num_keys = 10;
882
        let versions_per_key = 5;
883
        for i in 0..num_keys {
884
            let key: FixedSizeKey<16> = i.into();
885
            for version in 1..versions_per_key + 1 {
886
                tree.insert_unchecked(&key, i, version, 0_u64).unwrap();
887
            }
888
        }
889
890
        // Use the versioned iterator to iterate through the tree
891
        let iter_with_versions = tree.iter_with_versions();
892
        let mut versions_map = HashMap::new();
893
        for (key, value, version, _timestamp) in iter_with_versions {
894
            let key_num = from_be_bytes_key(key);
895
            // Check if the key is correct (matches the value)
896
            assert_eq!(
897
                key_num, *value as u64,
898
                "Key does not match the expected value"
899
            );
900
901
            versions_map
902
                .entry(key_num)
903
                .or_insert_with(Vec::new)
904
                .push(version);
905
        }
906
907
        // Verify that each key has the correct number of versions and they are sequential
908
        for versions in versions_map.values() {
909
            assert_eq!(versions.len() as u64, versions_per_key);
910
911
            let mut expected_version = 1;
912
            for version in versions {
913
                assert_eq!(*version, expected_version);
914
                expected_version += 1;
915
            }
916
        }
917
918
        // Verify that the total count matches the expected number of entries
919
        let expected_count = num_keys as u64 * versions_per_key;
920
        assert_eq!(
921
            versions_map
922
                .values()
923
                .map(|versions| versions.len())
924
                .sum::<usize>(),
925
            expected_count as usize,
926
            "Total count of versions does not match the expected count"
927
        );
928
    }
929
930
    #[test]
931
    fn iter_with_versions_reads_versions_in_decreasing_order() {
932
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
933
934
        // Insert multiple versions for a few keys in decreasing order
935
        let num_keys = 10;
936
        let versions_per_key = 5;
937
        for i in 0..num_keys {
938
            let key: FixedSizeKey<16> = i.into();
939
            for version in (1..=versions_per_key).rev() {
940
                tree.insert_unchecked(&key, i, version, 0_u64).unwrap();
941
            }
942
        }
943
944
        // Use the versioned iterator to iterate through the tree
945
        let iter_with_versions = tree.iter_with_versions();
946
        let mut versions_map = HashMap::new();
947
        for (key, value, version, _timestamp) in iter_with_versions {
948
            let key_num = from_be_bytes_key(key);
949
            // Check if the key is correct (matches the value)
950
            assert_eq!(
951
                key_num, *value as u64,
952
                "Key does not match the expected value"
953
            );
954
955
            versions_map
956
                .entry(key_num)
957
                .or_insert_with(Vec::new)
958
                .push(version);
959
        }
960
961
        // Verify that each key has the correct number of versions and they are in decreasing order
962
        for versions in versions_map.values() {
963
            assert_eq!(
964
                versions.len() as u64,
965
                versions_per_key,
966
                "Incorrect number of versions"
967
            );
968
969
            // Check if versions are in decreasing order
970
            let mut expected_version = 1;
971
            for version in versions {
972
                assert_eq!(*version, expected_version, "Version order mismatch");
973
                expected_version += 1;
974
            }
975
        }
976
977
        // Verify that the total count matches the expected number of entries
978
        let expected_count = num_keys as u64 * versions_per_key;
979
        assert_eq!(
980
            versions_map
981
                .values()
982
                .map(|versions| versions.len())
983
                .sum::<usize>(),
984
            expected_count as usize,
985
            "Total count of versions does not match the expected count"
986
        );
987
    }
988
989
    #[test]
990
    fn range_query_iterator_verifies_keys_and_versions_within_range() {
991
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
992
993
        // Define the range for the query
994
        let query_range_start: FixedSizeKey<16> = 3u16.into();
995
        let query_range_end: FixedSizeKey<16> = 7u16.into(); // Exclusive
996
        let versions_per_key = 5;
997
998
        // Insert multiple versions for multiple keys, some of which fall within the query range
999
        let num_keys: u16 = 10;
1000
        for i in 0..num_keys {
1001
            let key: FixedSizeKey<16> = i.into();
1002
            for version in 1..=versions_per_key {
1003
                tree.insert_unchecked(&key, i, version, 0_u64).unwrap();
1004
            }
1005
        }
1006
1007
        // Use the range query iterator to iterate through the tree for keys within the specified range
1008
1009
        let range_query_iter =
1010
            tree.range_with_versions(query_range_start.clone()..=query_range_end.clone());
1011
        let mut versions_map = HashMap::new();
1012
1013
        let query_range_start = from_be_bytes_key(query_range_start.as_slice());
1014
        let query_range_end = from_be_bytes_key(query_range_end.as_slice());
1015
1016
        for (key, _value, version, _timestamp) in range_query_iter {
1017
            let key_num = from_be_bytes_key(key);
1018
            assert!(
1019
                key_num >= query_range_start && key_num <= query_range_end,
1020
                "Key {:?} is outside the query range",
1021
                key_num
1022
            );
1023
1024
            versions_map
1025
                .entry(key_num)
1026
                .or_insert_with(Vec::new)
1027
                .push(version);
1028
        }
1029
1030
        // Verify that each key within the range has the correct number of versions and they are sequential
1031
        for key in query_range_start..=query_range_end {
1032
            if let Some(versions) = versions_map.get(&key) {
1033
                assert_eq!(
1034
                    versions.len(),
1035
                    versions_per_key as usize,
1036
                    "Incorrect number of versions for key {}",
1037
                    key
1038
                );
1039
1040
                let mut expected_version = 1;
1041
                for version in versions {
1042
                    assert_eq!(
1043
                        *version, expected_version,
1044
                        "Version sequence mismatch for key {}",
1045
                        key
1046
                    );
1047
                    expected_version += 1;
1048
                }
1049
            } else {
1050
                panic!(
1051
                    "Key {} within the query range was not found in the results",
1052
                    key
1053
                );
1054
            }
1055
        }
1056
1057
        // Optionally, verify that no keys outside the range are present in the results
1058
        assert!(
1059
            versions_map
1060
                .keys()
1061
                .all(|&k| k >= query_range_start && k <= query_range_end),
1062
            "Found keys outside the query range"
1063
        );
1064
1065
        // Verify that the total count matches the expected number of entries
1066
        let expected_count = 25;
1067
        assert_eq!(
1068
            versions_map
1069
                .values()
1070
                .map(|versions| versions.len())
1071
                .sum::<usize>(),
1072
            expected_count as usize,
1073
            "Total count of versions does not match the expected count"
1074
        );
1075
    }
1076
1077
    #[test]
1078
    fn test_iter_with_versions_with_two_versions_of_same_key() {
1079
        // This tests verifies when the root is twig node, if versioned iter works correctly
1080
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
1081
1082
        // Insert two versions for the same key
1083
        let key: FixedSizeKey<16> = 1u16.into();
1084
        let versions = [1, 2];
1085
        for &version in &versions {
1086
            tree.insert_unchecked(&key, 1, version, 0_u64).unwrap();
1087
        }
1088
1089
        // Use iterator to iterate through the tree
1090
        let iter = tree.iter_with_versions();
1091
        let mut found_versions = Vec::new();
1092
        for (iter_key, iter_value, iter_version, _timestamp) in iter {
1093
            // Check if the key and value are as expected
1094
            assert_eq!(
1095
                from_be_bytes_key(iter_key),
1096
                1,
1097
                "Key does not match the expected value"
1098
            );
1099
            assert_eq!(*iter_value, 1, "Value does not match the expected value");
1100
1101
            // Collect found versions
1102
            found_versions.push(iter_version);
1103
        }
1104
1105
        // Verify that both versions of the key are found
1106
        assert_eq!(
1107
            found_versions.len(),
1108
            2,
1109
            "Did not find both versions of the key"
1110
        );
1111
        for &version in &versions {
1112
            assert!(
1113
                found_versions.contains(&version),
1114
                "Missing version {}",
1115
                version
1116
            );
1117
        }
1118
    }
1119
1120
    #[test]
1121
    fn test_range_with_versions_query_with_two_versions_of_same_key() {
1122
        // This tests verifies when the root is twig node, if versioned iter works correctly
1123
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
1124
1125
        // Insert two versions for the same key
1126
        let key: FixedSizeKey<16> = 1u16.into();
1127
        let versions = [1, 2];
1128
        for &version in &versions {
1129
            tree.insert_unchecked(&key, 1, version, 0_u64).unwrap();
1130
        }
1131
1132
        // Define start and end keys for the range query
1133
        let start_key: FixedSizeKey<16> = 0u16.into(); // Start from a key before the inserted key
1134
        let end_key: FixedSizeKey<16> = 2u16.into(); // End at a key after the inserted key
1135
1136
        // Use range query to iterate through the tree
1137
        let range_iter = tree.range_with_versions(start_key..=end_key);
1138
        let mut found_versions = Vec::new();
1139
        for (iter_key, iter_value, iter_version, _timestamp) in range_iter {
1140
            // Check if the key and value are as expected
1141
            assert_eq!(
1142
                from_be_bytes_key(iter_key),
1143
                1,
1144
                "Key does not match the expected value"
1145
            );
1146
            assert_eq!(*iter_value, 1, "Value does not match the expected value");
1147
1148
            // Collect found versions
1149
            found_versions.push(iter_version);
1150
        }
1151
1152
        // Verify that both versions of the key are found in the range query
1153
        assert_eq!(
1154
            found_versions.len(),
1155
            2,
1156
            "Did not find both versions of the key in the range query"
1157
        );
1158
        for &version in &versions {
1159
            assert!(
1160
                found_versions.contains(&version),
1161
                "Missing version {} in range query",
1162
                version
1163
            );
1164
        }
1165
    }
1166
1167
    #[test]
1168
    fn reverse_iter() {
1169
        let mut tree: Tree<FixedSizeKey<16>, u16> = Tree::<FixedSizeKey<16>, u16>::new();
1170
        let total_items = 1000u16;
1171
        for i in 1..=total_items {
1172
            let key: FixedSizeKey<16> = i.into();
1173
            tree.insert(&key, i, 0, 0).unwrap();
1174
        }
1175
1176
        let mut iter = tree.iter().peekable();
1177
        let mut fwd = Vec::new();
1178
        let mut bwd = Vec::new();
1179
        while iter.peek().is_some() {
1180
            if thread_rng().gen_bool(0.5) {
1181
                (0..thread_rng().gen_range(1..10)).for_each(|_| {
1182
                    if let Some((_, v, _, _)) = iter.next() {
1183
                        fwd.push(*v)
1184
                    }
1185
                });
1186
            } else {
1187
                (0..thread_rng().gen_range(1..10)).for_each(|_| {
1188
                    if let Some((_, v, _, _)) = iter.next_back() {
1189
                        bwd.push(*v)
1190
                    }
1191
                });
1192
            }
1193
        }
1194
1195
        let expected: Vec<u16> = (1..=total_items).collect();
1196
        bwd.reverse();
1197
        fwd.append(&mut bwd);
1198
        assert_eq!(expected, fwd);
1199
    }
1200
1201
    fn setup_trie() -> Tree<VariableSizeKey, u16> {
1202
        let mut tree: Tree<VariableSizeKey, u16> = Tree::<VariableSizeKey, u16>::new();
1203
        let words = vec![
1204
            ("apple", 1),
1205
            ("apricot", 2),
1206
            ("banana", 3),
1207
            ("blackberry", 4),
1208
            ("blueberry", 5),
1209
            ("cherry", 6),
1210
            ("date", 7),
1211
            ("fig", 8),
1212
            ("grape", 9),
1213
            ("kiwi", 10),
1214
        ];
1215
1216
        for (word, value) in words {
1217
            let key = &VariableSizeKey::from_str(word).unwrap();
1218
            tree.insert(key, value, 0, 0).unwrap();
1219
        }
1220
1221
        tree
1222
    }
1223
1224
    #[test]
1225
    fn test_range_scan_full_range() {
1226
        let trie = setup_trie();
1227
        let range = VariableSizeKey::from_slice("berry".as_bytes())
1228
            ..=VariableSizeKey::from_slice("kiwi".as_bytes());
1229
        let results: Vec<_> = trie.range(range).collect();
1230
1231
        let expected = vec![
1232
            (&b"blackberry"[..], &4, 4, 0),
1233
            (&b"blueberry"[..], &5, 5, 0),
1234
            (&b"cherry"[..], &6, 6, 0),
1235
            (&b"date"[..], &7, 7, 0),
1236
            (&b"fig"[..], &8, 8, 0),
1237
            (&b"grape"[..], &9, 9, 0),
1238
            (&b"kiwi"[..], &10, 10, 0),
1239
        ];
1240
1241
        assert_eq!(results, expected);
1242
    }
1243
1244
    fn setup_btree() -> BTreeMap<Box<[u8]>, u16> {
1245
        let mut btree = BTreeMap::new();
1246
        let words = vec![
1247
            ("apple", 1u16),
1248
            ("apricot", 2),
1249
            ("banana", 3),
1250
            ("blackberry", 4),
1251
            ("blueberry", 5),
1252
            ("cherry", 6),
1253
            ("date", 7),
1254
            ("fig", 8),
1255
            ("grape", 9),
1256
            ("kiwi", 10),
1257
        ];
1258
1259
        for (word, value) in words {
1260
            btree.insert(Box::from(word.as_bytes()), value);
1261
        }
1262
1263
        btree
1264
    }
1265
1266
    #[test]
1267
    fn test_full_scan() {
1268
        let trie = setup_trie();
1269
        let btree = setup_btree();
1270
1271
        let range_start = VariableSizeKey::from_slice("berry".as_bytes());
1272
        let range_end = VariableSizeKey::from_slice("kiwi".as_bytes());
1273
        let trie_results: Vec<_> = trie.range(range_start..=range_end).collect();
1274
1275
        let btree_range = Box::from(&b"berry"[..])..=Box::from(&b"kiwi"[..]);
1276
        let btree_results: Vec<_> = btree
1277
            .range(btree_range)
1278
            .map(|(k, v)| (k.as_ref(), *v))
1279
            .collect();
1280
1281
        let trie_expected: Vec<_> = trie_results.iter().map(|(k, v, _, _)| (*k, **v)).collect();
1282
1283
        assert_eq!(trie_expected, btree_results);
1284
    }
1285
1286
    #[test]
1287
    fn test_range_scan_large_words() {
1288
        let mut trie: Tree<VariableSizeKey, u16> = Tree::<VariableSizeKey, u16>::new();
1289
        let mut btree = BTreeMap::new();
1290
1291
        // Insert a large number of words
1292
        for i in 0..10000 {
1293
            let word = format!("word{:05}", i);
1294
            let key = &VariableSizeKey::from_str(&word).unwrap();
1295
            trie.insert(key, i as u16, 0, 0).unwrap();
1296
            btree.insert(word.as_bytes().to_vec(), i as u16);
1297
        }
1298
1299
        // Define a range within the dataset
1300
        let range_start = VariableSizeKey::from_slice("word05000".as_bytes());
1301
        let range_end = VariableSizeKey::from_slice("word05999".as_bytes());
1302
        let trie_results: Vec<_> = trie.range(range_start..=range_end).collect();
1303
1304
        let btree_range = b"word05000".to_vec()..=b"word05999".to_vec();
1305
        let btree_results: Vec<_> = btree
1306
            .range(btree_range)
1307
            .map(|(k, v)| (k.clone(), *v))
1308
            .collect();
1309
1310
        // Fixed version - no explicit type annotation needed
1311
        let trie_expected: Vec<_> = trie_results
1312
            .iter()
1313
            .map(|(k, v, _, _): &(&[u8], &u16, u64, u64)| (k.to_vec(), **v))
1314
            .collect();
1315
1316
        assert_eq!(trie_expected, btree_results);
1317
    }
1318
1319
    fn load_words() -> Vec<String> {
1320
        let file = File::open("testdata/words.txt").expect("Unable to open words.txt");
1321
        let reader = BufReader::new(file);
1322
        reader.lines().map(|line| line.unwrap()).collect()
1323
    }
1324
1325
    #[test]
1326
    fn test_range_scan_dictionary() {
1327
        let mut trie: Tree<VariableSizeKey, u16> = Tree::<VariableSizeKey, u16>::new();
1328
        let mut btree = BTreeMap::new();
1329
1330
        // Load words from the dictionary
1331
        let words = load_words();
1332
1333
        // Insert all words into both the trie and the BTreeMap
1334
        for (i, word) in words.iter().enumerate() {
1335
            let key = &VariableSizeKey::from_str(word).unwrap();
1336
            trie.insert(key, i as u16, 0, 0).unwrap();
1337
            btree.insert(word.as_bytes().to_vec(), i as u16);
1338
        }
1339
1340
        // Define different types of range scans
1341
        let range_tests = vec![
1342
            ("a", "z"),              // Full range
1343
            ("apple", "banana"),     // Partial range
1344
            ("zzz", "zzzz"),         // Empty range
1345
            ("apple", "apple"),      // Single element range
1346
            ("a", "apple"),          // Edge case: start at the beginning
1347
            ("kiwi", "z"),           // Edge case: end at the last element
1348
            ("banana", "banana"),    // Single element range
1349
            ("apple", "apricot"),    // Partial range within close keys
1350
            ("fig", "grape"),        // Partial range in the middle
1351
            ("ap", "apz"),           // Prefix range
1352
            ("apricot", "apricot"),  // Single element range with non-existent key
1353
            ("apple", "apples"),     // Overlapping range
1354
            ("Apple", "apple"),      // Mixed case sensitivity
1355
            ("banana", "bananas"),   // Overlapping range with non-existent key
1356
            ("grape", "grapefruit"), // Overlapping range with close keys
1357
            ("a", "b"),              // Minute alphabet range
1358
            ("a", "m"),              // Large alphabet range
1359
            ("a", "a"),              // Single character range
1360
            ("apple", "applf"),      // Overlapping range with close keys
1361
            ("kiwi", "kiwz"),        // Overlapping range with close keys
1362
            ("apple", "applz"),      // Overlapping range with close keys
1363
            ("a", "aa"),             // Small alphabet range
1364
            ("a", "az"),             // Large alphabet range
1365
            ("m", "z"),              // Large alphabet range
1366
            ("apple", "applea"),     // Single element range with non-existent key
1367
            ("apple", "applez"),     // Overlapping range with close keys
1368
            ("kiwi", "kiwib"),       // Overlapping range with close keys
1369
        ];
1370
1371
        for (start, end) in range_tests {
1372
            let range_start = VariableSizeKey::from_slice(start.as_bytes());
1373
            let range_end = VariableSizeKey::from_slice(end.as_bytes());
1374
1375
            // Inclusive-Inclusive
1376
            let trie_results_incl_incl: Vec<_> = trie
1377
                .range(range_start.clone()..=range_end.clone())
1378
                .collect();
1379
            let btree_results_incl_incl: Vec<_> = btree
1380
                .range(start.as_bytes().to_vec()..=end.as_bytes().to_vec())
1381
                .map(|(k, v)| (k.clone(), *v))
1382
                .collect();
1383
            let trie_expected_incl_incl: Vec<_> = trie_results_incl_incl
1384
                .iter()
1385
                .map(|(k, v, _, _)| (k.to_vec(), **v))
1386
                .collect();
1387
            assert_eq!(
1388
                trie_expected_incl_incl, btree_results_incl_incl,
1389
                "Inclusive-Inclusive range scan from {} to {} failed",
1390
                start, end
1391
            );
1392
1393
            // Inclusive-Exclusive
1394
            let trie_results_incl_excl: Vec<_> =
1395
                trie.range(range_start.clone()..range_end.clone()).collect();
1396
            let btree_results_incl_excl: Vec<_> = btree
1397
                .range(start.as_bytes().to_vec()..end.as_bytes().to_vec())
1398
                .map(|(k, v)| (k.clone(), *v))
1399
                .collect();
1400
            let trie_expected_incl_excl: Vec<_> = trie_results_incl_excl
1401
                .iter()
1402
                .map(|(k, v, _, _)| (k.to_vec(), **v))
1403
                .collect();
1404
            assert_eq!(
1405
                trie_expected_incl_excl, btree_results_incl_excl,
1406
                "Inclusive-Exclusive range scan from {} to {} failed",
1407
                start, end
1408
            );
1409
        }
1410
    }
1411
1412
    // simulate an insert operation in surrealdb insert statement
1413
    fn setup_trie_and_btreemap() -> (Tree<VariableSizeKey, u16>, BTreeMap<VariableSizeKey, u16>) {
1414
        let mut tree: Tree<VariableSizeKey, u16> = Tree::<VariableSizeKey, u16>::new();
1415
        let mut map: BTreeMap<VariableSizeKey, u16> = BTreeMap::new();
1416
        let keys = vec![
1417
            VariableSizeKey::from_string(&"/!nstest".to_string()),
1418
            VariableSizeKey::from_string(&"/*test!dbtest".to_string()),
1419
            VariableSizeKey::from_string(&"/*test*test!tbtest".to_string()),
1420
            VariableSizeKey::from_string(&"/*test*test*test*b9ns6pmsa3sbsp0hjnzw".to_string()),
1421
            VariableSizeKey::from_string(&"/*test*test*test*gp46l3i2cj57wja4k18g".to_string()),
1422
            VariableSizeKey::from_string(&"/*test*test*test*6enirwrmcqwdi2xjd8qh".to_string()),
1423
            VariableSizeKey::from_string(&"/*test*test*test*ehk18bp7mn54pfrx1523".to_string()),
1424
            VariableSizeKey::from_string(&"/*test*test*test*ycadgte5z1uuc424niqw".to_string()),
1425
            VariableSizeKey::from_string(&"/*test*test*test*v583rkcd9l2tml9ms7o9".to_string()),
1426
            VariableSizeKey::from_string(&"/*test*test*test*fylh5a0cy9khkvc2nkyg".to_string()),
1427
            VariableSizeKey::from_string(&"/*test*test*test*ughityuap0flmrssvhyf".to_string()),
1428
            VariableSizeKey::from_string(&"/*test*test*test*mklf5j29ytbbo497hlhq".to_string()),
1429
            VariableSizeKey::from_string(&"/*test*test*test*ufh1obqdltnj4lrt59y4".to_string()),
1430
        ];
1431
1432
        for key in &keys {
1433
            tree.insert(key, 1, 0, 0).unwrap();
1434
        }
1435
1436
        for key in keys {
1437
            map.insert(key, 1);
1438
        }
1439
1440
        (tree, map)
1441
    }
1442
1443
    #[test]
1444
    fn test_trie_vs_btreemap_range_scan_in_sdb_insert() {
1445
        let (trie, map) = setup_trie_and_btreemap();
1446
        let range = VariableSizeKey::from_string(&"/*test*test*test*".to_string())
1447
            ..VariableSizeKey::from_string(&"/*test*test*test*�".to_string());
1448
1449
        let trie_results: Vec<_> = trie.range(range.clone()).collect();
1450
        let map_results: Vec<_> = map.range(range).collect();
1451
1452
        let trie_expected: Vec<_> = trie_results
1453
            .iter()
1454
            .map(|(k, v, _, _)| (k.to_vec(), **v))
1455
            .collect();
1456
1457
        let map_expected: Vec<_> = map_results
1458
            .iter()
1459
            .map(|(k, v)| (k.as_slice().to_vec(), **v))
1460
            .collect();
1461
1462
        assert_eq!(
1463
            trie_expected, map_expected,
1464
            "Range scan results do not match between Trie and BTreeMap"
1465
        );
1466
    }
1467
1468
    #[test]
1469
    fn test_range_scan_with_random_words_and_ranges() {
1470
        let mut trie: Tree<VariableSizeKey, u16> = Tree::<VariableSizeKey, u16>::new();
1471
        let mut btree = BTreeMap::new();
1472
1473
        // Generate random words
1474
        let words = generate_random_words(10000, 10..20);
1475
1476
        // Insert all words into both the trie and the BTreeMap
1477
        for (i, word) in words.iter().enumerate() {
1478
            let key = &VariableSizeKey::from_str(word).unwrap();
1479
            trie.insert(key, i as u16, 0, 0).unwrap();
1480
            btree.insert(word.as_bytes().to_vec(), i as u16);
1481
        }
1482
1483
        // Generate random range tests
1484
        let range_tests = generate_random_ranges(&words, 100);
1485
1486
        for (start, end) in range_tests {
1487
            let range_start = VariableSizeKey::from_slice(start.as_bytes());
1488
            let range_end = VariableSizeKey::from_slice(end.as_bytes());
1489
1490
            // Inclusive-Inclusive
1491
            let trie_results_incl_incl: Vec<_> = trie
1492
                .range(range_start.clone()..=range_end.clone())
1493
                .collect();
1494
            let btree_results_incl_incl: Vec<_> = btree
1495
                .range(start.as_bytes().to_vec()..=end.as_bytes().to_vec())
1496
                .map(|(k, v)| (k.clone(), *v))
1497
                .collect();
1498
            let trie_expected_incl_incl: Vec<_> = trie_results_incl_incl
1499
                .iter()
1500
                .map(|(k, v, _, _)| (k.to_vec(), **v))
1501
                .collect();
1502
            assert_eq!(
1503
                trie_expected_incl_incl, btree_results_incl_incl,
1504
                "Inclusive-Inclusive range scan from {} to {} failed",
1505
                start, end
1506
            );
1507
1508
            // Inclusive-Exclusive
1509
            let trie_results_incl_excl: Vec<_> =
1510
                trie.range(range_start.clone()..range_end.clone()).collect();
1511
            let btree_results_incl_excl: Vec<_> = btree
1512
                .range(start.as_bytes().to_vec()..end.as_bytes().to_vec())
1513
                .map(|(k, v)| (k.clone(), *v))
1514
                .collect();
1515
            let trie_expected_incl_excl: Vec<_> = trie_results_incl_excl
1516
                .iter()
1517
                .map(|(k, v, _, _)| (k.to_vec(), **v))
1518
                .collect();
1519
            assert_eq!(
1520
                trie_expected_incl_excl, btree_results_incl_excl,
1521
                "Inclusive-Exclusive range scan from {} to {} failed",
1522
                start, end
1523
            );
1524
        }
1525
    }
1526
1527
    fn generate_random_words(count: usize, length_range: std::ops::Range<usize>) -> Vec<String> {
1528
        let mut rng = rand::thread_rng();
1529
        (0..count)
1530
            .map(|_| {
1531
                let length = rng.gen_range(length_range.clone());
1532
                (0..length)
1533
                    .map(|_| (rng.gen_range(b'a'..=b'z') as char))
1534
                    .collect()
1535
            })
1536
            .collect()
1537
    }
1538
1539
    fn generate_random_ranges(words: &[String], count: usize) -> Vec<(String, String)> {
1540
        let mut rng = rand::thread_rng();
1541
        (0..count)
1542
            .map(|_| {
1543
                let start = &words[rng.gen_range(0..words.len())];
1544
                let end = &words[rng.gen_range(0..words.len())];
1545
                if start < end {
1546
                    (start.clone(), end.clone())
1547
                } else {
1548
                    (end.clone(), start.clone())
1549
                }
1550
            })
1551
            .collect()
1552
    }
1553
1554
    #[test]
1555
    fn test_range_scan_dictionary_with_random_ranges() {
1556
        let mut trie: Tree<VariableSizeKey, u16> = Tree::<VariableSizeKey, u16>::new();
1557
        let mut btree = BTreeMap::new();
1558
1559
        // Load words from the dictionary
1560
        let words = load_words();
1561
1562
        // Insert all words into both the trie and the BTreeMap
1563
        for (i, word) in words.iter().enumerate() {
1564
            let key = &VariableSizeKey::from_str(word).unwrap();
1565
            trie.insert(key, i as u16, 0, 0).unwrap();
1566
            btree.insert(word.as_bytes().to_vec(), i as u16);
1567
        }
1568
1569
        // Generate random range tests
1570
        let range_tests = generate_random_ranges(&words, 100);
1571
1572
        for (start, end) in range_tests {
1573
            let range_start = VariableSizeKey::from_slice(start.as_bytes());
1574
            let range_end = VariableSizeKey::from_slice(end.as_bytes());
1575
1576
            // Inclusive-Inclusive
1577
            let trie_results_incl_incl: Vec<_> = trie
1578
                .range(range_start.clone()..=range_end.clone())
1579
                .collect();
1580
            let btree_results_incl_incl: Vec<_> = btree
1581
                .range(start.as_bytes().to_vec()..=end.as_bytes().to_vec())
1582
                .map(|(k, v)| (k.clone(), *v))
1583
                .collect();
1584
            let trie_expected_incl_incl: Vec<_> = trie_results_incl_incl
1585
                .iter()
1586
                .map(|(k, v, _, _)| (k.to_vec(), **v))
1587
                .collect();
1588
            assert_eq!(
1589
                trie_expected_incl_incl, btree_results_incl_incl,
1590
                "Inclusive-Inclusive range scan from {} to {} failed",
1591
                start, end
1592
            );
1593
1594
            // Inclusive-Exclusive
1595
            let trie_results_incl_excl: Vec<_> =
1596
                trie.range(range_start.clone()..range_end.clone()).collect();
1597
            let btree_results_incl_excl: Vec<_> = btree
1598
                .range(start.as_bytes().to_vec()..end.as_bytes().to_vec())
1599
                .map(|(k, v)| (k.clone(), *v))
1600
                .collect();
1601
            let trie_expected_incl_excl: Vec<_> = trie_results_incl_excl
1602
                .iter()
1603
                .map(|(k, v, _, _)| (k.to_vec(), **v))
1604
                .collect();
1605
            assert_eq!(
1606
                trie_expected_incl_excl, btree_results_incl_excl,
1607
                "Inclusive-Exclusive range scan from {} to {} failed",
1608
                start, end
1609
            );
1610
        }
1611
    }
1612
1613
    #[test]
1614
    fn test_range_scan_reverse_iterator() {
1615
        let mut tree: Tree<FixedSizeKey<16>, u16> = Tree::<FixedSizeKey<16>, u16>::new();
1616
        let total_items = 1000u16;
1617
1618
        for i in 1..=total_items {
1619
            let key: FixedSizeKey<16> = i.into();
1620
            tree.insert(&key, i, 0, 0).unwrap();
1621
        }
1622
1623
        let start_key: FixedSizeKey<16> = 250u16.into();
1624
        let end_key: FixedSizeKey<16> = 750u16.into();
1625
1626
        let mut iter = tree.range(start_key..=end_key).peekable();
1627
        let mut forward = Vec::new();
1628
        let mut backward = Vec::new();
1629
        let mut seen_values = HashSet::new();
1630
        let total_expected = 750 - 250 + 1;
1631
1632
        // Randomly mix forward and backward iteration
1633
        while seen_values.len() < total_expected {
1634
            if thread_rng().gen_bool(0.5) {
1635
                for _ in 0..thread_rng().gen_range(1..10) {
1636
                    if let Some((_, v, _, _)) = iter.next() {
1637
                        if seen_values.insert(*v) {
1638
                            forward.push(*v);
1639
                        } else {
1640
                            break;
1641
                        }
1642
                    } else {
1643
                        break;
1644
                    }
1645
                }
1646
            } else {
1647
                for _ in 0..thread_rng().gen_range(1..10) {
1648
                    if let Some((_, v, _, _)) = iter.next_back() {
1649
                        if seen_values.insert(*v) {
1650
                            backward.push(*v);
1651
                        } else {
1652
                            break;
1653
                        }
1654
                    } else {
1655
                        break;
1656
                    }
1657
                }
1658
            }
1659
        }
1660
1661
        let expected: Vec<u16> = (250..=750).collect();
1662
1663
        // Combine results and verify
1664
        backward.reverse();
1665
        forward.append(&mut backward);
1666
        assert_eq!(expected, forward);
1667
1668
        assert_eq!(
1669
            forward.len(),
1670
            total_expected,
1671
            "Expected {} elements but got {}",
1672
            total_expected,
1673
            forward.len()
1674
        );
1675
        assert!(
1676
            forward.windows(2).all(|w| w[0] < w[1]),
1677
            "Result is not properly sorted"
1678
        );
1679
    }
1680
1681
    #[test]
1682
    fn test_range_scan_edge_cases_with_reverse() {
1683
        let mut tree: Tree<FixedSizeKey<16>, u16> = Tree::<FixedSizeKey<16>, u16>::new();
1684
1685
        for i in 1..=5u16 {
1686
            let key: FixedSizeKey<16> = i.into();
1687
            tree.insert(&key, i, 0, 0).unwrap();
1688
        }
1689
1690
        let test_cases = vec![
1691
            // Empty range
1692
            (6u16, 7u16, Vec::new()),
1693
            // Single element range
1694
            (3u16, 3u16, vec![3]),
1695
            // Full range
1696
            (1u16, 5u16, vec![1, 2, 3, 4, 5]),
1697
            // Partial range at start
1698
            (1u16, 3u16, vec![1, 2, 3]),
1699
            // Partial range at end
1700
            (3u16, 5u16, vec![3, 4, 5]),
1701
        ];
1702
1703
        for (start, end, expected) in test_cases {
1704
            let start_key: FixedSizeKey<16> = start.into();
1705
            let end_key: FixedSizeKey<16> = end.into();
1706
1707
            let range = start_key.clone()..=end_key.clone();
1708
            let mut iter = tree.range(range);
1709
            let mut result = Vec::new();
1710
1711
            while let Some((_, v, _, _)) = iter.next_back() {
1712
                result.push(*v);
1713
            }
1714
            result.reverse();
1715
1716
            assert_eq!(
1717
                result, expected,
1718
                "Backward iteration failed for range {}..={}",
1719
                start, end
1720
            );
1721
        }
1722
    }
1723
1724
    #[test]
1725
    fn test_range_scan_reverse_iterator_pattern() {
1726
        let mut tree: Tree<FixedSizeKey<16>, u16> = Tree::<FixedSizeKey<16>, u16>::new();
1727
1728
        for i in 1..=10u16 {
1729
            let key: FixedSizeKey<16> = i.into();
1730
            tree.insert(&key, i, 0, 0).unwrap();
1731
        }
1732
1733
        let start_key: FixedSizeKey<16> = 3u16.into();
1734
        let end_key: FixedSizeKey<16> = 8u16.into();
1735
        let mut iter = tree.range(start_key..=end_key).peekable();
1736
1737
        let mut results = Vec::new();
1738
1739
        // Test pattern: forward 2, backward 1, forward 1, backward 2
1740
        // Should give us a mixed traversal pattern
1741
1742
        // Forward 2
1743
        for _ in 0..2 {
1744
            if let Some((_, v, _, _)) = iter.next() {
1745
                results.push(*v);
1746
            }
1747
        }
1748
        // Should have [3, 4]
1749
1750
        // Backward 1
1751
        if let Some((_, v, _, _)) = iter.next_back() {
1752
            results.push(*v);
1753
        }
1754
        // Should have [3, 4, 8]
1755
1756
        // Forward 1
1757
        if let Some((_, v, _, _)) = iter.next() {
1758
            results.push(*v);
1759
        }
1760
        // Should have [3, 4, 8, 5]
1761
1762
        // Backward 2
1763
        for _ in 0..2 {
1764
            if let Some((_, v, _, _)) = iter.next_back() {
1765
                results.push(*v);
1766
            }
1767
        }
1768
        // Should have [3, 4, 8, 5, 7, 6]
1769
1770
        // Verify results match expected pattern
1771
        assert_eq!(results, vec![3, 4, 8, 5, 7, 6]);
1772
1773
        // Verify we can get all remaining items
1774
        let mut remaining = Vec::new();
1775
        iter.for_each(|(_, v, _, _)| remaining.push(*v));
1776
1777
        // There should be no remaining items
1778
        assert!(
1779
            remaining.is_empty(),
1780
            "Expected no remaining items but got: {:?}",
1781
            remaining
1782
        );
1783
    }
1784
1785
    #[test]
1786
    fn test_range_scan_reverse_iterator_pattern2() {
1787
        let mut tree: Tree<FixedSizeKey<16>, u16> = Tree::<FixedSizeKey<16>, u16>::new();
1788
1789
        // Insert numbers 1 through 6
1790
        for i in 1..=6u16 {
1791
            let key: FixedSizeKey<16> = i.into();
1792
            tree.insert(&key, i, 0, 0).unwrap();
1793
        }
1794
1795
        let start_key: FixedSizeKey<16> = 1u16.into();
1796
        let end_key: FixedSizeKey<16> = 6u16.into();
1797
        let mut iter = tree.range(start_key..=end_key).peekable();
1798
1799
        // Test the exact pattern from front and back
1800
        let (_, v, _, _) = iter.next().unwrap();
1801
        assert_eq!(*v, 1, "First forward should be 1"); // Move forward, get 1
1802
1803
        let (_, v, _, _) = iter.next_back().unwrap();
1804
        assert_eq!(*v, 6, "First backward should be 6"); // Move backward, get 6
1805
1806
        let (_, v, _, _) = iter.next_back().unwrap();
1807
        assert_eq!(*v, 5, "Second backward should be 5"); // Move backward, get 5
1808
1809
        let (_, v, _, _) = iter.next().unwrap();
1810
        assert_eq!(*v, 2, "Second forward should be 2"); // Move forward, get 2
1811
1812
        let (_, v, _, _) = iter.next().unwrap();
1813
        assert_eq!(*v, 3, "Third forward should be 3"); // Move forward, get 3
1814
1815
        let (_, v, _, _) = iter.next().unwrap();
1816
        assert_eq!(*v, 4, "Fourth forward should be 4"); // Move forward, get 4
1817
1818
        // Verify we've exhausted the iterator
1819
        assert!(
1820
            iter.next().is_none(),
1821
            "Iterator should be exhausted going forward"
1822
        );
1823
        assert!(
1824
            iter.next_back().is_none(),
1825
            "Iterator should be exhausted going backward"
1826
        );
1827
    }
1828
1829
    #[test]
1830
    fn test_version_range_empty() {
1831
        let tree = Tree::<FixedSizeKey<16>, u16>::new();
1832
        let start: FixedSizeKey<16> = 1u16.into();
1833
        let end: FixedSizeKey<16> = 5u16.into();
1834
        let iter = tree.range_with_versions(start..=end);
1835
        assert!(iter.count() == 0);
1836
    }
1837
1838
    #[test]
1839
    fn test_version_range_single_key() {
1840
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
1841
        let key: FixedSizeKey<16> = 1u16.into();
1842
1843
        // Insert multiple versions for single key
1844
        for version in 1..=3 {
1845
            tree.insert_unchecked(&key, 1, version, 0).unwrap();
1846
        }
1847
1848
        let iter = tree.range_with_versions(key.clone()..=key.clone());
1849
        let results: Vec<_> = iter.collect();
1850
1851
        assert_eq!(results.len(), 3);
1852
        assert!(results.iter().all(|(k, _, _, _)| from_be_bytes_key(k) == 1));
1853
    }
1854
1855
    #[test]
1856
    fn test_version_range_order() {
1857
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
1858
        let key: FixedSizeKey<16> = 1u16.into();
1859
1860
        // Insert versions in random order
1861
        tree.insert_unchecked(&key, 1, 3, 0).unwrap();
1862
        tree.insert_unchecked(&key, 1, 1, 0).unwrap();
1863
        tree.insert_unchecked(&key, 1, 2, 0).unwrap();
1864
1865
        let results: Vec<_> = tree
1866
            .range_with_versions(key.clone()..=key.clone())
1867
            .map(|(_, _, v, _)| v)
1868
            .collect();
1869
1870
        // Verify versions are returned in ascending order
1871
        assert_eq!(results, vec![1, 2, 3]);
1872
    }
1873
1874
    #[test]
1875
    fn test_version_range_bounds() {
1876
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
1877
1878
        for i in 1..=5u16 {
1879
            let key: FixedSizeKey<16> = i.into();
1880
            for version in 1..=2 {
1881
                tree.insert_unchecked(&key, i, version, 0).unwrap();
1882
            }
1883
        }
1884
1885
        let start_key: FixedSizeKey<16> = 1u16.into();
1886
        let mid_key: FixedSizeKey<16> = 3u16.into();
1887
1888
        // Test exclusive range (1..3)
1889
        let exclusive_results: Vec<_> = tree
1890
            .range_with_versions(start_key.clone()..mid_key.clone())
1891
            .collect();
1892
        assert_eq!(exclusive_results.len(), 4); // 2 keys * 2 versions
1893
1894
        // Verify the content - should have keys 1 and 2, each with versions 1 and 2
1895
        let mut key_version_map: HashMap<u16, Vec<u64>> = HashMap::new();
1896
        for (key, value, version, _) in exclusive_results {
1897
            let key_num = from_be_bytes_key(key);
1898
            key_version_map
1899
                .entry(key_num as u16)
1900
                .or_default()
1901
                .push(version);
1902
            assert_eq!(key_num, *value as u64, "Key and value should match");
1903
        }
1904
        assert!(key_version_map.contains_key(&1));
1905
        assert!(key_version_map.contains_key(&2));
1906
        assert!(!key_version_map.contains_key(&3));
1907
        for versions in key_version_map.values() {
1908
            assert_eq!(versions.len(), 2);
1909
            assert!(versions.contains(&1));
1910
            assert!(versions.contains(&2));
1911
        }
1912
1913
        // Test inclusive range (1..=3)
1914
        let inclusive_results: Vec<_> = tree
1915
            .range_with_versions(start_key.clone()..=mid_key.clone())
1916
            .collect();
1917
        assert_eq!(inclusive_results.len(), 6); // 3 keys * 2 versions
1918
1919
        // Verify content - should have keys 1, 2, and 3, each with versions 1 and 2
1920
        let mut key_version_map: HashMap<u16, Vec<u64>> = HashMap::new();
1921
        for (key, value, version, _) in inclusive_results {
1922
            let key_num = from_be_bytes_key(key);
1923
            key_version_map
1924
                .entry(key_num as u16)
1925
                .or_default()
1926
                .push(version);
1927
            assert_eq!(key_num, *value as u64, "Key and value should match");
1928
        }
1929
        assert!(key_version_map.contains_key(&1));
1930
        assert!(key_version_map.contains_key(&2));
1931
        assert!(key_version_map.contains_key(&3));
1932
        for versions in key_version_map.values() {
1933
            assert_eq!(versions.len(), 2);
1934
            assert!(versions.contains(&1));
1935
            assert!(versions.contains(&2));
1936
        }
1937
1938
        // Test unbounded start (..3)
1939
        let start_unbounded_results: Vec<_> = tree.range_with_versions(..mid_key.clone()).collect();
1940
        assert_eq!(start_unbounded_results.len(), 4); // 2 keys * 2 versions
1941
1942
        // Verify content - should have keys 1 and 2, each with versions 1 and 2
1943
        let mut key_version_map: HashMap<u16, Vec<u64>> = HashMap::new();
1944
        for (key, value, version, _) in start_unbounded_results {
1945
            let key_num = from_be_bytes_key(key);
1946
            key_version_map
1947
                .entry(key_num as u16)
1948
                .or_default()
1949
                .push(version);
1950
            assert_eq!(key_num, *value as u64, "Key and value should match");
1951
        }
1952
        assert!(key_version_map.contains_key(&1));
1953
        assert!(key_version_map.contains_key(&2));
1954
        assert!(!key_version_map.contains_key(&3));
1955
        for versions in key_version_map.values() {
1956
            assert_eq!(versions.len(), 2);
1957
            assert!(versions.contains(&1));
1958
            assert!(versions.contains(&2));
1959
        }
1960
1961
        // Test unbounded end (3..)
1962
        let end_unbounded_results: Vec<_> = tree.range_with_versions(mid_key.clone()..).collect();
1963
        assert_eq!(end_unbounded_results.len(), 6); // 3 keys * 2 versions
1964
1965
        // Verify content - should have keys 3, 4, and 5, each with versions 1 and 2
1966
        let mut key_version_map: HashMap<u16, Vec<u64>> = HashMap::new();
1967
        for (key, value, version, _) in end_unbounded_results {
1968
            let key_num = from_be_bytes_key(key);
1969
            key_version_map
1970
                .entry(key_num as u16)
1971
                .or_default()
1972
                .push(version);
1973
            assert_eq!(key_num, *value as u64, "Key and value should match");
1974
        }
1975
        assert!(key_version_map.contains_key(&3));
1976
        assert!(key_version_map.contains_key(&4));
1977
        assert!(key_version_map.contains_key(&5));
1978
        for versions in key_version_map.values() {
1979
            assert_eq!(versions.len(), 2);
1980
            assert!(versions.contains(&1));
1981
            assert!(versions.contains(&2));
1982
        }
1983
    }
1984
1985
    #[test]
1986
    fn test_version_range_large() {
1987
        let mut tree = Tree::<FixedSizeKey<16>, u16>::new();
1988
        let num_keys = 1000u16;
1989
        let versions_per_key = 10;
1990
1991
        for i in 0..num_keys {
1992
            let key: FixedSizeKey<16> = i.into();
1993
            for version in 1..=versions_per_key {
1994
                tree.insert_unchecked(&key, i, version, 0).unwrap();
1995
            }
1996
        }
1997
1998
        // Test small range (10..20)
1999
        let start_small: FixedSizeKey<16> = 10u16.into();
2000
        let end_small: FixedSizeKey<16> = 20u16.into();
2001
        let small_range_results: Vec<_> =
2002
            tree.range_with_versions(start_small..end_small).collect();
2003
2004
        assert_eq!(small_range_results.len(), 10 * versions_per_key as usize);
2005
2006
        // Verify small range content
2007
        let mut key_version_map: HashMap<u16, Vec<u64>> = HashMap::new();
2008
        for (key, value, version, _) in small_range_results {
2009
            let key_num = from_be_bytes_key(key);
2010
            key_version_map
2011
                .entry(key_num as u16)
2012
                .or_default()
2013
                .push(version);
2014
            assert_eq!(key_num, *value as u64, "Key and value should match");
2015
            assert!((10..20).contains(&key_num), "Key should be within range");
2016
        }
2017
        assert_eq!(key_version_map.len(), 10, "Should have exactly 10 keys");
2018
        for versions in key_version_map.values() {
2019
            assert_eq!(
2020
                versions.len(),
2021
                versions_per_key as usize,
2022
                "Each key should have all versions"
2023
            );
2024
            for v in 1..=versions_per_key {
2025
                assert!(versions.contains(&{ v }), "Version {} should exist", v);
2026
            }
2027
        }
2028
2029
        // Test large range (100..900)
2030
        let start_large: FixedSizeKey<16> = 100u16.into();
2031
        let end_large: FixedSizeKey<16> = 900u16.into();
2032
        let large_range_results: Vec<_> =
2033
            tree.range_with_versions(start_large..end_large).collect();
2034
2035
        assert_eq!(large_range_results.len(), 800 * versions_per_key as usize);
2036
2037
        // Verify large range content
2038
        let mut key_version_map: HashMap<u16, Vec<u64>> = HashMap::new();
2039
        for (key, value, version, _) in large_range_results {
2040
            let key_num = from_be_bytes_key(key);
2041
            key_version_map
2042
                .entry(key_num as u16)
2043
                .or_default()
2044
                .push(version);
2045
            assert_eq!(key_num, *value as u64, "Key and value should match");
2046
            assert!((100..900).contains(&key_num), "Key should be within range");
2047
        }
2048
        assert_eq!(key_version_map.len(), 800, "Should have exactly 800 keys");
2049
        for versions in key_version_map.values() {
2050
            assert_eq!(
2051
                versions.len(),
2052
                versions_per_key as usize,
2053
                "Each key should have all versions"
2054
            );
2055
            for v in 1..=versions_per_key {
2056
                assert!(versions.contains(&{ v }), "Version {} should exist", v);
2057
            }
2058
        }
2059
    }
2060
}