reifydb_core/key/
ringbuffer.rs1use reifydb_codec::key::{
5 deserializer::KeyDeserializer,
6 encoded::{EncodedKey, EncodedKeyRange},
7 serializer::KeySerializer,
8};
9use reifydb_value::value::Value;
10
11use super::{EncodableKey, KeyKind};
12use crate::interface::catalog::id::RingBufferId;
13
14#[derive(Debug, Clone, PartialEq)]
15pub struct RingBufferKey {
16 pub ringbuffer: RingBufferId,
17}
18
19impl RingBufferKey {
20 pub fn new(ringbuffer: RingBufferId) -> Self {
21 Self {
22 ringbuffer,
23 }
24 }
25
26 pub fn encoded(ringbuffer: impl Into<RingBufferId>) -> EncodedKey {
27 Self::new(ringbuffer.into()).encode()
28 }
29
30 pub fn full_scan() -> EncodedKeyRange {
31 EncodedKeyRange::start_end(Some(Self::ringbuffer_start()), Some(Self::ringbuffer_end()))
32 }
33
34 fn ringbuffer_start() -> EncodedKey {
35 let mut serializer = KeySerializer::with_capacity(1);
36 serializer.extend_u8(Self::KIND as u8);
37 serializer.to_encoded_key()
38 }
39
40 fn ringbuffer_end() -> EncodedKey {
41 let mut serializer = KeySerializer::with_capacity(1);
42 serializer.extend_u8(Self::KIND as u8 - 1);
43 serializer.to_encoded_key()
44 }
45}
46
47impl EncodableKey for RingBufferKey {
48 const KIND: KeyKind = KeyKind::RingBuffer;
49
50 fn encode(&self) -> EncodedKey {
51 let mut serializer = KeySerializer::with_capacity(9);
52 serializer.extend_u8(Self::KIND as u8).extend_u64(self.ringbuffer);
53 serializer.to_encoded_key()
54 }
55
56 fn decode(key: &EncodedKey) -> Option<Self> {
57 let mut de = KeyDeserializer::from_bytes(key.as_slice());
58
59 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
60 if kind != Self::KIND {
61 return None;
62 }
63
64 let ringbuffer = de.read_u64().ok()?;
65
66 Some(Self {
67 ringbuffer: RingBufferId(ringbuffer),
68 })
69 }
70}
71
72#[derive(Debug, Clone, PartialEq)]
73pub struct RingBufferMetadataKey {
74 pub ringbuffer: RingBufferId,
75 pub partition_values: Vec<Value>,
76}
77
78impl RingBufferMetadataKey {
79 pub fn new(ringbuffer: RingBufferId) -> Self {
80 Self {
81 ringbuffer,
82 partition_values: vec![],
83 }
84 }
85
86 pub fn encoded(ringbuffer: impl Into<RingBufferId>) -> EncodedKey {
87 Self::new(ringbuffer.into()).encode()
88 }
89
90 pub fn encoded_partition(ringbuffer: impl Into<RingBufferId>, partition_values: Vec<Value>) -> EncodedKey {
91 Self {
92 ringbuffer: ringbuffer.into(),
93 partition_values,
94 }
95 .encode()
96 }
97
98 pub fn full_scan_for_ringbuffer(ringbuffer: RingBufferId) -> EncodedKeyRange {
99 let mut start = KeySerializer::with_capacity(9);
100 start.extend_u8(Self::KIND as u8);
101 start.extend_u64(ringbuffer);
102 let start_key = start.to_encoded_key();
103
104 let mut end = KeySerializer::with_capacity(9);
105 end.extend_u8(Self::KIND as u8);
106 end.extend_u64(RingBufferId(ringbuffer.0 - 1));
107 let end_key = end.to_encoded_key();
108
109 EncodedKeyRange::start_end(Some(start_key), Some(end_key))
110 }
111}
112
113impl EncodableKey for RingBufferMetadataKey {
114 const KIND: KeyKind = KeyKind::RingBufferMetadata;
115
116 fn encode(&self) -> EncodedKey {
117 let mut serializer = KeySerializer::with_capacity(31);
118 serializer.extend_u8(Self::KIND as u8).extend_u64(self.ringbuffer);
119 for value in &self.partition_values {
120 serializer.extend_value(value);
121 }
122 serializer.to_encoded_key()
123 }
124
125 fn decode(key: &EncodedKey) -> Option<Self> {
126 let mut de = KeyDeserializer::from_bytes(key.as_slice());
127
128 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
129 if kind != Self::KIND {
130 return None;
131 }
132
133 let ringbuffer = de.read_u64().ok()?;
134
135 let mut partition_values = Vec::new();
136 while !de.is_empty() {
137 partition_values.push(de.read_value().ok()?);
138 }
139
140 Some(Self {
141 ringbuffer: RingBufferId(ringbuffer),
142 partition_values,
143 })
144 }
145}
146
147#[cfg(test)]
148mod tests {
149 use super::*;
150
151 #[test]
152 fn test_metadata_key_encode_decode_roundtrip() {
153 let key = RingBufferMetadataKey::encoded_partition(
154 RingBufferId(42),
155 vec![Value::Utf8("east".to_string())],
156 );
157 let mut de = KeyDeserializer::from_bytes(key.as_slice());
158 let _ = (de.read_u8(), de.read_u64());
159 let value = de.read_value().unwrap();
160 assert_eq!(value, Value::Utf8("east".to_string()));
161 }
162
163 #[test]
164 fn test_metadata_key_encode_decode_multiple() {
165 let key = RingBufferMetadataKey::encoded_partition(
166 RingBufferId(7),
167 vec![Value::Utf8("us".to_string()), Value::Uint8(42)],
168 );
169 let mut de = KeyDeserializer::from_bytes(key.as_slice());
170 let _ = (de.read_u8(), de.read_u64());
171 assert_eq!(de.read_value().unwrap(), Value::Utf8("us".to_string()));
172 assert_eq!(de.read_value().unwrap(), Value::Uint8(42));
173 }
174}