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