1use reifydb_codec::key::encoded::{EncodedKey, EncodedKeyRange};
5use tag::KeyTag;
6
7pub mod any;
8pub mod bound;
9pub mod catalog;
10pub mod cdc;
11pub mod column;
12pub mod config;
13#[cfg(test)]
14mod cross_kind_order;
15pub mod flow;
16pub mod identity;
17pub mod metric;
18pub mod namespace;
19pub mod operator;
20pub mod operator_settings;
21pub mod output_frontier;
22pub mod partition;
23pub mod procedure;
24pub mod queue;
25pub mod ringbuffer;
26pub mod row;
27pub mod series;
28pub mod sort_run;
29pub mod system;
30pub mod tag;
31pub mod typed;
32
33pub trait KeyRangeCodec {
34 const TAG: KeyTag;
35
36 fn start(&self) -> Option<EncodedKey>;
37
38 fn end(&self) -> Option<EncodedKey>;
39
40 fn decode(range: &EncodedKeyRange) -> (Option<Self>, Option<Self>)
41 where
42 Self: Sized;
43}
44
45#[cfg(test)]
46pub mod tests {
47 use reifydb_value::value::{row_number::RowNumber, sumtype::SumTypeId};
48
49 use crate::{
50 interface::catalog::{
51 flow::OperatorId,
52 id::{ColumnId, ColumnPropertyId, IndexId, NamespaceId, RelationshipId, SequenceId, TableId},
53 object::ObjectId,
54 storage::StorageId,
55 },
56 key::{
57 catalog::{ColumnPropertyKey, IndexKey, RelationshipKey, SumTypeKey, TableKey},
58 column::{ColumnKey, ColumnSequenceKey, ColumnsKey},
59 namespace::{NamespaceKey, NamespaceSumTypeKey, NamespaceTableKey},
60 operator::state::{GroupId, KeyspaceId, OperatorStateKey},
61 row::{RowKey, RowSequenceKey},
62 series::SeriesRowKey,
63 system::{SystemSequenceKey, TransactionVersionKey},
64 },
65 };
66
67 #[test]
68 fn test_table_columns() {
69 let key = ColumnsKey {
70 column: ColumnId(42),
71 };
72
73 let encoded = key.encode();
74 let decoded = ColumnsKey::decode(&encoded).expect("Failed to decode key");
75 assert_eq!(decoded.column, 42);
76 }
77
78 #[test]
79 fn test_column() {
80 let key = ColumnKey {
81 object: ObjectId::table(1),
82 column: ColumnId(42),
83 };
84
85 let encoded = key.encode();
86 let decoded = ColumnKey::decode(&encoded).expect("Failed to decode key");
87 assert_eq!(decoded.object, ObjectId::table(1));
88 assert_eq!(decoded.column, 42);
89 }
90
91 #[test]
92 fn test_column_property() {
93 let key = ColumnPropertyKey {
94 column: ColumnId(42),
95 property: ColumnPropertyId(999_999),
96 };
97
98 let encoded = key.encode();
99 let decoded = ColumnPropertyKey::decode(&encoded).expect("Failed to decode key");
100 assert_eq!(decoded.column, 42);
101 assert_eq!(decoded.property, 999_999);
102 }
103
104 #[test]
105 fn test_namespace() {
106 let key = NamespaceKey {
107 namespace: NamespaceId(42),
108 };
109
110 let encoded = key.encode();
111 let decoded = NamespaceKey::decode(&encoded).expect("Failed to decode key");
112 assert_eq!(decoded.namespace, 42);
113 }
114
115 #[test]
116 fn test_namespace_table() {
117 let key = NamespaceTableKey {
118 namespace: NamespaceId(42),
119 table: TableId(999_999),
120 };
121
122 let encoded = key.encode();
123 let decoded = NamespaceTableKey::decode(&encoded).expect("Failed to decode key");
124 assert_eq!(decoded.namespace, 42);
125 assert_eq!(decoded.table, 999_999);
126 }
127
128 #[test]
129 fn test_system_sequence() {
130 let key = SystemSequenceKey {
131 sequence: SequenceId(42),
132 };
133
134 let encoded = key.encode();
135 let decoded = SystemSequenceKey::decode(&encoded).expect("Failed to decode key");
136 assert_eq!(decoded.sequence, 42);
137 }
138
139 #[test]
140 fn test_table() {
141 let key = TableKey {
142 table: TableId(42),
143 };
144
145 let encoded = key.encode();
146 let decoded = TableKey::decode(&encoded).expect("Failed to decode key");
147 assert_eq!(decoded.table, 42);
148 }
149
150 #[test]
151 fn test_index() {
152 let key = IndexKey {
153 object: ObjectId::table(42),
154 index: IndexId::primary(999_999),
155 };
156
157 let encoded = key.encode();
158 let decoded = IndexKey::decode(&encoded).expect("Failed to decode key");
159 assert_eq!(decoded.object, ObjectId::table(42));
160 assert_eq!(decoded.index, 999_999);
161 }
162
163 #[test]
164 fn test_row() {
165 let key = RowKey {
166 storage: StorageId::table(42),
167 row: RowNumber(999_999),
168 };
169
170 let encoded = key.encode();
171 let decoded = RowKey::decode(&encoded).expect("Failed to decode key");
172 assert_eq!(decoded.storage, StorageId::table(42));
173 assert_eq!(decoded.row, 999_999);
174 }
175
176 #[test]
177 fn test_row_sequence() {
178 let key = RowSequenceKey {
179 storage: StorageId::table(42),
180 };
181
182 let encoded = key.encode();
183 let decoded = RowSequenceKey::decode(&encoded).expect("Failed to decode key");
184 assert_eq!(decoded.storage, StorageId::table(42));
185 }
186
187 #[test]
188 fn test_row_sequence_view() {
189 let key = RowSequenceKey {
191 storage: StorageId::view(42),
192 };
193
194 let encoded = key.encode();
195 let decoded = RowSequenceKey::decode(&encoded).expect("Failed to decode key");
196 assert_eq!(decoded.storage, StorageId::view(42));
197 }
198
199 #[test]
200 fn test_series_row_does_not_dispatch_to_the_row_decoder() {
201 let key = SeriesRowKey {
203 storage: StorageId::series(42),
204 variant_tag: None,
205 key: 1_706_745_600_000,
206 sequence: 3,
207 };
208
209 let encoded = key.encode();
210 let decoded = SeriesRowKey::decode(&encoded).expect("Failed to decode key");
211 assert_eq!(decoded.storage, StorageId::series(42));
212 assert_eq!(decoded.variant_tag, None);
213 assert_eq!(decoded.key, 1_706_745_600_000);
214 assert_eq!(decoded.sequence, 3);
215
216 assert!(RowKey::decode(&encoded).is_none(), "the row decoder must reject the series layout outright");
217 }
218
219 #[test]
220 fn test_series_row_and_row_keyspaces_do_not_overlap() {
221 let series = SeriesRowKey {
223 storage: StorageId::series(1),
224 variant_tag: Some(2),
225 key: 7,
226 sequence: 9,
227 }
228 .encode();
229 let row = RowKey {
230 storage: StorageId::table(1),
231 row: RowNumber(7),
232 }
233 .encode();
234
235 assert_ne!(series.as_slice()[0], row.as_slice()[0]);
236 assert!(SeriesRowKey::decode(&row).is_none());
237 }
238
239 #[test]
240 fn test_column_sequence() {
241 let key = ColumnSequenceKey {
242 object: ObjectId::table(42),
243 column: ColumnId(123),
244 };
245
246 let encoded = key.encode();
247 let decoded = ColumnSequenceKey::decode(&encoded).expect("Failed to decode key");
248 assert_eq!(decoded.object, ObjectId::table(42));
249 assert_eq!(decoded.column, 123);
250 }
251
252 #[test]
253 fn test_transaction_version() {
254 let key = TransactionVersionKey {};
255 let encoded = key.encode();
256 TransactionVersionKey::decode(&encoded).expect("Failed to decode key");
257 }
258
259 #[test]
260 fn test_operator_state() {
261 let key = OperatorStateKey {
262 operator: OperatorId(0xCAFEBABE),
263 group: GroupId::ROOT,
264 keyspace: KeyspaceId::CUSTOM_NOT_CACHED,
265 suffix: vec![1, 2, 3],
266 };
267
268 let encoded = key.encode();
269 let decoded = OperatorStateKey::decode(&encoded).expect("Failed to decode key");
270 assert_eq!(decoded.operator, 0xCAFEBABE);
271 assert_eq!(decoded.suffix, vec![1, 2, 3]);
272 }
273
274 #[test]
275 fn test_sumtype_key() {
276 let key = SumTypeKey {
277 sumtype: SumTypeId(42),
278 };
279
280 let encoded = key.encode();
281 let decoded = SumTypeKey::decode(&encoded).expect("Failed to decode key");
282 assert_eq!(decoded.sumtype, 42);
283 }
284
285 #[test]
286 fn test_relationship() {
287 let key = RelationshipKey {
288 relationship: RelationshipId(42),
289 };
290
291 let encoded = key.encode();
292 let decoded = RelationshipKey::decode(&encoded).expect("Failed to decode key");
293 assert_eq!(decoded.relationship, 42);
294 }
295
296 #[test]
297 fn test_namespace_sumtype_key() {
298 let key = NamespaceSumTypeKey {
299 namespace: NamespaceId(42),
300 sumtype: SumTypeId(999_999),
301 };
302
303 let encoded = key.encode();
304 let decoded = NamespaceSumTypeKey::decode(&encoded).expect("Failed to decode key");
305 assert_eq!(decoded.namespace, 42);
306 assert_eq!(decoded.sumtype, 999_999);
307 }
308}