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