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