reifydb_core/key/
row_settings.rs1use reifydb_codec::key::{
5 deserializer::KeyDeserializer,
6 encoded::{EncodedKey, EncodedKeyRange},
7 serializer::KeySerializer,
8};
9use reifydb_value::value::dictionary::DictionaryId;
10use serde::{Deserialize, Serialize};
11
12use super::{EncodableKey, KeyKind};
13use crate::interface::catalog::{
14 id::{RingBufferId, SeriesId, TableId, ViewId},
15 shape::ShapeId,
16 vtable::VTableId,
17};
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20pub struct RowSettingsKey {
21 pub shape: ShapeId,
22}
23
24impl RowSettingsKey {
25 pub fn encoded(shape: impl Into<ShapeId>) -> EncodedKey {
26 Self {
27 shape: shape.into(),
28 }
29 .encode()
30 }
31}
32
33impl EncodableKey for RowSettingsKey {
34 const KIND: KeyKind = KeyKind::RowSettings;
35
36 fn encode(&self) -> EncodedKey {
37 let mut serializer = KeySerializer::with_capacity(10);
38 serializer.extend_u8(Self::KIND as u8);
39
40 match &self.shape {
41 ShapeId::Table(id) => {
42 serializer.extend_u8(0x01).extend_u64(id.0);
43 }
44 ShapeId::View(id) => {
45 serializer.extend_u8(0x02).extend_u64(id.0);
46 }
47 ShapeId::TableVirtual(id) => {
48 serializer.extend_u8(0x03).extend_u64(id.0);
49 }
50 ShapeId::RingBuffer(id) => {
51 serializer.extend_u8(0x04).extend_u64(id.0);
52 }
53 ShapeId::Dictionary(id) => {
54 serializer.extend_u8(0x06).extend_u64(id.0);
55 }
56 ShapeId::Series(id) => {
57 serializer.extend_u8(0x07).extend_u64(id.0);
58 }
59 }
60
61 serializer.to_encoded_key()
62 }
63
64 fn decode(key: &EncodedKey) -> Option<Self> {
65 let mut de = KeyDeserializer::from_bytes(key.as_slice());
66
67 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
68 if kind != Self::KIND {
69 return None;
70 }
71
72 let discriminator = de.read_u8().ok()?;
73 let id = de.read_u64().ok()?;
74
75 let shape = match discriminator {
76 0x01 => ShapeId::Table(TableId(id)),
77 0x02 => ShapeId::View(ViewId(id)),
78 0x03 => ShapeId::TableVirtual(VTableId(id)),
79 0x04 => ShapeId::RingBuffer(RingBufferId(id)),
80 0x06 => ShapeId::Dictionary(DictionaryId(id)),
81 0x07 => ShapeId::Series(SeriesId(id)),
82 _ => return None,
83 };
84
85 Some(Self {
86 shape,
87 })
88 }
89}
90
91pub struct RowSettingsKeyRange;
92
93impl RowSettingsKeyRange {
94 pub fn full_scan() -> EncodedKeyRange {
95 EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
96 }
97
98 fn start() -> EncodedKey {
99 let mut serializer = KeySerializer::with_capacity(1);
100 serializer.extend_u8(RowSettingsKey::KIND as u8);
101 serializer.to_encoded_key()
102 }
103
104 fn end() -> EncodedKey {
105 let mut serializer = KeySerializer::with_capacity(1);
106 serializer.extend_u8(RowSettingsKey::KIND as u8 - 1);
107 serializer.to_encoded_key()
108 }
109}
110
111#[cfg(test)]
112pub mod tests {
113 use super::*;
114
115 #[test]
116 fn test_row_settings_key_encoding() {
117 let key = RowSettingsKey {
118 shape: ShapeId::Table(TableId(42)),
119 };
120
121 let encoded = key.encode();
122 let decoded = RowSettingsKey::decode(&encoded).unwrap();
123 assert_eq!(key, decoded);
124 }
125
126 #[test]
127 fn test_row_settings_key_roundtrip_ringbuffer() {
128 let key = RowSettingsKey {
129 shape: ShapeId::RingBuffer(RingBufferId(99)),
130 };
131
132 let encoded = key.encode();
133 let decoded = RowSettingsKey::decode(&encoded).unwrap();
134 assert_eq!(key, decoded);
135 }
136
137 #[test]
138 fn test_row_settings_key_roundtrip_series() {
139 let key = RowSettingsKey {
140 shape: ShapeId::Series(SeriesId(7)),
141 };
142
143 let encoded = key.encode();
144 let decoded = RowSettingsKey::decode(&encoded).unwrap();
145 assert_eq!(key, decoded);
146 }
147}