1use 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}