Skip to main content

reifydb_core/key/
ringbuffer.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}