Skip to main content

reifydb_core/key/
row_ttl.rs

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