Skip to main content

reifydb_core/key/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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		// A view owns its row numbering, so decode must keep the view tag intact.
190		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		// Under a shared kind byte a series key could masquerade as a row number.
202		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		// One kind byte for two layouts is what let a 27-byte series key answer to an 18-byte row read.
222		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}