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