reifydb_core/key/
row_ttl.rs1use reifydb_type::value::dictionary::DictionaryId;
5use serde::{Deserialize, Serialize};
6
7use super::{EncodableKey, KeyKind};
8use crate::{
9 encoded::key::{EncodedKey, EncodedKeyRange},
10 interface::catalog::{
11 id::{RingBufferId, SeriesId, TableId, ViewId},
12 shape::ShapeId,
13 vtable::VTableId,
14 },
15 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
16};
17
18#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
19pub struct RowTtlKey {
20 pub shape: ShapeId,
21}
22
23impl RowTtlKey {
24 pub fn encoded(shape: impl Into<ShapeId>) -> EncodedKey {
25 Self {
26 shape: shape.into(),
27 }
28 .encode()
29 }
30}
31
32impl EncodableKey for RowTtlKey {
33 const KIND: KeyKind = KeyKind::RowTtl;
34
35 fn encode(&self) -> EncodedKey {
36 let mut serializer = KeySerializer::with_capacity(10);
37 serializer.extend_u8(Self::KIND as u8);
38
39 match &self.shape {
40 ShapeId::Table(id) => {
41 serializer.extend_u8(0x01).extend_u64(id.0);
42 }
43 ShapeId::View(id) => {
44 serializer.extend_u8(0x02).extend_u64(id.0);
45 }
46 ShapeId::TableVirtual(id) => {
47 serializer.extend_u8(0x03).extend_u64(id.0);
48 }
49 ShapeId::RingBuffer(id) => {
50 serializer.extend_u8(0x04).extend_u64(id.0);
51 }
52 ShapeId::Dictionary(id) => {
53 serializer.extend_u8(0x06).extend_u64(id.0);
54 }
55 ShapeId::Series(id) => {
56 serializer.extend_u8(0x07).extend_u64(id.0);
57 }
58 }
59
60 serializer.to_encoded_key()
61 }
62
63 fn decode(key: &EncodedKey) -> Option<Self> {
64 let mut de = KeyDeserializer::from_bytes(key.as_slice());
65
66 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
67 if kind != Self::KIND {
68 return None;
69 }
70
71 let discriminator = de.read_u8().ok()?;
72 let id = de.read_u64().ok()?;
73
74 let shape = match discriminator {
75 0x01 => ShapeId::Table(TableId(id)),
76 0x02 => ShapeId::View(ViewId(id)),
77 0x03 => ShapeId::TableVirtual(VTableId(id)),
78 0x04 => ShapeId::RingBuffer(RingBufferId(id)),
79 0x06 => ShapeId::Dictionary(DictionaryId(id)),
80 0x07 => ShapeId::Series(SeriesId(id)),
81 _ => return None,
82 };
83
84 Some(Self {
85 shape,
86 })
87 }
88}
89
90pub struct RowTtlKeyRange;
91
92impl RowTtlKeyRange {
93 pub fn full_scan() -> EncodedKeyRange {
94 EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
95 }
96
97 fn start() -> EncodedKey {
98 let mut serializer = KeySerializer::with_capacity(1);
99 serializer.extend_u8(RowTtlKey::KIND as u8);
100 serializer.to_encoded_key()
101 }
102
103 fn end() -> EncodedKey {
104 let mut serializer = KeySerializer::with_capacity(1);
105 serializer.extend_u8(RowTtlKey::KIND as u8 - 1);
106 serializer.to_encoded_key()
107 }
108}
109
110#[cfg(test)]
111pub mod tests {
112 use super::*;
113
114 #[test]
115 fn test_row_ttl_key_encoding() {
116 let key = RowTtlKey {
117 shape: ShapeId::Table(TableId(42)),
118 };
119
120 let encoded = key.encode();
121 let decoded = RowTtlKey::decode(&encoded).unwrap();
122 assert_eq!(key, decoded);
123 }
124
125 #[test]
126 fn test_row_ttl_key_roundtrip_ringbuffer() {
127 let key = RowTtlKey {
128 shape: ShapeId::RingBuffer(RingBufferId(99)),
129 };
130
131 let encoded = key.encode();
132 let decoded = RowTtlKey::decode(&encoded).unwrap();
133 assert_eq!(key, decoded);
134 }
135
136 #[test]
137 fn test_row_ttl_key_roundtrip_series() {
138 let key = RowTtlKey {
139 shape: ShapeId::Series(SeriesId(7)),
140 };
141
142 let encoded = key.encode();
143 let decoded = RowTtlKey::decode(&encoded).unwrap();
144 assert_eq!(key, decoded);
145 }
146}