reifydb_core/key/
namespace_ringbuffer.rs1use super::{EncodableKey, KeyKind};
5use crate::{
6 encoded::key::{EncodedKey, EncodedKeyRange},
7 interface::catalog::id::{NamespaceId, RingBufferId},
8 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
9};
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct NamespaceRingBufferKey {
13 pub namespace: NamespaceId,
14 pub ringbuffer: RingBufferId,
15}
16
17impl NamespaceRingBufferKey {
18 pub fn new(namespace: NamespaceId, ringbuffer: RingBufferId) -> Self {
19 Self {
20 namespace,
21 ringbuffer,
22 }
23 }
24
25 pub fn encoded(namespace: impl Into<NamespaceId>, ringbuffer: impl Into<RingBufferId>) -> EncodedKey {
26 Self::new(namespace.into(), ringbuffer.into()).encode()
27 }
28
29 pub fn full_scan(namespace: NamespaceId) -> EncodedKeyRange {
30 EncodedKeyRange::start_end(Some(Self::link_start(namespace)), Some(Self::link_end(namespace)))
31 }
32
33 fn link_start(namespace: NamespaceId) -> EncodedKey {
34 let mut serializer = KeySerializer::with_capacity(9);
35 serializer.extend_u8(Self::KIND as u8).extend_u64(namespace);
36 serializer.to_encoded_key()
37 }
38
39 fn link_end(namespace: NamespaceId) -> EncodedKey {
40 let mut serializer = KeySerializer::with_capacity(9);
41 serializer.extend_u8(Self::KIND as u8).extend_u64(*namespace - 1);
42 serializer.to_encoded_key()
43 }
44}
45
46impl EncodableKey for NamespaceRingBufferKey {
47 const KIND: KeyKind = KeyKind::NamespaceRingBuffer;
48
49 fn encode(&self) -> EncodedKey {
50 let mut serializer = KeySerializer::with_capacity(17);
51 serializer.extend_u8(Self::KIND as u8).extend_u64(self.namespace).extend_u64(self.ringbuffer);
52 serializer.to_encoded_key()
53 }
54
55 fn decode(key: &EncodedKey) -> Option<Self> {
56 let mut de = KeyDeserializer::from_bytes(key.as_slice());
57
58 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
59 if kind != Self::KIND {
60 return None;
61 }
62
63 let namespace = de.read_u64().ok()?;
64 let ringbuffer = de.read_u64().ok()?;
65
66 Some(Self {
67 namespace: NamespaceId(namespace),
68 ringbuffer: RingBufferId(ringbuffer),
69 })
70 }
71}