persy/index/
serialization.rs

1use crate::{
2    id::{PersyId, RecRef},
3    index::{
4        bytevec::ByteVec,
5        string_wrapper::StringWrapper,
6        tree::nodes::{Leaf, LeafEntry, Node, TreeNode, TreeNodeRef, Value},
7    },
8    util::io::{
9        ArcSliceRead, InfallibleRead, InfallibleReadFormat, InfallibleReadVarInt, InfallibleWrite,
10        InfallibleWriteFormat, InfallibleWriteVarInt,
11    },
12};
13
14pub trait IndexSerialization: Sized {
15    fn serialize(&self, buffer: &mut dyn InfallibleWrite);
16    fn deserialize(value: &mut dyn InfallibleRead) -> Self;
17}
18
19pub fn reuse_deserialize<K: IndexSerialization, V: IndexSerialization>(
20    mut value: ArcSliceRead,
21    nodes: Option<Node<K>>,
22) -> TreeNode<K, V> {
23    let version = value.read_u8();
24    match version {
25        0u8 => deserialize_v0(value, nodes),
26        _ => panic!("not compatible disk version"),
27    }
28}
29
30pub fn deserialize<K: IndexSerialization, V: IndexSerialization>(value: ArcSliceRead) -> TreeNode<K, V> {
31    reuse_deserialize(value, None)
32}
33fn destruct_reuse<K>(reuse: Option<Node<K>>) -> (Option<Vec<K>>, Option<Vec<RecRef>>) {
34    if let Some(Node {
35        mut keys, mut pointers, ..
36    }) = reuse
37    {
38        keys.clear();
39        pointers.clear();
40        (Some(keys), Some(pointers))
41    } else {
42        (None, None)
43    }
44}
45
46pub fn deserialize_v0<K: IndexSerialization, V: IndexSerialization>(
47    mut reader: ArcSliceRead,
48    reuse: Option<Node<K>>,
49) -> TreeNode<K, V> {
50    let t = reader.read_varint_u8();
51    match t {
52        1 => {
53            let prev = if reader.read_varint_u8() == 1 {
54                Some(K::deserialize(&mut reader))
55            } else {
56                None
57            };
58            let size = reader.read_varint_u32();
59            let mut entries = Vec::with_capacity(size as usize);
60            for _ in 0..size {
61                let key = K::deserialize(&mut reader);
62                let value_type = reader.read_varint_u8();
63                if value_type == 1 {
64                    let val_size = reader.read_varint_u32();
65                    let mut value = Vec::with_capacity(val_size as usize);
66                    for _ in 0..val_size {
67                        value.push(V::deserialize(&mut reader));
68                    }
69                    entries.push(LeafEntry {
70                        key,
71                        value: Value::Cluster(value),
72                    });
73                } else {
74                    let value = V::deserialize(&mut reader);
75                    entries.push(LeafEntry {
76                        key,
77                        value: Value::Single(value),
78                    });
79                }
80            }
81            let next = if reader.read_varint_u8() == 1 {
82                Some(K::deserialize(&mut reader))
83            } else {
84                None
85            };
86            TreeNode::Leaf(Leaf { entries, prev, next })
87        }
88        2 => {
89            let (reuse_keys, reuse_pointers) = destruct_reuse(reuse);
90            let prev = if reader.read_varint_u8() == 1 {
91                Some(K::deserialize(&mut reader))
92            } else {
93                None
94            };
95            let size = reader.read_varint_u32();
96            let mut keys = reuse_keys.unwrap_or_else(|| Vec::with_capacity(size as usize));
97            for _ in 0..size {
98                let key = K::deserialize(&mut reader);
99                keys.push(key);
100            }
101            let size = reader.read_varint_u32();
102            let mut pointers = reuse_pointers.unwrap_or_else(|| Vec::with_capacity(size as usize));
103            for _ in 0..size {
104                let page = reader.read_varint_u64();
105                let pos = reader.read_varint_u32();
106                pointers.push(RecRef::new(page, pos));
107            }
108            let next = if reader.read_varint_u8() == 1 {
109                Some(K::deserialize(&mut reader))
110            } else {
111                None
112            };
113            TreeNode::Node(Node {
114                keys,
115                pointers,
116                prev,
117                next,
118            })
119        }
120        _ => panic!("error on index node deserialization"),
121    }
122}
123
124pub fn serialize<K: IndexSerialization, V: IndexSerialization>(node: &TreeNode<K, V>) -> Vec<u8> {
125    let mut dest = Vec::new();
126    dest.push(0u8);
127    serialize_v0(node, &mut dest);
128    dest
129}
130pub fn serialize_v0<K: IndexSerialization, V: IndexSerialization>(
131    node: &TreeNode<K, V>,
132    dest: &mut dyn InfallibleWrite,
133) {
134    let write_page_and_pos = |dest: &mut dyn InfallibleWrite, page, pos| {
135        dest.write_varint_u64(page);
136        dest.write_varint_u32(pos);
137    };
138
139    let write_opt_leafptr = |dest: &mut dyn InfallibleWrite, x: Option<&TreeNodeRef>| {
140        if let Some(y) = x {
141            write_page_and_pos(dest, y.page, y.pos);
142        } else {
143            write_page_and_pos(dest, 0, 0);
144        }
145    };
146
147    match node {
148        TreeNode::Leaf(leaf) => {
149            dest.write_varint_u8(1);
150            if let Some(pk) = &leaf.prev {
151                dest.write_varint_u8(1);
152                pk.serialize(dest);
153            } else {
154                dest.write_varint_u8(0);
155            }
156            dest.write_varint_u32(leaf.entries.len() as u32);
157            for entry in &leaf.entries {
158                entry.key.serialize(dest);
159                match &entry.value {
160                    Value::Cluster(cluster) => {
161                        dest.write_varint_u8(1);
162                        dest.write_varint_u32(cluster.len() as u32);
163                        for val in cluster {
164                            val.serialize(dest);
165                        }
166                    }
167                    Value::Single(val) => {
168                        dest.write_varint_u8(2);
169                        val.serialize(dest);
170                    }
171                }
172            }
173            if let Some(pk) = &leaf.next {
174                dest.write_varint_u8(1);
175                pk.serialize(dest);
176            } else {
177                dest.write_varint_u8(0);
178            }
179        }
180        TreeNode::Node(node) => {
181            dest.write_varint_u8(2);
182            if let Some(pk) = &node.prev {
183                dest.write_varint_u8(1);
184                pk.serialize(dest);
185            } else {
186                dest.write_varint_u8(0);
187            }
188            dest.write_varint_u32(node.keys.len() as u32);
189            for k in &node.keys {
190                k.serialize(dest);
191            }
192            dest.write_varint_u32(node.pointers.len() as u32);
193            for p in &node.pointers {
194                write_opt_leafptr(dest, Some(p));
195            }
196            if let Some(pk) = &node.next {
197                dest.write_varint_u8(1);
198                pk.serialize(dest);
199            } else {
200                dest.write_varint_u8(0);
201            }
202        }
203    }
204}
205
206impl IndexSerialization for u8 {
207    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
208        buffer.write_varint_u8(*self);
209    }
210    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
211        value.read_varint_u8()
212    }
213}
214
215impl IndexSerialization for u16 {
216    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
217        buffer.write_varint_u16(*self);
218    }
219    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
220        value.read_varint_u16()
221    }
222}
223
224impl IndexSerialization for u32 {
225    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
226        buffer.write_varint_u32(*self);
227    }
228    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
229        value.read_varint_u32()
230    }
231}
232
233impl IndexSerialization for u64 {
234    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
235        buffer.write_varint_u64(*self);
236    }
237    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
238        value.read_varint_u64()
239    }
240}
241
242impl IndexSerialization for u128 {
243    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
244        buffer.write_varint_u128(*self);
245    }
246    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
247        value.read_varint_u128()
248    }
249}
250
251impl IndexSerialization for i8 {
252    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
253        buffer.write_varint_i8(*self);
254    }
255    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
256        value.read_varint_i8()
257    }
258}
259
260impl IndexSerialization for i16 {
261    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
262        buffer.write_varint_i16(*self);
263    }
264    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
265        value.read_varint_i16()
266    }
267}
268
269impl IndexSerialization for i32 {
270    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
271        buffer.write_varint_i32(*self);
272    }
273    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
274        value.read_varint_i32()
275    }
276}
277
278impl IndexSerialization for i64 {
279    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
280        buffer.write_varint_i64(*self);
281    }
282    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
283        value.read_varint_i64()
284    }
285}
286
287impl IndexSerialization for i128 {
288    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
289        buffer.write_varint_i128(*self);
290    }
291    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
292        value.read_varint_i128()
293    }
294}
295
296impl IndexSerialization for f32 {
297    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
298        buffer.write_f32(*self);
299    }
300    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
301        value.read_f32()
302    }
303}
304
305impl IndexSerialization for f64 {
306    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
307        buffer.write_f64(*self);
308    }
309    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
310        value.read_f64()
311    }
312}
313
314impl IndexSerialization for PersyId {
315    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
316        buffer.write_varint_u64(self.0.page);
317        buffer.write_varint_u32(self.0.pos);
318    }
319    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
320        let page = value.read_varint_u64();
321        let pos = value.read_varint_u32();
322        PersyId(RecRef::new(page, pos))
323    }
324}
325
326impl IndexSerialization for StringWrapper {
327    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
328        buffer.write_varint_u32(self.len() as u32);
329        buffer.write_all(self.slice());
330    }
331    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
332        let vec_size = value.read_varint_u32();
333        value.read_slice(vec_size as usize).to_string_wrapper()
334    }
335}
336
337impl IndexSerialization for ByteVec {
338    fn serialize(&self, buffer: &mut dyn InfallibleWrite) {
339        buffer.write_varint_u32(self.len() as u32);
340        buffer.write_all(self);
341    }
342    fn deserialize(value: &mut dyn InfallibleRead) -> Self {
343        let vec_size = value.read_varint_u32();
344        value.read_slice(vec_size as usize).to_byte_vec()
345    }
346}