reifydb_core/key/
namespace_handler.rs1use crate::{
5 encoded::key::{EncodedKey, EncodedKeyRange},
6 interface::catalog::id::{HandlerId, NamespaceId},
7 key::{EncodableKey, KeyKind},
8 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
9};
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct NamespaceHandlerKey {
13 pub namespace: NamespaceId,
14 pub handler: HandlerId,
15}
16
17impl NamespaceHandlerKey {
18 pub fn new(namespace: NamespaceId, handler: HandlerId) -> Self {
19 Self {
20 namespace,
21 handler,
22 }
23 }
24
25 pub fn encoded(namespace: impl Into<NamespaceId>, handler: impl Into<HandlerId>) -> EncodedKey {
26 Self::new(namespace.into(), handler.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 NamespaceHandlerKey {
47 const KIND: KeyKind = KeyKind::NamespaceHandler;
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.handler);
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 handler = de.read_u64().ok()?;
65
66 Some(Self {
67 namespace: NamespaceId(namespace),
68 handler: HandlerId(handler),
69 })
70 }
71}
72
73#[cfg(test)]
74pub mod tests {
75 use super::{EncodableKey, NamespaceHandlerKey};
76 use crate::interface::catalog::id::{HandlerId, NamespaceId};
77
78 #[test]
79 fn test_encode_decode() {
80 let key = NamespaceHandlerKey {
81 namespace: NamespaceId(0xABCD),
82 handler: HandlerId(0x123456789ABCDEF0),
83 };
84 let encoded = key.encode();
85 let expected: Vec<u8> =
86 vec![0xD0, 0x3F, 0x54, 0x32, 0x00, 0xED, 0xCB, 0xA9, 0x87, 0x65, 0x43, 0x21, 0x0F];
87 assert_eq!(encoded.as_slice(), expected);
88
89 let decoded = NamespaceHandlerKey::decode(&encoded).unwrap();
90 assert_eq!(decoded.namespace, NamespaceId(0xABCD));
91 assert_eq!(decoded.handler, HandlerId(0x123456789ABCDEF0));
92 }
93
94 #[test]
95 fn test_order_preserving() {
96 let key1 = NamespaceHandlerKey {
97 namespace: NamespaceId::SYSTEM,
98 handler: HandlerId(100),
99 };
100 let key2 = NamespaceHandlerKey {
101 namespace: NamespaceId::SYSTEM,
102 handler: HandlerId(200),
103 };
104 let key3 = NamespaceHandlerKey {
105 namespace: NamespaceId::DEFAULT,
106 handler: HandlerId(1),
107 };
108
109 let encoded1 = key1.encode();
110 let encoded2 = key2.encode();
111 let encoded3 = key3.encode();
112
113 assert!(encoded3 < encoded2, "ordering not preserved");
114 assert!(encoded2 < encoded1, "ordering not preserved");
115 }
116}