reifydb_core/key/
row_shape.rs1use reifydb_codec::{
5 key::{
6 deserializer::KeyDeserializer,
7 encoded::{EncodedKey, EncodedKeyRange},
8 serializer::KeySerializer,
9 },
10 row::shape::fingerprint::RowShapeFingerprint,
11};
12
13use super::{EncodableKey, KeyKind};
14
15#[derive(Debug, Clone, PartialEq)]
16pub struct RowShapeKey {
17 pub fingerprint: RowShapeFingerprint,
18}
19
20impl EncodableKey for RowShapeKey {
21 const KIND: KeyKind = KeyKind::RowShape;
22
23 fn encode(&self) -> EncodedKey {
24 let mut serializer = KeySerializer::with_capacity(9);
25 serializer.extend_u8(Self::KIND as u8).extend_u64(self.fingerprint.as_u64());
26 serializer.to_encoded_key()
27 }
28
29 fn decode(key: &EncodedKey) -> Option<Self> {
30 let mut de = KeyDeserializer::from_bytes(key.as_slice());
31
32 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
33 if kind != Self::KIND {
34 return None;
35 }
36
37 let fingerprint = de.read_u64().ok()?;
38
39 Some(Self {
40 fingerprint: RowShapeFingerprint::new(fingerprint),
41 })
42 }
43}
44
45impl RowShapeKey {
46 pub fn encoded(fingerprint: RowShapeFingerprint) -> EncodedKey {
47 Self {
48 fingerprint,
49 }
50 .encode()
51 }
52
53 pub fn full_scan() -> EncodedKeyRange {
54 EncodedKeyRange::start_end(Some(Self::scan_start()), Some(Self::scan_end()))
55 }
56
57 fn scan_start() -> EncodedKey {
58 let mut serializer = KeySerializer::with_capacity(1);
59 serializer.extend_u8(Self::KIND as u8);
60 serializer.to_encoded_key()
61 }
62
63 fn scan_end() -> EncodedKey {
64 let mut serializer = KeySerializer::with_capacity(1);
65 serializer.extend_u8(Self::KIND as u8 - 1);
66 serializer.to_encoded_key()
67 }
68}
69
70#[derive(Debug, Clone, PartialEq)]
71pub struct RowShapeFieldKey {
72 pub shape_fingerprint: RowShapeFingerprint,
73 pub field_index: u16,
74}
75
76impl EncodableKey for RowShapeFieldKey {
77 const KIND: KeyKind = KeyKind::RowShapeField;
78
79 fn encode(&self) -> EncodedKey {
80 let mut serializer = KeySerializer::with_capacity(10);
81 serializer
82 .extend_u8(Self::KIND as u8)
83 .extend_u64(self.shape_fingerprint.as_u64())
84 .extend_u16(self.field_index);
85 serializer.to_encoded_key()
86 }
87
88 fn decode(key: &EncodedKey) -> Option<Self> {
89 let mut de = KeyDeserializer::from_bytes(key.as_slice());
90
91 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
92 if kind != Self::KIND {
93 return None;
94 }
95
96 let shape_fingerprint = de.read_u64().ok()?;
97 let field_index = de.read_u16().ok()?;
98
99 Some(Self {
100 shape_fingerprint: RowShapeFingerprint::new(shape_fingerprint),
101 field_index,
102 })
103 }
104}
105
106impl RowShapeFieldKey {
107 pub fn encoded(shape_fingerprint: RowShapeFingerprint, field_index: u16) -> EncodedKey {
108 Self {
109 shape_fingerprint,
110 field_index,
111 }
112 .encode()
113 }
114
115 pub fn scan_for_shape(fingerprint: RowShapeFingerprint) -> EncodedKeyRange {
116 EncodedKeyRange::start_end(Some(Self::shape_start(fingerprint)), Some(Self::shape_end(fingerprint)))
117 }
118
119 fn shape_start(fingerprint: RowShapeFingerprint) -> EncodedKey {
120 let mut serializer = KeySerializer::with_capacity(9);
121 serializer.extend_u8(Self::KIND as u8).extend_u64(fingerprint.as_u64());
122 serializer.to_encoded_key()
123 }
124
125 fn shape_end(fingerprint: RowShapeFingerprint) -> EncodedKey {
126 let mut serializer = KeySerializer::with_capacity(10);
127 serializer.extend_u8(Self::KIND as u8).extend_u64(fingerprint.as_u64()).extend_u8(0xFF);
128 serializer.to_encoded_key()
129 }
130}
131
132#[cfg(test)]
133mod tests {
134 use super::*;
135
136 #[test]
137 fn test_shape_key_encode_decode() {
138 let key = RowShapeKey {
139 fingerprint: RowShapeFingerprint::new(0xDEADBEEFCAFEBABE),
140 };
141 let encoded = key.encode();
142 let decoded = RowShapeKey::decode(&encoded).unwrap();
143 assert_eq!(decoded.fingerprint, RowShapeFingerprint::new(0xDEADBEEFCAFEBABE));
144 }
145
146 #[test]
147 fn test_shape_field_key_encode_decode() {
148 let key = RowShapeFieldKey {
149 shape_fingerprint: RowShapeFingerprint::new(0x1234567890ABCDEF),
150 field_index: 42,
151 };
152 let encoded = key.encode();
153 let decoded = RowShapeFieldKey::decode(&encoded).unwrap();
154 assert_eq!(decoded.shape_fingerprint, RowShapeFingerprint::new(0x1234567890ABCDEF));
155 assert_eq!(decoded.field_index, 42);
156 }
157}