Skip to main content

reifydb_core/key/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use authentication::AuthenticationKey;
5use binding::BindingKey;
6use cdc_consumer::CdcConsumerKey;
7use column::ColumnKey;
8use column_sequence::ColumnSequenceKey;
9use column_snapshot::{ColumnSnapshotKey, SeriesColumnSnapshotKey, TableColumnSnapshotKey};
10use columns::ColumnsKey;
11use dictionary::{DictionaryEntryIndexKey, DictionaryEntryKey, DictionaryKey};
12use flow::FlowKey;
13use flow_node_internal_state::FlowNodeInternalStateKey;
14use flow_node_state::FlowNodeStateKey;
15use granted_role::GrantedRoleKey;
16use handler::HandlerKey;
17use identity::IdentityKey;
18use identity_attribute::IdentityAttributeKey;
19use identity_attribute_value::IdentityAttributeValueKey;
20use index::IndexKey;
21use index_entry::IndexEntryKey;
22use kind::KeyKind;
23use namespace::NamespaceKey;
24use namespace_binding::NamespaceBindingKey;
25use namespace_dictionary::NamespaceDictionaryKey;
26use namespace_flow::NamespaceFlowKey;
27use namespace_handler::NamespaceHandlerKey;
28use namespace_procedure::NamespaceProcedureKey;
29use namespace_ringbuffer::NamespaceRingBufferKey;
30use namespace_series::NamespaceSeriesKey;
31use namespace_sink::NamespaceSinkKey;
32use namespace_source::NamespaceSourceKey;
33use namespace_sumtype::NamespaceSumTypeKey;
34use namespace_table::NamespaceTableKey;
35use namespace_view::NamespaceViewKey;
36use partition::PartitionKey;
37use partitioned_row::PartitionedRowKey;
38use policy::PolicyKey;
39use policy_op::PolicyOpKey;
40use primary_key::PrimaryKeyKey;
41use procedure::ProcedureKey;
42use procedure_param::ProcedureParamKey;
43use property::ColumnPropertyKey;
44use reifydb_codec::{
45	key as keycode,
46	key::encoded::{EncodedKey, EncodedKeyRange},
47};
48use retention_strategy::{OperatorRetentionStrategyKey, ShapeRetentionStrategyKey};
49use ringbuffer::{RingBufferKey, RingBufferMetadataKey};
50use role::RoleKey;
51use row::RowKey;
52use row_sequence::RowSequenceKey;
53use series::{SeriesKey, SeriesMetadataKey};
54use sink::SinkKey;
55use source::SourceKey;
56use sumtype::SumTypeKey;
57use system_sequence::SystemSequenceKey;
58use system_version::SystemVersionKey;
59use table::TableKey;
60use token::TokenKey;
61use transaction_version::TransactionVersionKey;
62use version_epoch::VersionEpochKey;
63use view::ViewKey;
64
65pub mod authentication;
66pub mod binding;
67pub mod catalog;
68pub mod cdc_consumer;
69pub mod cdc_exclude;
70pub mod column;
71pub mod column_sequence;
72pub mod column_snapshot;
73pub mod columns;
74pub mod config;
75pub mod dictionary;
76pub mod flow;
77pub mod flow_edge;
78pub mod flow_node;
79pub mod flow_node_internal_state;
80pub mod flow_node_state;
81pub mod flow_version;
82pub mod granted_role;
83pub mod handler;
84pub mod identity;
85pub mod identity_attribute;
86pub mod identity_attribute_value;
87pub mod index;
88pub mod index_entry;
89pub mod kind;
90pub mod migration;
91pub mod migration_event;
92pub mod namespace;
93pub mod namespace_binding;
94pub mod namespace_dictionary;
95pub mod namespace_flow;
96pub mod namespace_handler;
97pub mod namespace_procedure;
98pub mod namespace_ringbuffer;
99pub mod namespace_series;
100pub mod namespace_sink;
101pub mod namespace_source;
102pub mod namespace_sumtype;
103pub mod namespace_table;
104pub mod namespace_view;
105pub mod operator_settings;
106pub mod partition;
107pub mod partitioned_row;
108pub mod policy;
109pub mod policy_op;
110pub mod primary_key;
111pub mod procedure;
112pub mod procedure_param;
113pub mod property;
114pub mod retention_strategy;
115pub mod ringbuffer;
116pub mod role;
117pub mod row;
118pub mod row_sequence;
119pub mod row_settings;
120pub mod series;
121pub mod series_row;
122pub mod shape;
123pub mod sink;
124pub mod source;
125pub mod sumtype;
126pub mod system_sequence;
127pub mod system_version;
128pub mod table;
129pub mod token;
130pub mod transaction_version;
131pub mod variant_handler;
132pub mod version_epoch;
133pub mod view;
134#[derive(Debug)]
135pub enum Key {
136	CdcConsumer(CdcConsumerKey),
137	Namespace(NamespaceKey),
138	NamespaceTable(NamespaceTableKey),
139	NamespaceView(NamespaceViewKey),
140	NamespaceFlow(NamespaceFlowKey),
141	SystemSequence(SystemSequenceKey),
142	Table(TableKey),
143	Flow(FlowKey),
144	Column(ColumnKey),
145	Columns(ColumnsKey),
146	Index(IndexKey),
147	IndexEntry(IndexEntryKey),
148	FlowNodeState(FlowNodeStateKey),
149	FlowNodeInternalState(FlowNodeInternalStateKey),
150	PrimaryKey(PrimaryKeyKey),
151	Row(RowKey),
152	PartitionedRow(PartitionedRowKey),
153	Partition(PartitionKey),
154	RowSequence(RowSequenceKey),
155	TableColumnSequence(ColumnSequenceKey),
156	TableColumnProperty(ColumnPropertyKey),
157	SystemVersion(SystemVersionKey),
158	TransactionVersion(TransactionVersionKey),
159	VersionEpoch(VersionEpochKey),
160	View(ViewKey),
161	RingBuffer(RingBufferKey),
162	RingBufferMetadata(RingBufferMetadataKey),
163	NamespaceRingBuffer(NamespaceRingBufferKey),
164	ShapeRetentionStrategy(ShapeRetentionStrategyKey),
165	OperatorRetentionStrategy(OperatorRetentionStrategyKey),
166	Dictionary(DictionaryKey),
167	DictionaryEntry(DictionaryEntryKey),
168	DictionaryEntryIndex(DictionaryEntryIndexKey),
169	NamespaceDictionary(NamespaceDictionaryKey),
170	SumType(SumTypeKey),
171	NamespaceSumType(NamespaceSumTypeKey),
172	Handler(HandlerKey),
173	NamespaceHandler(NamespaceHandlerKey),
174	Series(SeriesKey),
175	SeriesMetadata(SeriesMetadataKey),
176	NamespaceSeries(NamespaceSeriesKey),
177	Identity(IdentityKey),
178	IdentityAttribute(IdentityAttributeKey),
179	IdentityAttributeValue(IdentityAttributeValueKey),
180	Authentication(AuthenticationKey),
181	Role(RoleKey),
182	GrantedRole(GrantedRoleKey),
183	Policy(PolicyKey),
184	PolicyOp(PolicyOpKey),
185	Token(TokenKey),
186	Source(SourceKey),
187	NamespaceSource(NamespaceSourceKey),
188	Sink(SinkKey),
189	NamespaceSink(NamespaceSinkKey),
190	Procedure(ProcedureKey),
191	NamespaceProcedure(NamespaceProcedureKey),
192	ProcedureParam(ProcedureParamKey),
193	Binding(BindingKey),
194	NamespaceBinding(NamespaceBindingKey),
195	ColumnSnapshot(ColumnSnapshotKey),
196	SeriesColumnSnapshot(SeriesColumnSnapshotKey),
197	TableColumnSnapshot(TableColumnSnapshotKey),
198}
199
200impl Key {
201	pub fn encode(&self) -> EncodedKey {
202		match &self {
203			Key::CdcConsumer(key) => key.encode(),
204			Key::Namespace(key) => key.encode(),
205			Key::NamespaceTable(key) => key.encode(),
206			Key::NamespaceView(key) => key.encode(),
207			Key::NamespaceFlow(key) => key.encode(),
208			Key::Table(key) => key.encode(),
209			Key::Flow(key) => key.encode(),
210			Key::Column(key) => key.encode(),
211			Key::Columns(key) => key.encode(),
212			Key::TableColumnProperty(key) => key.encode(),
213			Key::Index(key) => key.encode(),
214			Key::IndexEntry(key) => key.encode(),
215			Key::FlowNodeState(key) => key.encode(),
216			Key::FlowNodeInternalState(key) => key.encode(),
217			Key::PrimaryKey(key) => key.encode(),
218			Key::Row(key) => key.encode(),
219			Key::PartitionedRow(key) => key.encode(),
220			Key::Partition(key) => key.encode(),
221			Key::RowSequence(key) => key.encode(),
222			Key::TableColumnSequence(key) => key.encode(),
223			Key::SystemSequence(key) => key.encode(),
224			Key::SystemVersion(key) => key.encode(),
225			Key::TransactionVersion(key) => key.encode(),
226			Key::VersionEpoch(key) => key.encode(),
227			Key::View(key) => key.encode(),
228			Key::RingBuffer(key) => key.encode(),
229			Key::RingBufferMetadata(key) => key.encode(),
230			Key::NamespaceRingBuffer(key) => key.encode(),
231			Key::ShapeRetentionStrategy(key) => key.encode(),
232			Key::OperatorRetentionStrategy(key) => key.encode(),
233			Key::Dictionary(key) => key.encode(),
234			Key::DictionaryEntry(key) => key.encode(),
235			Key::DictionaryEntryIndex(key) => key.encode(),
236			Key::NamespaceDictionary(key) => key.encode(),
237			Key::SumType(key) => key.encode(),
238			Key::NamespaceSumType(key) => key.encode(),
239			Key::Handler(key) => key.encode(),
240			Key::NamespaceHandler(key) => key.encode(),
241			Key::Series(key) => key.encode(),
242			Key::SeriesMetadata(key) => key.encode(),
243			Key::NamespaceSeries(key) => key.encode(),
244			Key::Identity(key) => key.encode(),
245			Key::IdentityAttribute(key) => key.encode(),
246			Key::IdentityAttributeValue(key) => key.encode(),
247			Key::Authentication(key) => key.encode(),
248			Key::Role(key) => key.encode(),
249			Key::GrantedRole(key) => key.encode(),
250			Key::Policy(key) => key.encode(),
251			Key::PolicyOp(key) => key.encode(),
252			Key::Token(key) => key.encode(),
253			Key::Source(key) => key.encode(),
254			Key::NamespaceSource(key) => key.encode(),
255			Key::Sink(key) => key.encode(),
256			Key::NamespaceSink(key) => key.encode(),
257			Key::Procedure(key) => key.encode(),
258			Key::NamespaceProcedure(key) => key.encode(),
259			Key::ProcedureParam(key) => key.encode(),
260			Key::Binding(key) => key.encode(),
261			Key::NamespaceBinding(key) => key.encode(),
262			Key::ColumnSnapshot(key) => key.encode(),
263			Key::SeriesColumnSnapshot(key) => key.encode(),
264			Key::TableColumnSnapshot(key) => key.encode(),
265		}
266	}
267}
268
269pub trait EncodableKey {
270	const KIND: KeyKind;
271
272	fn encode(&self) -> EncodedKey;
273
274	fn decode(key: &EncodedKey) -> Option<Self>
275	where
276		Self: Sized;
277}
278
279pub trait EncodableKeyRange {
280	const KIND: KeyKind;
281
282	fn start(&self) -> Option<EncodedKey>;
283
284	fn end(&self) -> Option<EncodedKey>;
285
286	fn decode(range: &EncodedKeyRange) -> (Option<Self>, Option<Self>)
287	where
288		Self: Sized;
289}
290
291impl Key {
292	pub fn kind(key: impl AsRef<[u8]>) -> Option<KeyKind> {
293		let key = key.as_ref();
294		if key.is_empty() {
295			return None;
296		}
297
298		keycode::deserialize(&key[0..1]).ok()
299	}
300
301	pub fn decode(key: &EncodedKey) -> Option<Self> {
302		if key.is_empty() {
303			return None;
304		}
305
306		let kind: KeyKind = keycode::deserialize(&key[0..1]).ok()?;
307		match kind {
308			KeyKind::CdcConsumer => CdcConsumerKey::decode(key).map(Self::CdcConsumer),
309			KeyKind::Columns => ColumnsKey::decode(key).map(Self::Columns),
310			KeyKind::ColumnProperty => ColumnPropertyKey::decode(key).map(Self::TableColumnProperty),
311			KeyKind::Namespace => NamespaceKey::decode(key).map(Self::Namespace),
312			KeyKind::NamespaceTable => NamespaceTableKey::decode(key).map(Self::NamespaceTable),
313			KeyKind::NamespaceView => NamespaceViewKey::decode(key).map(Self::NamespaceView),
314			KeyKind::NamespaceFlow => NamespaceFlowKey::decode(key).map(Self::NamespaceFlow),
315			KeyKind::Table => TableKey::decode(key).map(Self::Table),
316			KeyKind::Flow => FlowKey::decode(key).map(Self::Flow),
317			KeyKind::Column => ColumnKey::decode(key).map(Self::Column),
318			KeyKind::Index => IndexKey::decode(key).map(Self::Index),
319			KeyKind::IndexEntry => IndexEntryKey::decode(key).map(Self::IndexEntry),
320			KeyKind::FlowNodeState => FlowNodeStateKey::decode(key).map(Self::FlowNodeState),
321			KeyKind::FlowNodeInternalState => {
322				FlowNodeInternalStateKey::decode(key).map(Self::FlowNodeInternalState)
323			}
324			KeyKind::Row => RowKey::decode(key).map(Self::Row),
325			KeyKind::PartitionedRow => PartitionedRowKey::decode(key).map(Self::PartitionedRow),
326			KeyKind::Partition => PartitionKey::decode(key).map(Self::Partition),
327			KeyKind::RowSequence => RowSequenceKey::decode(key).map(Self::RowSequence),
328			KeyKind::ColumnSequence => ColumnSequenceKey::decode(key).map(Self::TableColumnSequence),
329			KeyKind::SystemSequence => SystemSequenceKey::decode(key).map(Self::SystemSequence),
330			KeyKind::SystemVersion => SystemVersionKey::decode(key).map(Self::SystemVersion),
331			KeyKind::TransactionVersion => TransactionVersionKey::decode(key).map(Self::TransactionVersion),
332			KeyKind::VersionEpoch => VersionEpochKey::decode(key).map(Self::VersionEpoch),
333			KeyKind::View => ViewKey::decode(key).map(Self::View),
334			KeyKind::PrimaryKey => PrimaryKeyKey::decode(key).map(Self::PrimaryKey),
335			KeyKind::RingBuffer => RingBufferKey::decode(key).map(Self::RingBuffer),
336			KeyKind::RingBufferMetadata => RingBufferMetadataKey::decode(key).map(Self::RingBufferMetadata),
337			KeyKind::NamespaceRingBuffer => {
338				NamespaceRingBufferKey::decode(key).map(Self::NamespaceRingBuffer)
339			}
340			KeyKind::ShapeRetentionStrategy => {
341				ShapeRetentionStrategyKey::decode(key).map(Self::ShapeRetentionStrategy)
342			}
343			KeyKind::OperatorRetentionStrategy => {
344				OperatorRetentionStrategyKey::decode(key).map(Self::OperatorRetentionStrategy)
345			}
346			KeyKind::FlowNode
347			| KeyKind::FlowNodeByFlow
348			| KeyKind::FlowEdge
349			| KeyKind::FlowEdgeByFlow
350			| KeyKind::FlowVersion => None,
351			KeyKind::Dictionary => DictionaryKey::decode(key).map(Self::Dictionary),
352			KeyKind::DictionaryEntry => DictionaryEntryKey::decode(key).map(Self::DictionaryEntry),
353			KeyKind::DictionaryEntryIndex => {
354				DictionaryEntryIndexKey::decode(key).map(Self::DictionaryEntryIndex)
355			}
356			KeyKind::NamespaceDictionary => {
357				NamespaceDictionaryKey::decode(key).map(Self::NamespaceDictionary)
358			}
359			KeyKind::SumType => SumTypeKey::decode(key).map(Self::SumType),
360			KeyKind::NamespaceSumType => NamespaceSumTypeKey::decode(key).map(Self::NamespaceSumType),
361			KeyKind::Handler => HandlerKey::decode(key).map(Self::Handler),
362			KeyKind::NamespaceHandler => NamespaceHandlerKey::decode(key).map(Self::NamespaceHandler),
363			KeyKind::VariantHandler => None,
364			KeyKind::Metric => None,
365			KeyKind::Subscription | KeyKind::SubscriptionColumn | KeyKind::SubscriptionRow => None,
366			KeyKind::Shape | KeyKind::RowShapeField => None,
367			KeyKind::Series => SeriesKey::decode(key).map(Self::Series),
368			KeyKind::NamespaceSeries => NamespaceSeriesKey::decode(key).map(Self::NamespaceSeries),
369			KeyKind::SeriesMetadata => SeriesMetadataKey::decode(key).map(Self::SeriesMetadata),
370			KeyKind::Identity => IdentityKey::decode(key).map(Self::Identity),
371			KeyKind::IdentityAttribute => IdentityAttributeKey::decode(key).map(Self::IdentityAttribute),
372			KeyKind::IdentityAttributeValue => {
373				IdentityAttributeValueKey::decode(key).map(Self::IdentityAttributeValue)
374			}
375			KeyKind::Authentication => AuthenticationKey::decode(key).map(Self::Authentication),
376			KeyKind::Role => RoleKey::decode(key).map(Self::Role),
377			KeyKind::GrantedRole => GrantedRoleKey::decode(key).map(Self::GrantedRole),
378			KeyKind::Policy => PolicyKey::decode(key).map(Self::Policy),
379			KeyKind::PolicyOp => PolicyOpKey::decode(key).map(Self::PolicyOp),
380			KeyKind::Migration | KeyKind::MigrationEvent => None,
381			KeyKind::Token => TokenKey::decode(key).map(Self::Token),
382			KeyKind::ConfigStorage => None,
383			KeyKind::Source
384			| KeyKind::NamespaceSource
385			| KeyKind::Sink
386			| KeyKind::NamespaceSink
387			| KeyKind::SourceCheckpoint => None,
388			KeyKind::RowSettings => None,
389			KeyKind::OperatorSettings => None,
390			KeyKind::Procedure => ProcedureKey::decode(key).map(Self::Procedure),
391			KeyKind::NamespaceProcedure => NamespaceProcedureKey::decode(key).map(Self::NamespaceProcedure),
392			KeyKind::ProcedureParam => ProcedureParamKey::decode(key).map(Self::ProcedureParam),
393			KeyKind::Binding => BindingKey::decode(key).map(Self::Binding),
394			KeyKind::NamespaceBinding => None,
395			KeyKind::ColumnSnapshot => ColumnSnapshotKey::decode(key).map(Self::ColumnSnapshot),
396			KeyKind::SeriesColumnSnapshot => {
397				SeriesColumnSnapshotKey::decode(key).map(Self::SeriesColumnSnapshot)
398			}
399			KeyKind::TableColumnSnapshot => {
400				TableColumnSnapshotKey::decode(key).map(Self::TableColumnSnapshot)
401			}
402		}
403	}
404}
405
406#[cfg(test)]
407pub mod tests {
408	use reifydb_value::value::{row_number::RowNumber, sumtype::SumTypeId};
409
410	use crate::{
411		interface::catalog::{
412			flow::FlowNodeId,
413			id::{ColumnId, ColumnPropertyId, IndexId, NamespaceId, SequenceId, TableId},
414			shape::ShapeId,
415		},
416		key::{
417			Key, column::ColumnKey, column_sequence::ColumnSequenceKey, columns::ColumnsKey,
418			flow_node_state::FlowNodeStateKey, index::IndexKey, namespace::NamespaceKey,
419			namespace_sumtype::NamespaceSumTypeKey, namespace_table::NamespaceTableKey,
420			property::ColumnPropertyKey, row::RowKey, row_sequence::RowSequenceKey, sumtype::SumTypeKey,
421			system_sequence::SystemSequenceKey, table::TableKey,
422			transaction_version::TransactionVersionKey,
423		},
424	};
425
426	#[test]
427	fn test_table_columns() {
428		let key = Key::Columns(ColumnsKey {
429			column: ColumnId(42),
430		});
431
432		let encoded = key.encode();
433		let decoded = Key::decode(&encoded).expect("Failed to decode key");
434
435		match decoded {
436			Key::Columns(decoded_inner) => {
437				assert_eq!(decoded_inner.column, 42);
438			}
439			_ => unreachable!(),
440		}
441	}
442
443	#[test]
444	fn test_column() {
445		let key = Key::Column(ColumnKey {
446			shape: ShapeId::table(1),
447			column: ColumnId(42),
448		});
449
450		let encoded = key.encode();
451		let decoded = Key::decode(&encoded).expect("Failed to decode key");
452
453		match decoded {
454			Key::Column(decoded_inner) => {
455				assert_eq!(decoded_inner.shape, ShapeId::table(1));
456				assert_eq!(decoded_inner.column, 42);
457			}
458			_ => unreachable!(),
459		}
460	}
461
462	#[test]
463	fn test_column_property() {
464		let key = Key::TableColumnProperty(ColumnPropertyKey {
465			column: ColumnId(42),
466			property: ColumnPropertyId(999_999),
467		});
468
469		let encoded = key.encode();
470		let decoded = Key::decode(&encoded).expect("Failed to decode key");
471
472		match decoded {
473			Key::TableColumnProperty(decoded_inner) => {
474				assert_eq!(decoded_inner.column, 42);
475				assert_eq!(decoded_inner.property, 999_999);
476			}
477			_ => unreachable!(),
478		}
479	}
480
481	#[test]
482	fn test_namespace() {
483		let key = Key::Namespace(NamespaceKey {
484			namespace: NamespaceId(42),
485		});
486
487		let encoded = key.encode();
488		let decoded = Key::decode(&encoded).expect("Failed to decode key");
489
490		match decoded {
491			Key::Namespace(decoded_inner) => {
492				assert_eq!(decoded_inner.namespace, 42);
493			}
494			_ => unreachable!(),
495		}
496	}
497
498	#[test]
499	fn test_namespace_table() {
500		let key = Key::NamespaceTable(NamespaceTableKey {
501			namespace: NamespaceId(42),
502			table: TableId(999_999),
503		});
504
505		let encoded = key.encode();
506		let decoded = Key::decode(&encoded).expect("Failed to decode key");
507
508		match decoded {
509			Key::NamespaceTable(decoded_inner) => {
510				assert_eq!(decoded_inner.namespace, 42);
511				assert_eq!(decoded_inner.table, 999_999);
512			}
513			_ => unreachable!(),
514		}
515	}
516
517	#[test]
518	fn test_system_sequence() {
519		let key = Key::SystemSequence(SystemSequenceKey {
520			sequence: SequenceId(42),
521		});
522
523		let encoded = key.encode();
524		let decoded = Key::decode(&encoded).expect("Failed to decode key");
525
526		match decoded {
527			Key::SystemSequence(decoded_inner) => {
528				assert_eq!(decoded_inner.sequence, 42);
529			}
530			_ => unreachable!(),
531		}
532	}
533
534	#[test]
535	fn test_table() {
536		let key = Key::Table(TableKey {
537			table: TableId(42),
538		});
539
540		let encoded = key.encode();
541		let decoded = Key::decode(&encoded).expect("Failed to decode key");
542
543		match decoded {
544			Key::Table(decoded_inner) => {
545				assert_eq!(decoded_inner.table, 42);
546			}
547			_ => unreachable!(),
548		}
549	}
550
551	#[test]
552	fn test_index() {
553		let key = Key::Index(IndexKey {
554			shape: ShapeId::table(42),
555			index: IndexId::primary(999_999),
556		});
557
558		let encoded = key.encode();
559		let decoded = Key::decode(&encoded).expect("Failed to decode key");
560
561		match decoded {
562			Key::Index(decoded_inner) => {
563				assert_eq!(decoded_inner.shape, ShapeId::table(42));
564				assert_eq!(decoded_inner.index, 999_999);
565			}
566			_ => unreachable!(),
567		}
568	}
569
570	#[test]
571	fn test_row() {
572		let key = Key::Row(RowKey {
573			shape: ShapeId::table(42),
574			row: RowNumber(999_999),
575		});
576
577		let encoded = key.encode();
578		let decoded = Key::decode(&encoded).expect("Failed to decode key");
579
580		match decoded {
581			Key::Row(decoded_inner) => {
582				assert_eq!(decoded_inner.shape, ShapeId::table(42));
583				assert_eq!(decoded_inner.row, 999_999);
584			}
585			_ => unreachable!(),
586		}
587	}
588
589	#[test]
590	fn test_row_sequence() {
591		let key = Key::RowSequence(RowSequenceKey {
592			shape: ShapeId::table(42),
593		});
594
595		let encoded = key.encode();
596		let decoded = Key::decode(&encoded).expect("Failed to decode key");
597
598		match decoded {
599			Key::RowSequence(decoded_inner) => {
600				assert_eq!(decoded_inner.shape, ShapeId::table(42));
601			}
602			_ => unreachable!(),
603		}
604	}
605
606	#[test]
607	fn test_column_sequence() {
608		let key = Key::TableColumnSequence(ColumnSequenceKey {
609			shape: ShapeId::table(42),
610			column: ColumnId(123),
611		});
612
613		let encoded = key.encode();
614		let decoded = Key::decode(&encoded).expect("Failed to decode key");
615
616		match decoded {
617			Key::TableColumnSequence(decoded_inner) => {
618				assert_eq!(decoded_inner.shape, ShapeId::table(42));
619				assert_eq!(decoded_inner.column, 123);
620			}
621			_ => unreachable!(),
622		}
623	}
624
625	#[test]
626	fn test_transaction_version() {
627		let key = Key::TransactionVersion(TransactionVersionKey {});
628		let encoded = key.encode();
629		Key::decode(&encoded).expect("Failed to decode key");
630	}
631
632	#[test]
633	fn test_operator_state() {
634		let key = Key::FlowNodeState(FlowNodeStateKey {
635			node: FlowNodeId(0xCAFEBABE),
636			key: vec![1, 2, 3],
637		});
638
639		let encoded = key.encode();
640		let decoded = Key::decode(&encoded).expect("Failed to decode key");
641
642		match decoded {
643			Key::FlowNodeState(decoded_inner) => {
644				assert_eq!(decoded_inner.node, 0xCAFEBABE);
645				assert_eq!(decoded_inner.key, vec![1, 2, 3]);
646			}
647			_ => unreachable!(),
648		}
649	}
650
651	#[test]
652	fn test_sumtype_key() {
653		let key = Key::SumType(SumTypeKey {
654			sumtype: SumTypeId(42),
655		});
656
657		let encoded = key.encode();
658		let decoded = Key::decode(&encoded).expect("Failed to decode key");
659
660		match decoded {
661			Key::SumType(decoded_inner) => {
662				assert_eq!(decoded_inner.sumtype, 42);
663			}
664			_ => unreachable!(),
665		}
666	}
667
668	#[test]
669	fn test_namespace_sumtype_key() {
670		let key = Key::NamespaceSumType(NamespaceSumTypeKey {
671			namespace: NamespaceId(42),
672			sumtype: SumTypeId(999_999),
673		});
674
675		let encoded = key.encode();
676		let decoded = Key::decode(&encoded).expect("Failed to decode key");
677
678		match decoded {
679			Key::NamespaceSumType(decoded_inner) => {
680				assert_eq!(decoded_inner.namespace, 42);
681				assert_eq!(decoded_inner.sumtype, 999_999);
682			}
683			_ => unreachable!(),
684		}
685	}
686}