Skip to main content

reifydb_core/key/
shape.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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}