reifydb_core/key/
namespace_sink.rs1use reifydb_codec::key::{
5 deserializer::KeyDeserializer,
6 encoded::{EncodedKey, EncodedKeyRange},
7 serializer::KeySerializer,
8};
9
10use super::{EncodableKey, KeyKind};
11use crate::interface::catalog::id::{NamespaceId, SinkId};
12
13#[derive(Debug, Clone, PartialEq)]
14pub struct NamespaceSinkKey {
15 pub namespace: NamespaceId,
16 pub sink: SinkId,
17}
18
19impl EncodableKey for NamespaceSinkKey {
20 const KIND: KeyKind = KeyKind::NamespaceSink;
21
22 fn encode(&self) -> EncodedKey {
23 let mut serializer = KeySerializer::with_capacity(17);
24 serializer.extend_u8(Self::KIND as u8).extend_u64(self.namespace).extend_u64(self.sink);
25 serializer.to_encoded_key()
26 }
27
28 fn decode(key: &EncodedKey) -> Option<Self> {
29 let mut de = KeyDeserializer::from_bytes(key.as_slice());
30
31 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
32 if kind != Self::KIND {
33 return None;
34 }
35
36 let namespace = de.read_u64().ok()?;
37 let sink = de.read_u64().ok()?;
38
39 Some(Self {
40 namespace: NamespaceId(namespace),
41 sink: SinkId(sink),
42 })
43 }
44}
45
46impl NamespaceSinkKey {
47 pub fn encoded(namespace: impl Into<NamespaceId>, sink: impl Into<SinkId>) -> EncodedKey {
48 Self {
49 namespace: namespace.into(),
50 sink: sink.into(),
51 }
52 .encode()
53 }
54
55 pub fn full_scan(namespace_id: NamespaceId) -> EncodedKeyRange {
56 EncodedKeyRange::start_end(Some(Self::link_start(namespace_id)), Some(Self::link_end(namespace_id)))
57 }
58
59 fn link_start(namespace_id: NamespaceId) -> EncodedKey {
60 let mut serializer = KeySerializer::with_capacity(9);
61 serializer.extend_u8(Self::KIND as u8).extend_u64(namespace_id);
62 serializer.to_encoded_key()
63 }
64
65 fn link_end(namespace_id: NamespaceId) -> EncodedKey {
66 let mut serializer = KeySerializer::with_capacity(9);
67 serializer.extend_u8(Self::KIND as u8).extend_u64(*namespace_id - 1);
68 serializer.to_encoded_key()
69 }
70}
71
72#[cfg(test)]
73pub mod tests {
74 use super::{EncodableKey, NamespaceSinkKey};
75 use crate::interface::catalog::id::{NamespaceId, SinkId};
76
77 #[test]
78 fn test_encode_decode() {
79 let key = NamespaceSinkKey {
80 namespace: NamespaceId(0xABCD),
81 sink: SinkId(0x123456789ABCDEF0),
82 };
83 let encoded = key.encode();
84 let decoded = NamespaceSinkKey::decode(&encoded).unwrap();
85 assert_eq!(decoded.namespace, NamespaceId(0xABCD));
86 assert_eq!(decoded.sink, SinkId(0x123456789ABCDEF0));
87 assert_eq!(key, decoded);
88 }
89
90 #[test]
91 fn test_order_preserving() {
92 let key1 = NamespaceSinkKey {
93 namespace: NamespaceId::SYSTEM,
94 sink: SinkId(100),
95 };
96 let key2 = NamespaceSinkKey {
97 namespace: NamespaceId::SYSTEM,
98 sink: SinkId(200),
99 };
100 let key3 = NamespaceSinkKey {
101 namespace: NamespaceId::DEFAULT,
102 sink: SinkId(0),
103 };
104
105 let encoded1 = key1.encode();
106 let encoded2 = key2.encode();
107 let encoded3 = key3.encode();
108
109 assert!(encoded3 < encoded2, "ordering not preserved");
110 assert!(encoded2 < encoded1, "ordering not preserved");
111 }
112}