reifydb_core/key/
column_sequence.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 crate::{
5	EncodedKey,
6	interface::{ColumnId, SourceId},
7	key::{EncodableKey, KeyKind},
8	util::encoding::keycode::{KeyDeserializer, KeySerializer},
9};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct ColumnSequenceKey {
13	pub source: SourceId,
14	pub column: ColumnId,
15}
16
17const VERSION: u8 = 1;
18
19impl EncodableKey for ColumnSequenceKey {
20	const KIND: KeyKind = KeyKind::ColumnSequence;
21
22	fn encode(&self) -> EncodedKey {
23		let mut serializer = KeySerializer::with_capacity(19); // 1 + 1 + 9 + 8
24		serializer
25			.extend_u8(VERSION)
26			.extend_u8(Self::KIND as u8)
27			.extend_source_id(self.source)
28			.extend_u64(self.column);
29		serializer.to_encoded_key()
30	}
31
32	fn decode(key: &EncodedKey) -> Option<Self> {
33		let mut de = KeyDeserializer::from_bytes(key.as_slice());
34
35		let version = de.read_u8().ok()?;
36		if version != VERSION {
37			return None;
38		}
39
40		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
41		if kind != Self::KIND {
42			return None;
43		}
44
45		let source = de.read_source_id().ok()?;
46		let column = de.read_u64().ok()?;
47
48		Some(Self {
49			source,
50			column: ColumnId(column),
51		})
52	}
53}
54
55#[cfg(test)]
56mod tests {
57	use super::{ColumnSequenceKey, EncodableKey};
58	use crate::{
59		EncodedKey,
60		interface::{ColumnId, SourceId},
61	};
62
63	#[test]
64	fn test_encode_decode() {
65		let key = ColumnSequenceKey {
66			source: SourceId::table(0x1234),
67			column: ColumnId(0x5678),
68		};
69		let encoded = key.encode();
70
71		assert_eq!(encoded[0], 0xFE); // version serialized
72		assert_eq!(encoded[1], 0xF1); // KeyKind::StoreColumnSequence serialized
73
74		// Test decode
75		let decoded = ColumnSequenceKey::decode(&encoded).unwrap();
76		assert_eq!(decoded.source, SourceId::table(0x1234));
77		assert_eq!(decoded.column, ColumnId(0x5678));
78	}
79
80	#[test]
81	fn test_decode_invalid_version() {
82		let mut encoded = vec![0xFF]; // wrong version
83		encoded.push(0x0E); // correct kind
84		encoded.extend(&[0; 16]); // payload
85
86		let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
87		assert!(decoded.is_none());
88	}
89
90	#[test]
91	fn test_decode_invalid_kind() {
92		let mut encoded = vec![0x01]; // correct version
93		encoded.push(0xFF); // wrong kind
94		encoded.extend(&[0; 16]); // payload
95
96		let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
97		assert!(decoded.is_none());
98	}
99
100	#[test]
101	fn test_decode_invalid_length() {
102		let encoded = vec![0x01, 0x0E]; // version and kind only, missing payload
103		let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
104		assert!(decoded.is_none());
105	}
106}