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