Skip to main content

reifydb_core/key/
shape.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_codec::{
5	encoded::shape::fingerprint::RowShapeFingerprint,
6	key::{
7		deserializer::KeyDeserializer,
8		encoded::{EncodedKey, EncodedKeyRange},
9		serializer::KeySerializer,
10	},
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::Shape;
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}