persy/index/
serialization.rs1use 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}