reifydb_core/key/
flow_node.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use super::{EncodableKey, KeyKind};
5use crate::{
6	EncodedKey, EncodedKeyRange,
7	interface::catalog::{FlowId, FlowNodeId},
8	util::encoding::keycode::{KeyDeserializer, KeySerializer},
9};
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct FlowNodeKey {
13	pub node: FlowNodeId,
14}
15
16const VERSION: u8 = 1;
17
18impl EncodableKey for FlowNodeKey {
19	const KIND: KeyKind = KeyKind::FlowNode;
20
21	fn encode(&self) -> EncodedKey {
22		let mut serializer = KeySerializer::with_capacity(10);
23		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_u64(self.node);
24		serializer.to_encoded_key()
25	}
26
27	fn decode(key: &EncodedKey) -> Option<Self> {
28		let mut de = KeyDeserializer::from_bytes(key.as_slice());
29
30		let version = de.read_u8().ok()?;
31		if version != VERSION {
32			return None;
33		}
34
35		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
36		if kind != Self::KIND {
37			return None;
38		}
39
40		let node = de.read_u64().ok()?;
41
42		Some(Self {
43			node: FlowNodeId(node),
44		})
45	}
46}
47
48impl FlowNodeKey {
49	pub fn encoded(node: impl Into<FlowNodeId>) -> EncodedKey {
50		Self {
51			node: node.into(),
52		}
53		.encode()
54	}
55
56	pub fn full_scan() -> EncodedKeyRange {
57		EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
58	}
59
60	fn start() -> EncodedKey {
61		let mut serializer = KeySerializer::with_capacity(2);
62		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8);
63		serializer.to_encoded_key()
64	}
65
66	fn end() -> EncodedKey {
67		let mut serializer = KeySerializer::with_capacity(2);
68		serializer.extend_u8(VERSION).extend_u8((Self::KIND as u8) - 1);
69		serializer.to_encoded_key()
70	}
71}
72
73#[derive(Debug, Clone, PartialEq)]
74pub struct FlowNodeByFlowKey {
75	pub flow: FlowId,
76	pub node: FlowNodeId,
77}
78
79impl EncodableKey for FlowNodeByFlowKey {
80	const KIND: KeyKind = KeyKind::FlowNodeByFlow;
81
82	fn encode(&self) -> EncodedKey {
83		let mut serializer = KeySerializer::with_capacity(18);
84		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_u64(self.flow).extend_u64(self.node);
85		serializer.to_encoded_key()
86	}
87
88	fn decode(key: &EncodedKey) -> Option<Self> {
89		let mut de = KeyDeserializer::from_bytes(key.as_slice());
90
91		let version = de.read_u8().ok()?;
92		if version != VERSION {
93			return None;
94		}
95
96		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
97		if kind != Self::KIND {
98			return None;
99		}
100
101		let flow = de.read_u64().ok()?;
102		let node = de.read_u64().ok()?;
103
104		Some(Self {
105			flow: FlowId(flow),
106			node: FlowNodeId(node),
107		})
108	}
109}
110
111impl FlowNodeByFlowKey {
112	pub fn encoded(flow: impl Into<FlowId>, node: impl Into<FlowNodeId>) -> EncodedKey {
113		Self {
114			flow: flow.into(),
115			node: node.into(),
116		}
117		.encode()
118	}
119
120	pub fn full_scan(flow: FlowId) -> EncodedKeyRange {
121		EncodedKeyRange::start_end(Some(Self::start(flow)), Some(Self::end(flow)))
122	}
123
124	fn start(flow: FlowId) -> EncodedKey {
125		let mut serializer = KeySerializer::with_capacity(10);
126		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_u64(flow);
127		serializer.to_encoded_key()
128	}
129
130	fn end(flow: FlowId) -> EncodedKey {
131		let mut serializer = KeySerializer::with_capacity(10);
132		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_u64(FlowId(flow.0 - 1));
133		serializer.to_encoded_key()
134	}
135}
136
137#[cfg(test)]
138mod tests {
139	use super::{EncodableKey, FlowNodeByFlowKey, FlowNodeKey};
140	use crate::interface::catalog::{FlowId, FlowNodeId};
141
142	#[test]
143	fn test_flow_node_key_encode_decode() {
144		let key = FlowNodeKey {
145			node: FlowNodeId(0x1234),
146		};
147		let encoded = key.encode();
148		let decoded = FlowNodeKey::decode(&encoded).unwrap();
149		assert_eq!(decoded.node, FlowNodeId(0x1234));
150		assert_eq!(key, decoded);
151	}
152
153	#[test]
154	fn test_flow_node_by_flow_key_encode_decode() {
155		let key = FlowNodeByFlowKey {
156			flow: FlowId(0x42),
157			node: FlowNodeId(0x1234),
158		};
159		let encoded = key.encode();
160		let decoded = FlowNodeByFlowKey::decode(&encoded).unwrap();
161		assert_eq!(decoded.flow, FlowId(0x42));
162		assert_eq!(decoded.node, FlowNodeId(0x1234));
163		assert_eq!(key, decoded);
164	}
165}