reifydb_core/key/
row_settings.rs1use reifydb_codec::key::{
5 deserializer::KeyDeserializer,
6 encoded::{EncodedKey, EncodedKeyRange},
7 serializer::KeySerializer,
8};
9use serde::{Deserialize, Serialize};
10
11use super::{EncodableKey, KeyKind};
12use crate::interface::catalog::storage::StorageId;
13
14#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15pub struct RowSettingsKey {
16 pub storage: StorageId,
17}
18
19impl RowSettingsKey {
20 pub fn encoded(storage: StorageId) -> EncodedKey {
21 Self {
22 storage,
23 }
24 .encode()
25 }
26}
27
28impl EncodableKey for RowSettingsKey {
29 const KIND: KeyKind = KeyKind::RowSettings;
30
31 fn encode(&self) -> EncodedKey {
32 let mut serializer = KeySerializer::with_capacity(10);
33 serializer.extend_u8(Self::KIND as u8);
34
35 serializer.extend_u8(self.storage.type_tag()).extend_u64(self.storage.as_u64());
36
37 serializer.to_encoded_key()
38 }
39
40 fn decode(key: &EncodedKey) -> Option<Self> {
41 let mut de = KeyDeserializer::from_bytes(key.as_slice());
42
43 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
44 if kind != Self::KIND {
45 return None;
46 }
47
48 let discriminator = de.read_u8().ok()?;
49 let id = de.read_u64().ok()?;
50
51 Some(Self {
52 storage: StorageId::from_type_tag(discriminator, id)?,
53 })
54 }
55}
56
57pub struct RowSettingsKeyRange;
58
59impl RowSettingsKeyRange {
60 pub fn full_scan() -> EncodedKeyRange {
61 EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
62 }
63
64 fn start() -> EncodedKey {
65 let mut serializer = KeySerializer::with_capacity(1);
66 serializer.extend_u8(RowSettingsKey::KIND as u8);
67 serializer.to_encoded_key()
68 }
69
70 fn end() -> EncodedKey {
71 let mut serializer = KeySerializer::with_capacity(1);
72 serializer.extend_u8(RowSettingsKey::KIND as u8 - 1);
73 serializer.to_encoded_key()
74 }
75}
76
77#[cfg(test)]
78pub mod tests {
79 use super::*;
80 use crate::interface::catalog::id::{RingBufferId, SeriesId, TableId};
81
82 #[test]
83 fn test_row_settings_key_encoding() {
84 let key = RowSettingsKey {
85 storage: StorageId::Table(TableId(42)),
86 };
87
88 let encoded = key.encode();
89 let decoded = RowSettingsKey::decode(&encoded).unwrap();
90 assert_eq!(key, decoded);
91 }
92
93 #[test]
94 fn test_row_settings_key_roundtrip_ringbuffer() {
95 let key = RowSettingsKey {
96 storage: StorageId::RingBuffer(RingBufferId(99)),
97 };
98
99 let encoded = key.encode();
100 let decoded = RowSettingsKey::decode(&encoded).unwrap();
101 assert_eq!(key, decoded);
102 }
103
104 #[test]
105 fn test_row_settings_key_roundtrip_series() {
106 let key = RowSettingsKey {
107 storage: StorageId::Series(SeriesId(7)),
108 };
109
110 let encoded = key.encode();
111 let decoded = RowSettingsKey::decode(&encoded).unwrap();
112 assert_eq!(key, decoded);
113 }
114}