Skip to main content

reifydb_core/key/
operator_ttl.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use serde::{Deserialize, Serialize};
5
6use super::{EncodableKey, KeyKind};
7use crate::{
8	encoded::key::{EncodedKey, EncodedKeyRange},
9	interface::catalog::flow::FlowNodeId,
10	util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
11};
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct OperatorTtlKey {
15	pub node: FlowNodeId,
16}
17
18impl OperatorTtlKey {
19	pub fn encoded(node: impl Into<FlowNodeId>) -> EncodedKey {
20		Self {
21			node: node.into(),
22		}
23		.encode()
24	}
25}
26
27impl EncodableKey for OperatorTtlKey {
28	const KIND: KeyKind = KeyKind::OperatorTtl;
29
30	fn encode(&self) -> EncodedKey {
31		let mut serializer = KeySerializer::with_capacity(9);
32		serializer.extend_u8(Self::KIND as u8).extend_u64(self.node.0);
33		serializer.to_encoded_key()
34	}
35
36	fn decode(key: &EncodedKey) -> Option<Self> {
37		let mut de = KeyDeserializer::from_bytes(key.as_slice());
38
39		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
40		if kind != Self::KIND {
41			return None;
42		}
43
44		let node_id = de.read_u64().ok()?;
45
46		Some(Self {
47			node: FlowNodeId(node_id),
48		})
49	}
50}
51
52pub struct OperatorTtlKeyRange;
53
54impl OperatorTtlKeyRange {
55	pub fn full_scan() -> EncodedKeyRange {
56		EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
57	}
58
59	fn start() -> EncodedKey {
60		let mut serializer = KeySerializer::with_capacity(1);
61		serializer.extend_u8(OperatorTtlKey::KIND as u8);
62		serializer.to_encoded_key()
63	}
64
65	fn end() -> EncodedKey {
66		let mut serializer = KeySerializer::with_capacity(1);
67		serializer.extend_u8(OperatorTtlKey::KIND as u8 - 1);
68		serializer.to_encoded_key()
69	}
70}
71
72#[cfg(test)]
73pub mod tests {
74	use super::*;
75
76	#[test]
77	fn test_operator_ttl_key_encoding() {
78		let key = OperatorTtlKey {
79			node: FlowNodeId(42),
80		};
81
82		let encoded = key.encode();
83		let decoded = OperatorTtlKey::decode(&encoded).unwrap();
84		assert_eq!(key, decoded);
85	}
86
87	#[test]
88	fn test_operator_ttl_key_roundtrip_large_id() {
89		let key = OperatorTtlKey {
90			node: FlowNodeId(0xDEAD_BEEF_CAFE_BABE),
91		};
92
93		let encoded = key.encode();
94		let decoded = OperatorTtlKey::decode(&encoded).unwrap();
95		assert_eq!(key, decoded);
96	}
97
98	#[test]
99	fn test_operator_ttl_key_decode_invalid_version() {
100		let mut bytes = Vec::new();
101		bytes.push(0x00);
102		bytes.push(OperatorTtlKey::KIND as u8);
103		bytes.extend(&42u64.to_be_bytes());
104		let key = EncodedKey::new(bytes);
105		assert!(OperatorTtlKey::decode(&key).is_none());
106	}
107
108	#[test]
109	fn test_operator_ttl_key_decode_wrong_kind() {
110		let mut bytes = Vec::new();
111		bytes.push(0xFF);
112		bytes.extend(&42u64.to_be_bytes());
113		let key = EncodedKey::new(bytes);
114		assert!(OperatorTtlKey::decode(&key).is_none());
115	}
116}