reifydb_core/key/
column_sequence.rs1use crate::{
5 encoded::key::EncodedKey,
6 interface::catalog::{id::ColumnId, shape::ShapeId},
7 key::{EncodableKey, KeyKind},
8 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
9};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct ColumnSequenceKey {
13 pub shape: ShapeId,
14 pub column: ColumnId,
15}
16
17impl EncodableKey for ColumnSequenceKey {
18 const KIND: KeyKind = KeyKind::ColumnSequence;
19
20 fn encode(&self) -> EncodedKey {
21 let mut serializer = KeySerializer::with_capacity(18);
22 serializer.extend_u8(Self::KIND as u8).extend_shape_id(self.shape).extend_u64(self.column);
23 serializer.to_encoded_key()
24 }
25
26 fn decode(key: &EncodedKey) -> Option<Self> {
27 let mut de = KeyDeserializer::from_bytes(key.as_slice());
28
29 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
30 if kind != Self::KIND {
31 return None;
32 }
33
34 let shape = de.read_shape_id().ok()?;
35 let column = de.read_u64().ok()?;
36
37 Some(Self {
38 shape,
39 column: ColumnId(column),
40 })
41 }
42}
43
44impl ColumnSequenceKey {
45 pub fn encoded(shape: impl Into<ShapeId>, column: impl Into<ColumnId>) -> EncodedKey {
46 Self {
47 shape: shape.into(),
48 column: column.into(),
49 }
50 .encode()
51 }
52}
53
54#[cfg(test)]
55pub mod tests {
56 use super::{ColumnSequenceKey, EncodableKey};
57 use crate::{
58 encoded::key::EncodedKey,
59 interface::catalog::{id::ColumnId, shape::ShapeId},
60 };
61
62 #[test]
63 fn test_encode_decode() {
64 let key = ColumnSequenceKey {
65 shape: ShapeId::table(0x1234),
66 column: ColumnId(0x5678),
67 };
68 let encoded = key.encode();
69
70 assert_eq!(encoded[0], 0xF1);
71
72 let decoded = ColumnSequenceKey::decode(&encoded).unwrap();
73 assert_eq!(decoded.shape, ShapeId::table(0x1234));
74 assert_eq!(decoded.column, ColumnId(0x5678));
75 }
76
77 #[test]
78 fn test_decode_invalid_version() {
79 let mut encoded = vec![0xFF];
80 encoded.push(0x0E);
81 encoded.extend(&[0; 16]);
82
83 let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
84 assert!(decoded.is_none());
85 }
86
87 #[test]
88 fn test_decode_invalid_kind() {
89 let mut encoded = vec![0x01];
90 encoded.push(0xFF);
91 encoded.extend(&[0; 16]);
92
93 let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
94 assert!(decoded.is_none());
95 }
96
97 #[test]
98 fn test_decode_invalid_length() {
99 let encoded = vec![0x01, 0x0E];
100 let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
101 assert!(decoded.is_none());
102 }
103}