reifydb_core/key/
row_sequence.rs1use reifydb_codec::key::{
5 deserializer::KeyDeserializer,
6 encoded::{EncodedKey, EncodedKeyRange},
7 serializer::KeySerializer,
8};
9
10use super::{EncodableKey, KeyKind};
11use crate::{
12 interface::catalog::object::ObjectId,
13 key::catalog::{KeyDeserializerCatalogExt, KeySerializerCatalogExt},
14};
15
16#[derive(Debug, Clone, PartialEq)]
17pub struct RowSequenceKey {
18 pub object: ObjectId,
19}
20
21impl EncodableKey for RowSequenceKey {
22 const KIND: KeyKind = KeyKind::RowSequence;
23
24 fn encode(&self) -> EncodedKey {
25 let mut serializer = KeySerializer::with_capacity(10);
26 serializer.extend_u8(Self::KIND as u8).extend_object_id(self.object);
27 serializer.to_encoded_key()
28 }
29
30 fn decode(key: &EncodedKey) -> Option<Self> {
31 let mut de = KeyDeserializer::from_bytes(key.as_slice());
32
33 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
34 if kind != Self::KIND {
35 return None;
36 }
37
38 let object = de.read_object_id().ok()?;
39
40 Some(Self {
41 object,
42 })
43 }
44}
45
46impl RowSequenceKey {
47 pub fn encoded(object: impl Into<ObjectId>) -> EncodedKey {
48 Self {
49 object: object.into(),
50 }
51 .encode()
52 }
53
54 pub fn full_scan() -> EncodedKeyRange {
55 EncodedKeyRange::start_end(Some(Self::sequence_start()), Some(Self::sequence_end()))
56 }
57
58 fn sequence_start() -> EncodedKey {
59 let mut serializer = KeySerializer::with_capacity(1);
60 serializer.extend_u8(Self::KIND as u8);
61 serializer.to_encoded_key()
62 }
63
64 fn sequence_end() -> EncodedKey {
65 let mut serializer = KeySerializer::with_capacity(1);
66 serializer.extend_u8(Self::KIND as u8 - 1);
67 serializer.to_encoded_key()
68 }
69}
70
71#[cfg(test)]
72pub mod tests {
73 use super::{EncodableKey, RowSequenceKey};
74 use crate::interface::catalog::object::ObjectId;
75
76 #[test]
77 fn test_encode_decode() {
78 let key = RowSequenceKey {
79 object: ObjectId::table(0xABCD),
80 };
81 let encoded = key.encode();
82 let expected = vec![0xF7, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x32];
83 assert_eq!(encoded.as_slice(), expected);
84
85 let key = RowSequenceKey::decode(&encoded).unwrap();
86 assert_eq!(key.object, ObjectId::table(0xABCD));
87 }
88}