reifydb_core/key/
index.rs1use std::collections::Bound;
5
6use reifydb_codec::key::{
7 deserializer::KeyDeserializer,
8 encoded::{EncodedKey, EncodedKeyRange},
9 serializer::KeySerializer,
10};
11
12use super::{EncodableKey, EncodableKeyRange, KeyKind};
13use crate::{
14 interface::catalog::{
15 id::{IndexId, PrimaryKeyId},
16 object::ObjectId,
17 },
18 key::catalog::{KeyDeserializerCatalogExt, KeySerializerCatalogExt},
19};
20
21#[derive(Debug, Clone, PartialEq)]
22pub struct IndexKey {
23 pub object: ObjectId,
24 pub index: IndexId,
25}
26
27impl EncodableKey for IndexKey {
28 const KIND: KeyKind = KeyKind::Index;
29
30 fn encode(&self) -> EncodedKey {
31 let mut serializer = KeySerializer::with_capacity(18);
32 serializer.extend_u8(Self::KIND as u8).extend_object_id(self.object).extend_u64(self.index);
33 serializer.to_encoded_key()
34 }
35
36 fn decode(key: &EncodedKey) -> Option<Self> {
37 let mut de = KeyDeserializer::from_bytes(key.as_slice());
38
39 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
40 if kind != Self::KIND {
41 return None;
42 }
43
44 let object = de.read_object_id().ok()?;
45 let index_value = de.read_u64().ok()?;
46
47 Some(Self {
48 object,
49 index: IndexId::Primary(PrimaryKeyId(index_value)),
50 })
51 }
52}
53
54#[derive(Debug, Clone, PartialEq)]
55pub struct ObjectIndexKeyRange {
56 pub object: ObjectId,
57}
58
59impl ObjectIndexKeyRange {
60 fn decode_key(key: &EncodedKey) -> Option<Self> {
61 let mut de = KeyDeserializer::from_bytes(key.as_slice());
62
63 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
64 if kind != Self::KIND {
65 return None;
66 }
67
68 let object = de.read_object_id().ok()?;
69
70 Some(ObjectIndexKeyRange {
71 object,
72 })
73 }
74}
75
76impl EncodableKeyRange for ObjectIndexKeyRange {
77 const KIND: KeyKind = KeyKind::Index;
78
79 fn start(&self) -> Option<EncodedKey> {
80 let mut serializer = KeySerializer::with_capacity(10);
81 serializer.extend_u8(Self::KIND as u8).extend_object_id(self.object);
82 Some(serializer.to_encoded_key())
83 }
84
85 fn end(&self) -> Option<EncodedKey> {
86 let mut serializer = KeySerializer::with_capacity(10);
87 serializer.extend_u8(Self::KIND as u8).extend_object_id(self.object.prev());
88 Some(serializer.to_encoded_key())
89 }
90
91 fn decode(range: &EncodedKeyRange) -> (Option<Self>, Option<Self>)
92 where
93 Self: Sized,
94 {
95 let start_key = match &range.start {
96 Bound::Included(key) | Bound::Excluded(key) => Self::decode_key(key),
97 Bound::Unbounded => None,
98 };
99
100 let end_key = match &range.end {
101 Bound::Included(key) | Bound::Excluded(key) => Self::decode_key(key),
102 Bound::Unbounded => None,
103 };
104
105 (start_key, end_key)
106 }
107}
108
109impl IndexKey {
110 pub fn encoded(object: impl Into<ObjectId>, index: impl Into<IndexId>) -> EncodedKey {
111 Self {
112 object: object.into(),
113 index: index.into(),
114 }
115 .encode()
116 }
117
118 pub fn full_scan(object: impl Into<ObjectId>) -> EncodedKeyRange {
119 let object = object.into();
120 EncodedKeyRange::start_end(Some(Self::object_start(object)), Some(Self::object_end(object)))
121 }
122
123 pub fn object_start(object: impl Into<ObjectId>) -> EncodedKey {
124 let object = object.into();
125 let mut serializer = KeySerializer::with_capacity(10);
126 serializer.extend_u8(Self::KIND as u8).extend_object_id(object);
127 serializer.to_encoded_key()
128 }
129
130 pub fn object_end(object: impl Into<ObjectId>) -> EncodedKey {
131 let object = object.into();
132 let mut serializer = KeySerializer::with_capacity(10);
133 serializer.extend_u8(Self::KIND as u8).extend_object_id(object.prev());
134 serializer.to_encoded_key()
135 }
136}
137
138#[cfg(test)]
139pub mod tests {
140 use super::{EncodableKey, IndexKey};
141 use crate::interface::catalog::{id::IndexId, object::ObjectId};
142
143 #[test]
144 fn test_encode_decode() {
145 let key = IndexKey {
146 object: ObjectId::table(0xABCD),
147 index: IndexId::primary(0x123456789ABCDEF0u64),
148 };
149 let encoded = key.encode();
150
151 let expected: Vec<u8> = vec![
152 0xF3, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x32, 0xED, 0xCB, 0xA9, 0x87, 0x65, 0x43,
153 0x21, 0x0F,
154 ];
155
156 assert_eq!(encoded.as_slice(), expected);
157
158 let key = IndexKey::decode(&encoded).unwrap();
159 assert_eq!(key.object, 0xABCD);
160 assert_eq!(key.index, 0x123456789ABCDEF0);
161 }
162
163 #[test]
164 fn test_order_preserving() {
165 let key1 = IndexKey {
166 object: ObjectId::table(1),
167 index: IndexId::primary(100),
168 };
169 let key2 = IndexKey {
170 object: ObjectId::table(1),
171 index: IndexId::primary(200),
172 };
173 let key3 = IndexKey {
174 object: ObjectId::table(2),
175 index: IndexId::primary(50),
176 };
177
178 let encoded1 = key1.encode();
179 let encoded2 = key2.encode();
180 let encoded3 = key3.encode();
181
182 assert!(encoded3 < encoded2, "ordering not preserved");
183 assert!(encoded2 < encoded1, "ordering not preserved");
184 }
185}