Skip to main content

reifydb_core/key/
row_settings.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}