tantivy_sstable/value/
range.rs

1use std::io;
2use std::ops::Range;
3
4use crate::value::{deserialize_vint_u64, ValueReader, ValueWriter};
5
6/// See module comment.
7#[derive(Default)]
8pub struct RangeValueReader {
9    vals: Vec<Range<u64>>,
10}
11
12impl ValueReader for RangeValueReader {
13    type Value = Range<u64>;
14
15    #[inline(always)]
16    fn value(&self, idx: usize) -> &Range<u64> {
17        &self.vals[idx]
18    }
19
20    fn load(&mut self, mut data: &[u8]) -> io::Result<usize> {
21        self.vals.clear();
22        let original_num_bytes = data.len();
23        let len = deserialize_vint_u64(&mut data) as usize;
24        if len != 0 {
25            let mut prev_val = deserialize_vint_u64(&mut data);
26            for _ in 1..len {
27                let next_val = prev_val + deserialize_vint_u64(&mut data);
28                self.vals.push(prev_val..next_val);
29                prev_val = next_val;
30            }
31        }
32        Ok(original_num_bytes - data.len())
33    }
34}
35
36/// Range writer. The range are required to partition the
37/// space.
38///
39/// In other words, two consecutive keys `k1` and `k2`
40/// are required to observe
41/// `range_sstable[k1].end == range_sstable[k2].start`.
42///
43/// The writer will panic if the inserted value do not follow
44/// this property.
45///
46/// The first range is not required to start at `0`.
47#[derive(Default)]
48pub struct RangeValueWriter {
49    vals: Vec<u64>,
50}
51
52impl ValueWriter for RangeValueWriter {
53    type Value = Range<u64>;
54
55    fn write(&mut self, val: &Range<u64>) {
56        if let Some(previous_offset) = self.vals.last().copied() {
57            assert_eq!(previous_offset, val.start);
58            self.vals.push(val.end);
59        } else {
60            self.vals.push(val.start);
61            self.vals.push(val.end)
62        }
63    }
64
65    fn serialize_block(&self, writer: &mut Vec<u8>) {
66        let mut prev_val = 0u64;
67        crate::vint::serialize_into_vec(self.vals.len() as u64, writer);
68        for &val in &self.vals {
69            let delta = val - prev_val;
70            crate::vint::serialize_into_vec(delta, writer);
71            prev_val = val;
72        }
73    }
74
75    fn clear(&mut self) {
76        self.vals.clear();
77    }
78}
79
80#[cfg(test)]
81mod tests {
82    use super::*;
83
84    #[test]
85    fn test_range_reader_writer() {
86        crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[]);
87        crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
88            0..3,
89        ]);
90        crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
91            0..3,
92            3..10,
93        ]);
94        crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
95            0..0,
96            0..10,
97        ]);
98        crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
99            100..110,
100            110..121,
101            121..1250,
102        ]);
103    }
104
105    #[test]
106    #[should_panic]
107    fn test_range_reader_writer_panics() {
108        crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
109            1..3,
110            4..10,
111        ]);
112    }
113}