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
55impl ColumnSequenceKey {
56	pub fn encoded(source: impl Into<SourceId>, column: impl Into<ColumnId>) -> EncodedKey {
57		Self {
58			source: source.into(),
59			column: column.into(),
60		}
61		.encode()
62	}
63}
64
65#[cfg(test)]
66mod tests {
67	use super::{ColumnSequenceKey, EncodableKey};
68	use crate::{
69		EncodedKey,
70		interface::{ColumnId, SourceId},
71	};
72
73	#[test]
74	fn test_encode_decode() {
75		let key = ColumnSequenceKey {
76			source: SourceId::table(0x1234),
77			column: ColumnId(0x5678),
78		};
79		let encoded = key.encode();
80
81		assert_eq!(encoded[0], 0xFE); // version serialized
82		assert_eq!(encoded[1], 0xF1); // KeyKind::StoreColumnSequence serialized
83
84		// Test decode
85		let decoded = ColumnSequenceKey::decode(&encoded).unwrap();
86		assert_eq!(decoded.source, SourceId::table(0x1234));
87		assert_eq!(decoded.column, ColumnId(0x5678));
88	}
89
90	#[test]
91	fn test_decode_invalid_version() {
92		let mut encoded = vec![0xFF]; // wrong version
93		encoded.push(0x0E); // correct 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_kind() {
102		let mut encoded = vec![0x01]; // correct version
103		encoded.push(0xFF); // wrong kind
104		encoded.extend(&[0; 16]); // payload
105
106		let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
107		assert!(decoded.is_none());
108	}
109
110	#[test]
111	fn test_decode_invalid_length() {
112		let encoded = vec![0x01, 0x0E]; // version and kind only, missing payload
113		let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
114		assert!(decoded.is_none());
115	}
116}