Skip to main content

reifydb_core/util/encoding/keycode/
serializer.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::value::{
5	Value,
6	blob::Blob,
7	date::Date,
8	datetime::DateTime,
9	decimal::Decimal,
10	duration::Duration,
11	identity::IdentityId,
12	int::Int,
13	row_number::RowNumber,
14	time::Time,
15	uint::Uint,
16	uuid::{Uuid4, Uuid7},
17};
18use serde::Serialize;
19
20use super::{
21	catalog, encode_bool, encode_bytes, encode_f32, encode_f64, encode_i8, encode_i16, encode_i32, encode_i64,
22	encode_i128, encode_u8, encode_u16, encode_u32, encode_u64, encode_u128, serialize,
23};
24use crate::{
25	encoded::key::EncodedKey,
26	interface::catalog::{id::IndexId, primitive::PrimitiveId},
27};
28
29/// A builder for constructing binary keys using keycode encoding
30pub struct KeySerializer {
31	buffer: Vec<u8>,
32}
33
34impl KeySerializer {
35	/// Create new serializer with default capacity
36	pub fn new() -> Self {
37		Self {
38			buffer: Vec::new(),
39		}
40	}
41
42	/// Create with pre-allocated capacity
43	pub fn with_capacity(capacity: usize) -> Self {
44		Self {
45			buffer: Vec::with_capacity(capacity),
46		}
47	}
48
49	/// Extend with bool value
50	pub fn extend_bool(&mut self, value: bool) -> &mut Self {
51		self.buffer.push(encode_bool(value));
52		self
53	}
54
55	/// Extend with f32 value
56	pub fn extend_f32(&mut self, value: f32) -> &mut Self {
57		self.buffer.extend_from_slice(&encode_f32(value));
58		self
59	}
60
61	/// Extend with f64 value
62	pub fn extend_f64(&mut self, value: f64) -> &mut Self {
63		self.buffer.extend_from_slice(&encode_f64(value));
64		self
65	}
66
67	/// Extend with i8 value
68	pub fn extend_i8<T: Into<i8>>(&mut self, value: T) -> &mut Self {
69		self.buffer.extend_from_slice(&encode_i8(value.into()));
70		self
71	}
72
73	/// Extend with i16 value
74	pub fn extend_i16<T: Into<i16>>(&mut self, value: T) -> &mut Self {
75		self.buffer.extend_from_slice(&encode_i16(value.into()));
76		self
77	}
78
79	/// Extend with i32 value
80	pub fn extend_i32<T: Into<i32>>(&mut self, value: T) -> &mut Self {
81		self.buffer.extend_from_slice(&encode_i32(value.into()));
82		self
83	}
84
85	/// Extend with i64 value
86	pub fn extend_i64<T: Into<i64>>(&mut self, value: T) -> &mut Self {
87		self.buffer.extend_from_slice(&encode_i64(value.into()));
88		self
89	}
90
91	/// Extend with i128 value
92	pub fn extend_i128<T: Into<i128>>(&mut self, value: T) -> &mut Self {
93		self.buffer.extend_from_slice(&encode_i128(value.into()));
94		self
95	}
96
97	/// Extend with u8 value
98	pub fn extend_u8<T: Into<u8>>(&mut self, value: T) -> &mut Self {
99		self.buffer.push(encode_u8(value.into()));
100		self
101	}
102
103	/// Extend with u16 value
104	pub fn extend_u16<T: Into<u16>>(&mut self, value: T) -> &mut Self {
105		self.buffer.extend_from_slice(&encode_u16(value.into()));
106		self
107	}
108
109	/// Extend with u32 value
110	pub fn extend_u32<T: Into<u32>>(&mut self, value: T) -> &mut Self {
111		self.buffer.extend_from_slice(&encode_u32(value.into()));
112		self
113	}
114
115	/// Extend with u64 value
116	pub fn extend_u64<T: Into<u64>>(&mut self, value: T) -> &mut Self {
117		self.buffer.extend_from_slice(&encode_u64(value.into()));
118		self
119	}
120
121	/// Extend with u128 value
122	pub fn extend_u128<T: Into<u128>>(&mut self, value: T) -> &mut Self {
123		self.buffer.extend_from_slice(&encode_u128(value.into()));
124		self
125	}
126
127	/// Extend with raw bytes
128	pub fn extend_bytes<T: AsRef<[u8]>>(&mut self, bytes: T) -> &mut Self {
129		encode_bytes(bytes.as_ref(), &mut self.buffer);
130		self
131	}
132
133	/// Extend with string (UTF-8 bytes)
134	pub fn extend_str<T: AsRef<str>>(&mut self, s: T) -> &mut Self {
135		self.extend_bytes(s.as_ref().as_bytes())
136	}
137
138	/// Consume serializer and return final buffer
139	pub fn finish(self) -> Vec<u8> {
140		self.buffer
141	}
142
143	/// Consume serializer and return an EncodedKey directly
144	pub fn to_encoded_key(self) -> EncodedKey {
145		EncodedKey::new(self.buffer)
146	}
147
148	/// Extend with a PrimitiveId value (includes type discriminator)
149	pub fn extend_primitive_id(&mut self, primitive: impl Into<PrimitiveId>) -> &mut Self {
150		let primitive = primitive.into();
151		self.buffer.extend_from_slice(&catalog::serialize_primitive_id(&primitive));
152		self
153	}
154
155	/// Extend with an IndexId value (includes type discriminator)  
156	pub fn extend_index_id(&mut self, index: impl Into<IndexId>) -> &mut Self {
157		let index = index.into();
158		self.buffer.extend_from_slice(&catalog::serialize_index_id(&index));
159		self
160	}
161
162	/// Extend with a serializable value using keycode encoding
163	pub fn extend_serialize<T: Serialize>(&mut self, value: &T) -> &mut Self {
164		self.buffer.extend_from_slice(&serialize(value));
165		self
166	}
167
168	/// Extend with raw bytes (no encoding)
169	pub fn extend_raw(&mut self, bytes: &[u8]) -> &mut Self {
170		self.buffer.extend_from_slice(bytes);
171		self
172	}
173
174	/// Get current buffer length
175	pub fn len(&self) -> usize {
176		self.buffer.len()
177	}
178
179	/// Check if buffer is empty
180	pub fn is_empty(&self) -> bool {
181		self.buffer.is_empty()
182	}
183
184	/// Extend with Date value
185	pub fn extend_date(&mut self, date: &Date) -> &mut Self {
186		self.extend_i32(date.to_days_since_epoch())
187	}
188
189	/// Extend with DateTime value
190	pub fn extend_datetime(&mut self, datetime: &DateTime) -> &mut Self {
191		self.extend_i64(datetime.to_nanos_since_epoch())
192	}
193
194	/// Extend with Time value
195	pub fn extend_time(&mut self, time: &Time) -> &mut Self {
196		self.extend_u64(time.to_nanos_since_midnight())
197	}
198
199	/// Extend with Duration value
200	pub fn extend_duration(&mut self, duration: &Duration) -> &mut Self {
201		self.extend_i64(duration.get_nanos())
202	}
203
204	/// Extend with RowNumber value
205	pub fn extend_row_number(&mut self, row_number: &RowNumber) -> &mut Self {
206		self.extend_u64(row_number.0)
207	}
208
209	/// Extend with IdentityId value
210	pub fn extend_identity_id(&mut self, id: &IdentityId) -> &mut Self {
211		self.extend_bytes(id.as_bytes())
212	}
213
214	/// Extend with Uuid4 value
215	pub fn extend_uuid4(&mut self, uuid: &Uuid4) -> &mut Self {
216		self.extend_bytes(uuid.as_bytes())
217	}
218
219	/// Extend with Uuid7 value
220	pub fn extend_uuid7(&mut self, uuid: &Uuid7) -> &mut Self {
221		self.extend_bytes(uuid.as_bytes())
222	}
223
224	/// Extend with Blob value
225	pub fn extend_blob(&mut self, blob: &Blob) -> &mut Self {
226		self.extend_bytes(blob.as_ref())
227	}
228
229	/// Extend with arbitrary precision Int value
230	pub fn extend_int(&mut self, int: &Int) -> &mut Self {
231		// For arbitrary precision, encode as bytes with sign prefix
232		let (sign, bytes) = int.to_bytes_be();
233		// Encode sign as a byte (0 for negative, 1 for positive)
234		self.buffer.push(match sign {
235			num_bigint::Sign::Minus => 0,
236			_ => 1,
237		});
238		self.extend_u32(bytes.len() as u32);
239		self.extend_bytes(&bytes);
240		self
241	}
242
243	/// Extend with arbitrary precision Uint value
244	pub fn extend_uint(&mut self, uint: &Uint) -> &mut Self {
245		// For arbitrary precision unsigned, encode as bytes with length prefix
246		let (_sign, bytes) = uint.0.to_bytes_be();
247		self.extend_u32(bytes.len() as u32);
248		self.extend_bytes(&bytes);
249		self
250	}
251
252	/// Extend with Decimal value
253	pub fn extend_decimal(&mut self, decimal: &Decimal) -> &mut Self {
254		// Encode decimal as string representation for now
255		// This ensures ordering is preserved for decimal values
256		let s = decimal.to_string();
257		self.extend_str(&s);
258		self
259	}
260
261	/// Extend with a Value based on its type
262	pub fn extend_value(&mut self, value: &Value) -> &mut Self {
263		use reifydb_type::value::Value;
264		match value {
265			Value::None {
266				..
267			} => {
268				// For undefined, use a special marker byte
269				self.buffer.push(0x00);
270			}
271			Value::Boolean(b) => {
272				self.extend_bool(*b);
273			}
274			Value::Float4(f) => {
275				self.extend_f32(**f);
276			}
277			Value::Float8(f) => {
278				self.extend_f64(**f);
279			}
280			Value::Int1(i) => {
281				self.extend_i8(*i);
282			}
283			Value::Int2(i) => {
284				self.extend_i16(*i);
285			}
286			Value::Int4(i) => {
287				self.extend_i32(*i);
288			}
289			Value::Int8(i) => {
290				self.extend_i64(*i);
291			}
292			Value::Int16(i) => {
293				self.extend_i128(*i);
294			}
295			Value::Utf8(s) => {
296				self.extend_str(s);
297			}
298			Value::Uint1(u) => {
299				self.extend_u8(*u);
300			}
301			Value::Uint2(u) => {
302				self.extend_u16(*u);
303			}
304			Value::Uint4(u) => {
305				self.extend_u32(*u);
306			}
307			Value::Uint8(u) => {
308				self.extend_u64(*u);
309			}
310			Value::Uint16(u) => {
311				self.extend_u128(*u);
312			}
313			Value::Date(d) => {
314				self.extend_date(d);
315			}
316			Value::DateTime(dt) => {
317				self.extend_datetime(dt);
318			}
319			Value::Time(t) => {
320				self.extend_time(t);
321			}
322			Value::Duration(i) => {
323				self.extend_duration(i);
324			}
325			Value::IdentityId(id) => {
326				self.extend_identity_id(id);
327			}
328			Value::Uuid4(uuid) => {
329				self.extend_uuid4(uuid);
330			}
331			Value::Uuid7(uuid) => {
332				self.extend_uuid7(uuid);
333			}
334			Value::Blob(b) => {
335				self.extend_blob(b);
336			}
337			Value::Int(i) => {
338				self.extend_int(i);
339			}
340			Value::Uint(u) => {
341				self.extend_uint(u);
342			}
343			Value::Decimal(d) => {
344				self.extend_decimal(d);
345			}
346			Value::Any(_) | Value::Type(_) => {
347				unreachable!("Any/Type values cannot be serialized in keys");
348			}
349			Value::DictionaryId(id) => {
350				self.extend_u128(id.to_u128());
351			}
352		}
353		self
354	}
355}
356
357impl Default for KeySerializer {
358	fn default() -> Self {
359		Self::new()
360	}
361}
362
363#[cfg(test)]
364pub mod tests {
365	use std::f64;
366
367	use reifydb_type::util::hex;
368
369	use crate::util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer};
370
371	#[test]
372	fn test_new() {
373		let serializer = KeySerializer::new();
374		assert!(serializer.is_empty());
375		assert_eq!(serializer.len(), 0);
376	}
377
378	#[test]
379	fn test_with_capacity() {
380		let serializer = KeySerializer::with_capacity(100);
381		assert!(serializer.is_empty());
382		assert_eq!(serializer.len(), 0);
383	}
384
385	#[test]
386	fn test_extend_bool() {
387		let mut serializer = KeySerializer::new();
388		serializer.extend_bool(true);
389		let result = serializer.finish();
390		assert_eq!(result, vec![0x00]);
391		assert_eq!(hex::encode(&result), "00");
392
393		let mut serializer = KeySerializer::new();
394		serializer.extend_bool(false);
395		let result = serializer.finish();
396		assert_eq!(result, vec![0x01]);
397		assert_eq!(hex::encode(&result), "01");
398	}
399
400	#[test]
401	fn test_extend_f32() {
402		let mut serializer = KeySerializer::new();
403		serializer.extend_f32(3.14f32);
404		let result = serializer.finish();
405		assert_eq!(result.len(), 4);
406		assert_eq!(hex::encode(&result), "3fb70a3c");
407
408		let mut serializer = KeySerializer::new();
409		serializer.extend_f32(-3.14f32);
410		let result = serializer.finish();
411		assert_eq!(result.len(), 4);
412		assert_eq!(hex::encode(&result), "c048f5c3");
413
414		let mut serializer = KeySerializer::new();
415		serializer.extend_f32(0.0f32);
416		let result = serializer.finish();
417		assert_eq!(hex::encode(&result), "7fffffff");
418
419		let mut serializer = KeySerializer::new();
420		serializer.extend_f32(f32::MAX);
421		let result = serializer.finish();
422		assert_eq!(hex::encode(&result), "00800000");
423
424		let mut serializer = KeySerializer::new();
425		serializer.extend_f32(f32::MIN);
426		let result = serializer.finish();
427		assert_eq!(hex::encode(&result), "ff7fffff");
428	}
429
430	#[test]
431	fn test_extend_f64() {
432		let mut serializer = KeySerializer::new();
433		serializer.extend_f64(f64::consts::PI);
434		let result = serializer.finish();
435		assert_eq!(result.len(), 8);
436		assert_eq!(hex::encode(&result), "3ff6de04abbbd2e7");
437
438		let mut serializer = KeySerializer::new();
439		serializer.extend_f64(-f64::consts::PI);
440		let result = serializer.finish();
441		assert_eq!(result.len(), 8);
442		assert_eq!(hex::encode(&result), "c00921fb54442d18");
443
444		let mut serializer = KeySerializer::new();
445		serializer.extend_f64(0.0f64);
446		let result = serializer.finish();
447		assert_eq!(hex::encode(&result), "7fffffffffffffff");
448	}
449
450	#[test]
451	fn test_extend_i8() {
452		let mut serializer = KeySerializer::new();
453		serializer.extend_i8(0i8);
454		let result = serializer.finish();
455		assert_eq!(hex::encode(&result), "7f");
456
457		let mut serializer = KeySerializer::new();
458		serializer.extend_i8(1i8);
459		let result = serializer.finish();
460		assert_eq!(hex::encode(&result), "7e");
461
462		let mut serializer = KeySerializer::new();
463		serializer.extend_i8(-1i8);
464		let result = serializer.finish();
465		assert_eq!(hex::encode(&result), "80");
466
467		let mut serializer = KeySerializer::new();
468		serializer.extend_i8(i8::MAX);
469		let result = serializer.finish();
470		assert_eq!(hex::encode(&result), "00");
471
472		let mut serializer = KeySerializer::new();
473		serializer.extend_i8(i8::MIN);
474		let result = serializer.finish();
475		assert_eq!(hex::encode(&result), "ff");
476	}
477
478	#[test]
479	fn test_extend_i16() {
480		let mut serializer = KeySerializer::new();
481		serializer.extend_i16(0i16);
482		let result = serializer.finish();
483		assert_eq!(hex::encode(&result), "7fff");
484
485		let mut serializer = KeySerializer::new();
486		serializer.extend_i16(1i16);
487		let result = serializer.finish();
488		assert_eq!(hex::encode(&result), "7ffe");
489
490		let mut serializer = KeySerializer::new();
491		serializer.extend_i16(-1i16);
492		let result = serializer.finish();
493		assert_eq!(hex::encode(&result), "8000");
494
495		let mut serializer = KeySerializer::new();
496		serializer.extend_i16(i16::MAX);
497		let result = serializer.finish();
498		assert_eq!(hex::encode(&result), "0000");
499
500		let mut serializer = KeySerializer::new();
501		serializer.extend_i16(i16::MIN);
502		let result = serializer.finish();
503		assert_eq!(hex::encode(&result), "ffff");
504	}
505
506	#[test]
507	fn test_extend_i32() {
508		let mut serializer = KeySerializer::new();
509		serializer.extend_i32(0i32);
510		let result = serializer.finish();
511		assert_eq!(hex::encode(&result), "7fffffff");
512
513		let mut serializer = KeySerializer::new();
514		serializer.extend_i32(1i32);
515		let result = serializer.finish();
516		assert_eq!(hex::encode(&result), "7ffffffe");
517
518		let mut serializer = KeySerializer::new();
519		serializer.extend_i32(-1i32);
520		let result = serializer.finish();
521		assert_eq!(hex::encode(&result), "80000000");
522
523		let mut serializer = KeySerializer::new();
524		serializer.extend_i32(i32::MAX);
525		let result = serializer.finish();
526		assert_eq!(hex::encode(&result), "00000000");
527
528		let mut serializer = KeySerializer::new();
529		serializer.extend_i32(i32::MIN);
530		let result = serializer.finish();
531		assert_eq!(hex::encode(&result), "ffffffff");
532	}
533
534	#[test]
535	fn test_extend_i64() {
536		let mut serializer = KeySerializer::new();
537		serializer.extend_i64(0i64);
538		let result = serializer.finish();
539		assert_eq!(hex::encode(&result), "7fffffffffffffff");
540
541		let mut serializer = KeySerializer::new();
542		serializer.extend_i64(1i64);
543		let result = serializer.finish();
544		assert_eq!(hex::encode(&result), "7ffffffffffffffe");
545
546		let mut serializer = KeySerializer::new();
547		serializer.extend_i64(-1i64);
548		let result = serializer.finish();
549		assert_eq!(hex::encode(&result), "8000000000000000");
550
551		let mut serializer = KeySerializer::new();
552		serializer.extend_i64(i64::MAX);
553		let result = serializer.finish();
554		assert_eq!(hex::encode(&result), "0000000000000000");
555
556		let mut serializer = KeySerializer::new();
557		serializer.extend_i64(i64::MIN);
558		let result = serializer.finish();
559		assert_eq!(hex::encode(&result), "ffffffffffffffff");
560	}
561
562	#[test]
563	fn test_extend_i128() {
564		let mut serializer = KeySerializer::new();
565		serializer.extend_i128(0i128);
566		let result = serializer.finish();
567		assert_eq!(hex::encode(&result), "7fffffffffffffffffffffffffffffff");
568
569		let mut serializer = KeySerializer::new();
570		serializer.extend_i128(1i128);
571		let result = serializer.finish();
572		assert_eq!(hex::encode(&result), "7ffffffffffffffffffffffffffffffe");
573
574		let mut serializer = KeySerializer::new();
575		serializer.extend_i128(-1i128);
576		let result = serializer.finish();
577		assert_eq!(hex::encode(&result), "80000000000000000000000000000000");
578
579		let mut serializer = KeySerializer::new();
580		serializer.extend_i128(i128::MAX);
581		let result = serializer.finish();
582		assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
583
584		let mut serializer = KeySerializer::new();
585		serializer.extend_i128(i128::MIN);
586		let result = serializer.finish();
587		assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
588	}
589
590	#[test]
591	fn test_extend_u8() {
592		let mut serializer = KeySerializer::new();
593		serializer.extend_u8(0u8);
594		let result = serializer.finish();
595		assert_eq!(hex::encode(&result), "ff");
596
597		let mut serializer = KeySerializer::new();
598		serializer.extend_u8(1u8);
599		let result = serializer.finish();
600		assert_eq!(hex::encode(&result), "fe");
601
602		let mut serializer = KeySerializer::new();
603		serializer.extend_u8(255u8);
604		let result = serializer.finish();
605		assert_eq!(hex::encode(&result), "00");
606	}
607
608	#[test]
609	fn test_extend_u16() {
610		let mut serializer = KeySerializer::new();
611		serializer.extend_u16(0u16);
612		let result = serializer.finish();
613		assert_eq!(hex::encode(&result), "ffff");
614
615		let mut serializer = KeySerializer::new();
616		serializer.extend_u16(1u16);
617		let result = serializer.finish();
618		assert_eq!(hex::encode(&result), "fffe");
619
620		let mut serializer = KeySerializer::new();
621		serializer.extend_u16(255u16);
622		let result = serializer.finish();
623		assert_eq!(hex::encode(&result), "ff00");
624
625		let mut serializer = KeySerializer::new();
626		serializer.extend_u16(u16::MAX);
627		let result = serializer.finish();
628		assert_eq!(hex::encode(&result), "0000");
629	}
630
631	#[test]
632	fn test_extend_u32() {
633		let mut serializer = KeySerializer::new();
634		serializer.extend_u32(0u32);
635		let result = serializer.finish();
636		assert_eq!(hex::encode(&result), "ffffffff");
637
638		let mut serializer = KeySerializer::new();
639		serializer.extend_u32(1u32);
640		let result = serializer.finish();
641		assert_eq!(hex::encode(&result), "fffffffe");
642
643		let mut serializer = KeySerializer::new();
644		serializer.extend_u32(u32::MAX);
645		let result = serializer.finish();
646		assert_eq!(hex::encode(&result), "00000000");
647	}
648
649	#[test]
650	fn test_extend_u64() {
651		let mut serializer = KeySerializer::new();
652		serializer.extend_u64(0u64);
653		let result = serializer.finish();
654		assert_eq!(hex::encode(&result), "ffffffffffffffff");
655
656		let mut serializer = KeySerializer::new();
657		serializer.extend_u64(1u64);
658		let result = serializer.finish();
659		assert_eq!(hex::encode(&result), "fffffffffffffffe");
660
661		let mut serializer = KeySerializer::new();
662		serializer.extend_u64(65535u64);
663		let result = serializer.finish();
664		assert_eq!(hex::encode(&result), "ffffffffffff0000");
665
666		let mut serializer = KeySerializer::new();
667		serializer.extend_u64(u64::MAX);
668		let result = serializer.finish();
669		assert_eq!(hex::encode(&result), "0000000000000000");
670	}
671
672	#[test]
673	fn test_extend_u128() {
674		let mut serializer = KeySerializer::new();
675		serializer.extend_u128(0u128);
676		let result = serializer.finish();
677		assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
678
679		let mut serializer = KeySerializer::new();
680		serializer.extend_u128(1u128);
681		let result = serializer.finish();
682		assert_eq!(hex::encode(&result), "fffffffffffffffffffffffffffffffe");
683
684		let mut serializer = KeySerializer::new();
685		serializer.extend_u128(u128::MAX);
686		let result = serializer.finish();
687		assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
688	}
689
690	#[test]
691	fn test_extend_bytes() {
692		let mut serializer = KeySerializer::new();
693		serializer.extend_bytes(b"hello");
694		let result = serializer.finish();
695		// Should have "hello" plus terminator (0xff, 0xff)
696		assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
697
698		// Test with 0xff in the data
699		let mut serializer = KeySerializer::new();
700		serializer.extend_bytes(&[0x01, 0xff, 0x02]);
701		let result = serializer.finish();
702		// 0xff should be escaped as 0xff, 0x00
703		assert_eq!(result, vec![0x01, 0xff, 0x00, 0x02, 0xff, 0xff]);
704	}
705
706	#[test]
707	fn test_extend_str() {
708		let mut serializer = KeySerializer::new();
709		serializer.extend_str("hello world");
710		let result = serializer.finish();
711		// Should encode as UTF-8 bytes plus terminator
712		assert!(result.len() > "hello world".len());
713		assert!(result.ends_with(&[0xff, 0xff]));
714	}
715
716	#[test]
717	fn test_extend_raw() {
718		let mut serializer = KeySerializer::new();
719		serializer.extend_raw(&[0x01, 0x02, 0x03]);
720		let result = serializer.finish();
721		assert_eq!(result, vec![0x01, 0x02, 0x03]);
722	}
723
724	#[test]
725	fn test_chaining() {
726		let mut serializer = KeySerializer::new();
727		serializer.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
728		let result = serializer.finish();
729
730		// Should have bool (1 byte) + i32 (4 bytes) + "test" with terminator (6 bytes) + u64 (8 bytes)
731		assert!(result.len() >= 19);
732
733		let mut de = KeyDeserializer::from_bytes(&result);
734		assert_eq!(de.read_bool().unwrap(), true);
735		assert_eq!(de.read_i32().unwrap(), 42);
736		assert_eq!(de.read_str().unwrap(), "test");
737		assert_eq!(de.read_u64().unwrap(), 1000);
738		assert!(de.is_empty());
739	}
740
741	#[test]
742	fn test_ordering_descending_i32() {
743		// Test that descending order is preserved: larger values -> smaller bytes
744		let mut ser1 = KeySerializer::new();
745		ser1.extend_i32(1i32);
746		let bytes1 = ser1.finish();
747
748		let mut ser2 = KeySerializer::new();
749		ser2.extend_i32(100i32);
750		let bytes2 = ser2.finish();
751
752		let mut ser3 = KeySerializer::new();
753		ser3.extend_i32(1000i32);
754		let bytes3 = ser3.finish();
755
756		// In descending order: larger values encode to smaller bytes
757		// So: bytes_1000 < bytes_100 < bytes_1
758		assert!(bytes3 < bytes2, "encode(1000) should be < encode(100)");
759		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
760	}
761
762	#[test]
763	fn test_ordering_descending_u64() {
764		let mut ser1 = KeySerializer::new();
765		ser1.extend_u64(1u64);
766		let bytes1 = ser1.finish();
767
768		let mut ser2 = KeySerializer::new();
769		ser2.extend_u64(100u64);
770		let bytes2 = ser2.finish();
771
772		let mut ser3 = KeySerializer::new();
773		ser3.extend_u64(10000u64);
774		let bytes3 = ser3.finish();
775
776		// Descending: larger u64 -> smaller bytes
777		assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
778		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
779	}
780
781	#[test]
782	fn test_ordering_descending_negative() {
783		// Test negative numbers ordering
784		// In descending order: -1 > -100 > -1000
785		// So encoded bytes: encode(-1) < encode(-100) < encode(-1000)
786		let mut ser1 = KeySerializer::new();
787		ser1.extend_i32(-1i32);
788		let bytes_neg1 = ser1.finish();
789
790		let mut ser2 = KeySerializer::new();
791		ser2.extend_i32(-100i32);
792		let bytes_neg100 = ser2.finish();
793
794		let mut ser3 = KeySerializer::new();
795		ser3.extend_i32(-1000i32);
796		let bytes_neg1000 = ser3.finish();
797
798		// In descending: -1 > -100 > -1000, so encode(-1) < encode(-100) < encode(-1000)
799		assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
800		assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
801	}
802
803	#[test]
804	fn test_ordering_mixed_sign() {
805		// Test that positive/negative ordering is correct
806		let mut ser_neg = KeySerializer::new();
807		ser_neg.extend_i32(-1i32);
808		let bytes_neg = ser_neg.finish();
809
810		let mut ser_zero = KeySerializer::new();
811		ser_zero.extend_i32(0i32);
812		let bytes_zero = ser_zero.finish();
813
814		let mut ser_pos = KeySerializer::new();
815		ser_pos.extend_i32(1i32);
816		let bytes_pos = ser_pos.finish();
817
818		// In descending: 1 > 0 > -1, so encode(1) < encode(0) < encode(-1)
819		assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
820		assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
821	}
822
823	#[test]
824	fn test_date() {
825		use reifydb_type::value::date::Date;
826		let mut serializer = KeySerializer::new();
827		let date = Date::from_ymd(2024, 1, 1).unwrap();
828		serializer.extend_date(&date);
829		let result = serializer.finish();
830		assert_eq!(result.len(), 4); // i32 encoding
831	}
832
833	#[test]
834	fn test_datetime() {
835		use reifydb_type::value::datetime::DateTime;
836		let mut serializer = KeySerializer::new();
837		let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
838		serializer.extend_datetime(&datetime);
839		let result = serializer.finish();
840		assert_eq!(result.len(), 8); // i64 encoding
841	}
842
843	#[test]
844	fn test_time() {
845		use reifydb_type::value::time::Time;
846		let mut serializer = KeySerializer::new();
847		let time = Time::from_hms(12, 30, 45).unwrap();
848		serializer.extend_time(&time);
849		let result = serializer.finish();
850		assert_eq!(result.len(), 8); // u64 encoding
851	}
852
853	#[test]
854	fn test_interval() {
855		use reifydb_type::value::duration::Duration;
856		let mut serializer = KeySerializer::new();
857		let duration = Duration::from_nanoseconds(1000000);
858		serializer.extend_duration(&duration);
859		let result = serializer.finish();
860		assert_eq!(result.len(), 8); // i64 encoding
861	}
862
863	#[test]
864	fn test_row_number() {
865		use reifydb_type::value::row_number::RowNumber;
866		let mut serializer = KeySerializer::new();
867		let row_number = RowNumber(42);
868		serializer.extend_row_number(&row_number);
869		let result = serializer.finish();
870		assert_eq!(result.len(), 8); // u64 encoding
871	}
872
873	#[test]
874	fn test_identity_id() {
875		use reifydb_type::value::identity::IdentityId;
876		let mut serializer = KeySerializer::new();
877		let id = IdentityId::generate();
878		serializer.extend_identity_id(&id);
879		let result = serializer.finish();
880		assert!(result.len() > 0);
881	}
882
883	#[test]
884	fn test_uuid4() {
885		use reifydb_type::value::uuid::Uuid4;
886		let mut serializer = KeySerializer::new();
887		let uuid = Uuid4::generate();
888		serializer.extend_uuid4(&uuid);
889		let result = serializer.finish();
890		// UUID is 16 bytes plus encoding overhead
891		assert!(result.len() > 16);
892	}
893
894	#[test]
895	fn test_uuid7() {
896		use reifydb_type::value::uuid::Uuid7;
897		let mut serializer = KeySerializer::new();
898		let uuid = Uuid7::generate();
899		serializer.extend_uuid7(&uuid);
900		let result = serializer.finish();
901		// UUID is 16 bytes plus encoding overhead
902		assert!(result.len() > 16);
903	}
904
905	#[test]
906	fn test_blob() {
907		use reifydb_type::value::blob::Blob;
908		let mut serializer = KeySerializer::new();
909		let blob = Blob::from(vec![0x01, 0x02, 0x03]);
910		serializer.extend_blob(&blob);
911		let result = serializer.finish();
912		// Should have data plus terminator
913		assert!(result.len() > 3);
914	}
915
916	#[test]
917	fn test_int() {
918		use num_bigint::BigInt;
919		use reifydb_type::value::int::Int;
920		let mut serializer = KeySerializer::new();
921		let int = Int(BigInt::from(42));
922		serializer.extend_int(&int);
923		let result = serializer.finish();
924		// Should have sign byte + length + data
925		assert!(result.len() > 0);
926	}
927
928	#[test]
929	fn test_uint() {
930		use num_bigint::BigInt;
931		use reifydb_type::value::uint::Uint;
932		let mut serializer = KeySerializer::new();
933		let uint = Uint(BigInt::from(42));
934		serializer.extend_uint(&uint);
935		let result = serializer.finish();
936		// Should have length + data
937		assert!(result.len() > 0);
938	}
939
940	#[test]
941	fn test_decimal() {
942		use std::str::FromStr;
943
944		use reifydb_type::value::decimal::Decimal;
945		let mut serializer = KeySerializer::new();
946		let decimal = Decimal::from_str("3.14").unwrap();
947		serializer.extend_decimal(&decimal);
948		let result = serializer.finish();
949		// Should encode as string
950		assert!(result.len() > 0);
951	}
952
953	#[test]
954	fn test_extend_value() {
955		use reifydb_type::value::Value;
956
957		// Test undefined
958		let mut serializer = KeySerializer::new();
959		serializer.extend_value(&Value::none());
960		let result = serializer.finish();
961		assert_eq!(result, vec![0x00]);
962
963		// Test boolean
964		let mut serializer = KeySerializer::new();
965		serializer.extend_value(&Value::Boolean(true));
966		let result = serializer.finish();
967		assert_eq!(result, vec![0x00]);
968
969		// Test integer
970		let mut serializer = KeySerializer::new();
971		serializer.extend_value(&Value::Int4(42));
972		let result = serializer.finish();
973		assert_eq!(result.len(), 4);
974
975		// Test string
976		let mut serializer = KeySerializer::new();
977		serializer.extend_value(&Value::Utf8("test".to_string()));
978		let result = serializer.finish();
979		assert!(result.ends_with(&[0xff, 0xff]));
980	}
981
982	#[test]
983	fn test_to_encoded_key() {
984		let mut serializer = KeySerializer::new();
985		serializer.extend_i32(42);
986		let key = serializer.to_encoded_key();
987		assert_eq!(key.len(), 4);
988	}
989
990	#[test]
991	fn test_index_id() {
992		use crate::interface::catalog::id::{IndexId, PrimaryKeyId};
993
994		let mut serializer = KeySerializer::new();
995		serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
996		let result = serializer.finish();
997
998		// IndexId Primary uses 1 byte prefix + 8 bytes u64 with bitwise NOT
999		assert_eq!(result.len(), 9);
1000		assert_eq!(result[0], 0x01); // Primary variant prefix
1001
1002		// Verify it's using bitwise NOT (smaller values produce larger encoded values)
1003		let mut serializer2 = KeySerializer::new();
1004		serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1005		let result2 = serializer2.finish();
1006
1007		// result2 (for IndexId(1)) should be > result (for IndexId(123456789))
1008		// Compare from byte 1 onwards (after the variant prefix)
1009		assert!(result2[1..] > result[1..]);
1010	}
1011
1012	#[test]
1013	fn test_primitive_id() {
1014		use crate::interface::catalog::{id::TableId, primitive::PrimitiveId};
1015
1016		let mut serializer = KeySerializer::new();
1017		serializer.extend_primitive_id(PrimitiveId::Table(TableId(987654321)));
1018		let result = serializer.finish();
1019
1020		// PrimitiveId Table uses 1 byte prefix + 8 bytes u64 with bitwise NOT
1021		assert_eq!(result.len(), 9);
1022		assert_eq!(result[0], 0x01); // Table variant prefix
1023
1024		// Verify ordering
1025		let mut serializer2 = KeySerializer::new();
1026		serializer2.extend_primitive_id(PrimitiveId::Table(TableId(987654322)));
1027		let result2 = serializer2.finish();
1028
1029		// result2 (for larger PrimitiveId) should be < result (inverted ordering)
1030		// Compare from byte 1 onwards (after the variant prefix)
1031		assert!(result2[1..] < result[1..]);
1032	}
1033}