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::IdentityId(id) => {
308				self.extend_identity_id(id);
309			}
310			Value::Uuid4(uuid) => {
311				self.extend_uuid4(uuid);
312			}
313			Value::Uuid7(uuid) => {
314				self.extend_uuid7(uuid);
315			}
316			Value::Blob(b) => {
317				self.extend_blob(b);
318			}
319			Value::Int(i) => {
320				self.extend_int(i);
321			}
322			Value::Uint(u) => {
323				self.extend_uint(u);
324			}
325			Value::Decimal(d) => {
326				self.extend_decimal(d);
327			}
328			Value::Any(_) => {
329				unreachable!("Any type cannot be serialized in keys");
330			}
331		}
332		self
333	}
334}
335
336impl Default for KeySerializer {
337	fn default() -> Self {
338		Self::new()
339	}
340}
341
342#[cfg(test)]
343mod tests {
344	use std::f64;
345
346	use reifydb_type::util::hex;
347
348	use super::*;
349	use crate::util::encoding::keycode::KeyDeserializer;
350
351	#[test]
352	fn test_new() {
353		let serializer = KeySerializer::new();
354		assert!(serializer.is_empty());
355		assert_eq!(serializer.len(), 0);
356	}
357
358	#[test]
359	fn test_with_capacity() {
360		let serializer = KeySerializer::with_capacity(100);
361		assert!(serializer.is_empty());
362		assert_eq!(serializer.len(), 0);
363	}
364
365	#[test]
366	fn test_extend_bool() {
367		let mut serializer = KeySerializer::new();
368		serializer.extend_bool(true);
369		let result = serializer.finish();
370		assert_eq!(result, vec![0x00]);
371		assert_eq!(hex::encode(&result), "00");
372
373		let mut serializer = KeySerializer::new();
374		serializer.extend_bool(false);
375		let result = serializer.finish();
376		assert_eq!(result, vec![0x01]);
377		assert_eq!(hex::encode(&result), "01");
378	}
379
380	#[test]
381	fn test_extend_f32() {
382		let mut serializer = KeySerializer::new();
383		serializer.extend_f32(3.14f32);
384		let result = serializer.finish();
385		assert_eq!(result.len(), 4);
386		assert_eq!(hex::encode(&result), "3fb70a3c");
387
388		let mut serializer = KeySerializer::new();
389		serializer.extend_f32(-3.14f32);
390		let result = serializer.finish();
391		assert_eq!(result.len(), 4);
392		assert_eq!(hex::encode(&result), "c048f5c3");
393
394		let mut serializer = KeySerializer::new();
395		serializer.extend_f32(0.0f32);
396		let result = serializer.finish();
397		assert_eq!(hex::encode(&result), "7fffffff");
398
399		let mut serializer = KeySerializer::new();
400		serializer.extend_f32(f32::MAX);
401		let result = serializer.finish();
402		assert_eq!(hex::encode(&result), "00800000");
403
404		let mut serializer = KeySerializer::new();
405		serializer.extend_f32(f32::MIN);
406		let result = serializer.finish();
407		assert_eq!(hex::encode(&result), "ff7fffff");
408	}
409
410	#[test]
411	fn test_extend_f64() {
412		let mut serializer = KeySerializer::new();
413		serializer.extend_f64(f64::consts::PI);
414		let result = serializer.finish();
415		assert_eq!(result.len(), 8);
416		assert_eq!(hex::encode(&result), "3ff6de04abbbd2e7");
417
418		let mut serializer = KeySerializer::new();
419		serializer.extend_f64(-f64::consts::PI);
420		let result = serializer.finish();
421		assert_eq!(result.len(), 8);
422		assert_eq!(hex::encode(&result), "c00921fb54442d18");
423
424		let mut serializer = KeySerializer::new();
425		serializer.extend_f64(0.0f64);
426		let result = serializer.finish();
427		assert_eq!(hex::encode(&result), "7fffffffffffffff");
428	}
429
430	#[test]
431	fn test_extend_i8() {
432		let mut serializer = KeySerializer::new();
433		serializer.extend_i8(0i8);
434		let result = serializer.finish();
435		assert_eq!(hex::encode(&result), "7f");
436
437		let mut serializer = KeySerializer::new();
438		serializer.extend_i8(1i8);
439		let result = serializer.finish();
440		assert_eq!(hex::encode(&result), "7e");
441
442		let mut serializer = KeySerializer::new();
443		serializer.extend_i8(-1i8);
444		let result = serializer.finish();
445		assert_eq!(hex::encode(&result), "80");
446
447		let mut serializer = KeySerializer::new();
448		serializer.extend_i8(i8::MAX);
449		let result = serializer.finish();
450		assert_eq!(hex::encode(&result), "00");
451
452		let mut serializer = KeySerializer::new();
453		serializer.extend_i8(i8::MIN);
454		let result = serializer.finish();
455		assert_eq!(hex::encode(&result), "ff");
456	}
457
458	#[test]
459	fn test_extend_i16() {
460		let mut serializer = KeySerializer::new();
461		serializer.extend_i16(0i16);
462		let result = serializer.finish();
463		assert_eq!(hex::encode(&result), "7fff");
464
465		let mut serializer = KeySerializer::new();
466		serializer.extend_i16(1i16);
467		let result = serializer.finish();
468		assert_eq!(hex::encode(&result), "7ffe");
469
470		let mut serializer = KeySerializer::new();
471		serializer.extend_i16(-1i16);
472		let result = serializer.finish();
473		assert_eq!(hex::encode(&result), "8000");
474
475		let mut serializer = KeySerializer::new();
476		serializer.extend_i16(i16::MAX);
477		let result = serializer.finish();
478		assert_eq!(hex::encode(&result), "0000");
479
480		let mut serializer = KeySerializer::new();
481		serializer.extend_i16(i16::MIN);
482		let result = serializer.finish();
483		assert_eq!(hex::encode(&result), "ffff");
484	}
485
486	#[test]
487	fn test_extend_i32() {
488		let mut serializer = KeySerializer::new();
489		serializer.extend_i32(0i32);
490		let result = serializer.finish();
491		assert_eq!(hex::encode(&result), "7fffffff");
492
493		let mut serializer = KeySerializer::new();
494		serializer.extend_i32(1i32);
495		let result = serializer.finish();
496		assert_eq!(hex::encode(&result), "7ffffffe");
497
498		let mut serializer = KeySerializer::new();
499		serializer.extend_i32(-1i32);
500		let result = serializer.finish();
501		assert_eq!(hex::encode(&result), "80000000");
502
503		let mut serializer = KeySerializer::new();
504		serializer.extend_i32(i32::MAX);
505		let result = serializer.finish();
506		assert_eq!(hex::encode(&result), "00000000");
507
508		let mut serializer = KeySerializer::new();
509		serializer.extend_i32(i32::MIN);
510		let result = serializer.finish();
511		assert_eq!(hex::encode(&result), "ffffffff");
512	}
513
514	#[test]
515	fn test_extend_i64() {
516		let mut serializer = KeySerializer::new();
517		serializer.extend_i64(0i64);
518		let result = serializer.finish();
519		assert_eq!(hex::encode(&result), "7fffffffffffffff");
520
521		let mut serializer = KeySerializer::new();
522		serializer.extend_i64(1i64);
523		let result = serializer.finish();
524		assert_eq!(hex::encode(&result), "7ffffffffffffffe");
525
526		let mut serializer = KeySerializer::new();
527		serializer.extend_i64(-1i64);
528		let result = serializer.finish();
529		assert_eq!(hex::encode(&result), "8000000000000000");
530
531		let mut serializer = KeySerializer::new();
532		serializer.extend_i64(i64::MAX);
533		let result = serializer.finish();
534		assert_eq!(hex::encode(&result), "0000000000000000");
535
536		let mut serializer = KeySerializer::new();
537		serializer.extend_i64(i64::MIN);
538		let result = serializer.finish();
539		assert_eq!(hex::encode(&result), "ffffffffffffffff");
540	}
541
542	#[test]
543	fn test_extend_i128() {
544		let mut serializer = KeySerializer::new();
545		serializer.extend_i128(0i128);
546		let result = serializer.finish();
547		assert_eq!(hex::encode(&result), "7fffffffffffffffffffffffffffffff");
548
549		let mut serializer = KeySerializer::new();
550		serializer.extend_i128(1i128);
551		let result = serializer.finish();
552		assert_eq!(hex::encode(&result), "7ffffffffffffffffffffffffffffffe");
553
554		let mut serializer = KeySerializer::new();
555		serializer.extend_i128(-1i128);
556		let result = serializer.finish();
557		assert_eq!(hex::encode(&result), "80000000000000000000000000000000");
558
559		let mut serializer = KeySerializer::new();
560		serializer.extend_i128(i128::MAX);
561		let result = serializer.finish();
562		assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
563
564		let mut serializer = KeySerializer::new();
565		serializer.extend_i128(i128::MIN);
566		let result = serializer.finish();
567		assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
568	}
569
570	#[test]
571	fn test_extend_u8() {
572		let mut serializer = KeySerializer::new();
573		serializer.extend_u8(0u8);
574		let result = serializer.finish();
575		assert_eq!(hex::encode(&result), "ff");
576
577		let mut serializer = KeySerializer::new();
578		serializer.extend_u8(1u8);
579		let result = serializer.finish();
580		assert_eq!(hex::encode(&result), "fe");
581
582		let mut serializer = KeySerializer::new();
583		serializer.extend_u8(255u8);
584		let result = serializer.finish();
585		assert_eq!(hex::encode(&result), "00");
586	}
587
588	#[test]
589	fn test_extend_u16() {
590		let mut serializer = KeySerializer::new();
591		serializer.extend_u16(0u16);
592		let result = serializer.finish();
593		assert_eq!(hex::encode(&result), "ffff");
594
595		let mut serializer = KeySerializer::new();
596		serializer.extend_u16(1u16);
597		let result = serializer.finish();
598		assert_eq!(hex::encode(&result), "fffe");
599
600		let mut serializer = KeySerializer::new();
601		serializer.extend_u16(255u16);
602		let result = serializer.finish();
603		assert_eq!(hex::encode(&result), "ff00");
604
605		let mut serializer = KeySerializer::new();
606		serializer.extend_u16(u16::MAX);
607		let result = serializer.finish();
608		assert_eq!(hex::encode(&result), "0000");
609	}
610
611	#[test]
612	fn test_extend_u32() {
613		let mut serializer = KeySerializer::new();
614		serializer.extend_u32(0u32);
615		let result = serializer.finish();
616		assert_eq!(hex::encode(&result), "ffffffff");
617
618		let mut serializer = KeySerializer::new();
619		serializer.extend_u32(1u32);
620		let result = serializer.finish();
621		assert_eq!(hex::encode(&result), "fffffffe");
622
623		let mut serializer = KeySerializer::new();
624		serializer.extend_u32(u32::MAX);
625		let result = serializer.finish();
626		assert_eq!(hex::encode(&result), "00000000");
627	}
628
629	#[test]
630	fn test_extend_u64() {
631		let mut serializer = KeySerializer::new();
632		serializer.extend_u64(0u64);
633		let result = serializer.finish();
634		assert_eq!(hex::encode(&result), "ffffffffffffffff");
635
636		let mut serializer = KeySerializer::new();
637		serializer.extend_u64(1u64);
638		let result = serializer.finish();
639		assert_eq!(hex::encode(&result), "fffffffffffffffe");
640
641		let mut serializer = KeySerializer::new();
642		serializer.extend_u64(65535u64);
643		let result = serializer.finish();
644		assert_eq!(hex::encode(&result), "ffffffffffff0000");
645
646		let mut serializer = KeySerializer::new();
647		serializer.extend_u64(u64::MAX);
648		let result = serializer.finish();
649		assert_eq!(hex::encode(&result), "0000000000000000");
650	}
651
652	#[test]
653	fn test_extend_u128() {
654		let mut serializer = KeySerializer::new();
655		serializer.extend_u128(0u128);
656		let result = serializer.finish();
657		assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
658
659		let mut serializer = KeySerializer::new();
660		serializer.extend_u128(1u128);
661		let result = serializer.finish();
662		assert_eq!(hex::encode(&result), "fffffffffffffffffffffffffffffffe");
663
664		let mut serializer = KeySerializer::new();
665		serializer.extend_u128(u128::MAX);
666		let result = serializer.finish();
667		assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
668	}
669
670	#[test]
671	fn test_extend_bytes() {
672		let mut serializer = KeySerializer::new();
673		serializer.extend_bytes(b"hello");
674		let result = serializer.finish();
675		// Should have "hello" plus terminator (0xff, 0xff)
676		assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
677
678		// Test with 0xff in the data
679		let mut serializer = KeySerializer::new();
680		serializer.extend_bytes(&[0x01, 0xff, 0x02]);
681		let result = serializer.finish();
682		// 0xff should be escaped as 0xff, 0x00
683		assert_eq!(result, vec![0x01, 0xff, 0x00, 0x02, 0xff, 0xff]);
684	}
685
686	#[test]
687	fn test_extend_str() {
688		let mut serializer = KeySerializer::new();
689		serializer.extend_str("hello world");
690		let result = serializer.finish();
691		// Should encode as UTF-8 bytes plus terminator
692		assert!(result.len() > "hello world".len());
693		assert!(result.ends_with(&[0xff, 0xff]));
694	}
695
696	#[test]
697	fn test_extend_raw() {
698		let mut serializer = KeySerializer::new();
699		serializer.extend_raw(&[0x01, 0x02, 0x03]);
700		let result = serializer.finish();
701		assert_eq!(result, vec![0x01, 0x02, 0x03]);
702	}
703
704	#[test]
705	fn test_chaining() {
706		let mut serializer = KeySerializer::new();
707		serializer.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
708		let result = serializer.finish();
709
710		// Should have bool (1 byte) + i32 (4 bytes) + "test" with terminator (6 bytes) + u64 (8 bytes)
711		assert!(result.len() >= 19);
712
713		let mut de = KeyDeserializer::from_bytes(&result);
714		assert_eq!(de.read_bool().unwrap(), true);
715		assert_eq!(de.read_i32().unwrap(), 42);
716		assert_eq!(de.read_str().unwrap(), "test");
717		assert_eq!(de.read_u64().unwrap(), 1000);
718		assert!(de.is_empty());
719	}
720
721	#[test]
722	fn test_ordering_descending_i32() {
723		// Test that descending order is preserved: larger values -> smaller bytes
724		let mut ser1 = KeySerializer::new();
725		ser1.extend_i32(1i32);
726		let bytes1 = ser1.finish();
727
728		let mut ser2 = KeySerializer::new();
729		ser2.extend_i32(100i32);
730		let bytes2 = ser2.finish();
731
732		let mut ser3 = KeySerializer::new();
733		ser3.extend_i32(1000i32);
734		let bytes3 = ser3.finish();
735
736		// In descending order: larger values encode to smaller bytes
737		// So: bytes_1000 < bytes_100 < bytes_1
738		assert!(bytes3 < bytes2, "encode(1000) should be < encode(100)");
739		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
740	}
741
742	#[test]
743	fn test_ordering_descending_u64() {
744		let mut ser1 = KeySerializer::new();
745		ser1.extend_u64(1u64);
746		let bytes1 = ser1.finish();
747
748		let mut ser2 = KeySerializer::new();
749		ser2.extend_u64(100u64);
750		let bytes2 = ser2.finish();
751
752		let mut ser3 = KeySerializer::new();
753		ser3.extend_u64(10000u64);
754		let bytes3 = ser3.finish();
755
756		// Descending: larger u64 -> smaller bytes
757		assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
758		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
759	}
760
761	#[test]
762	fn test_ordering_descending_negative() {
763		// Test negative numbers ordering
764		// In descending order: -1 > -100 > -1000
765		// So encoded bytes: encode(-1) < encode(-100) < encode(-1000)
766		let mut ser1 = KeySerializer::new();
767		ser1.extend_i32(-1i32);
768		let bytes_neg1 = ser1.finish();
769
770		let mut ser2 = KeySerializer::new();
771		ser2.extend_i32(-100i32);
772		let bytes_neg100 = ser2.finish();
773
774		let mut ser3 = KeySerializer::new();
775		ser3.extend_i32(-1000i32);
776		let bytes_neg1000 = ser3.finish();
777
778		// In descending: -1 > -100 > -1000, so encode(-1) < encode(-100) < encode(-1000)
779		assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
780		assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
781	}
782
783	#[test]
784	fn test_ordering_mixed_sign() {
785		// Test that positive/negative ordering is correct
786		let mut ser_neg = KeySerializer::new();
787		ser_neg.extend_i32(-1i32);
788		let bytes_neg = ser_neg.finish();
789
790		let mut ser_zero = KeySerializer::new();
791		ser_zero.extend_i32(0i32);
792		let bytes_zero = ser_zero.finish();
793
794		let mut ser_pos = KeySerializer::new();
795		ser_pos.extend_i32(1i32);
796		let bytes_pos = ser_pos.finish();
797
798		// In descending: 1 > 0 > -1, so encode(1) < encode(0) < encode(-1)
799		assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
800		assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
801	}
802
803	#[test]
804	fn test_date() {
805		use reifydb_type::Date;
806		let mut serializer = KeySerializer::new();
807		let date = Date::from_ymd(2024, 1, 1).unwrap();
808		serializer.extend_date(&date);
809		let result = serializer.finish();
810		assert_eq!(result.len(), 4); // i32 encoding
811	}
812
813	#[test]
814	fn test_datetime() {
815		use reifydb_type::DateTime;
816		let mut serializer = KeySerializer::new();
817		let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
818		serializer.extend_datetime(&datetime);
819		let result = serializer.finish();
820		assert_eq!(result.len(), 8); // i64 encoding
821	}
822
823	#[test]
824	fn test_time() {
825		use reifydb_type::Time;
826		let mut serializer = KeySerializer::new();
827		let time = Time::from_hms(12, 30, 45).unwrap();
828		serializer.extend_time(&time);
829		let result = serializer.finish();
830		assert_eq!(result.len(), 8); // u64 encoding
831	}
832
833	#[test]
834	fn test_interval() {
835		use reifydb_type::Duration;
836		let mut serializer = KeySerializer::new();
837		let duration = Duration::from_nanoseconds(1000000);
838		serializer.extend_duration(&duration);
839		let result = serializer.finish();
840		assert_eq!(result.len(), 8); // i64 encoding
841	}
842
843	#[test]
844	fn test_row_number() {
845		use reifydb_type::RowNumber;
846		let mut serializer = KeySerializer::new();
847		let row_number = RowNumber(42);
848		serializer.extend_row_number(&row_number);
849		let result = serializer.finish();
850		assert_eq!(result.len(), 8); // u64 encoding
851	}
852
853	#[test]
854	fn test_identity_id() {
855		use reifydb_type::IdentityId;
856		let mut serializer = KeySerializer::new();
857		let id = IdentityId::generate();
858		serializer.extend_identity_id(&id);
859		let result = serializer.finish();
860		assert!(result.len() > 0);
861	}
862
863	#[test]
864	fn test_uuid4() {
865		use reifydb_type::Uuid4;
866		let mut serializer = KeySerializer::new();
867		let uuid = Uuid4::generate();
868		serializer.extend_uuid4(&uuid);
869		let result = serializer.finish();
870		// UUID is 16 bytes plus encoding overhead
871		assert!(result.len() > 16);
872	}
873
874	#[test]
875	fn test_uuid7() {
876		use reifydb_type::Uuid7;
877		let mut serializer = KeySerializer::new();
878		let uuid = Uuid7::generate();
879		serializer.extend_uuid7(&uuid);
880		let result = serializer.finish();
881		// UUID is 16 bytes plus encoding overhead
882		assert!(result.len() > 16);
883	}
884
885	#[test]
886	fn test_blob() {
887		use reifydb_type::Blob;
888		let mut serializer = KeySerializer::new();
889		let blob = Blob::from(vec![0x01, 0x02, 0x03]);
890		serializer.extend_blob(&blob);
891		let result = serializer.finish();
892		// Should have data plus terminator
893		assert!(result.len() > 3);
894	}
895
896	#[test]
897	fn test_int() {
898		use num_bigint::BigInt;
899		use reifydb_type::Int;
900		let mut serializer = KeySerializer::new();
901		let int = Int(BigInt::from(42));
902		serializer.extend_int(&int);
903		let result = serializer.finish();
904		// Should have sign byte + length + data
905		assert!(result.len() > 0);
906	}
907
908	#[test]
909	fn test_uint() {
910		use num_bigint::BigInt;
911		use reifydb_type::Uint;
912		let mut serializer = KeySerializer::new();
913		let uint = Uint(BigInt::from(42));
914		serializer.extend_uint(&uint);
915		let result = serializer.finish();
916		// Should have length + data
917		assert!(result.len() > 0);
918	}
919
920	#[test]
921	fn test_decimal() {
922		use std::str::FromStr;
923
924		use reifydb_type::Decimal;
925		let mut serializer = KeySerializer::new();
926		let decimal = Decimal::from_str("3.14").unwrap();
927		serializer.extend_decimal(&decimal);
928		let result = serializer.finish();
929		// Should encode as string
930		assert!(result.len() > 0);
931	}
932
933	#[test]
934	fn test_extend_value() {
935		use reifydb_type::Value;
936
937		// Test undefined
938		let mut serializer = KeySerializer::new();
939		serializer.extend_value(&Value::Undefined);
940		let result = serializer.finish();
941		assert_eq!(result, vec![0x00]);
942
943		// Test boolean
944		let mut serializer = KeySerializer::new();
945		serializer.extend_value(&Value::Boolean(true));
946		let result = serializer.finish();
947		assert_eq!(result, vec![0x00]);
948
949		// Test integer
950		let mut serializer = KeySerializer::new();
951		serializer.extend_value(&Value::Int4(42));
952		let result = serializer.finish();
953		assert_eq!(result.len(), 4);
954
955		// Test string
956		let mut serializer = KeySerializer::new();
957		serializer.extend_value(&Value::Utf8("test".to_string()));
958		let result = serializer.finish();
959		assert!(result.ends_with(&[0xff, 0xff]));
960	}
961
962	#[test]
963	fn test_to_encoded_key() {
964		let mut serializer = KeySerializer::new();
965		serializer.extend_i32(42);
966		let key = serializer.to_encoded_key();
967		assert_eq!(key.len(), 4);
968	}
969
970	#[test]
971	fn test_index_id() {
972		use crate::interface::{IndexId, PrimaryKeyId};
973
974		let mut serializer = KeySerializer::new();
975		serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
976		let result = serializer.finish();
977
978		// IndexId Primary uses 1 byte prefix + 8 bytes u64 with bitwise NOT
979		assert_eq!(result.len(), 9);
980		assert_eq!(result[0], 0x01); // Primary variant prefix
981
982		// Verify it's using bitwise NOT (smaller values produce larger encoded values)
983		let mut serializer2 = KeySerializer::new();
984		serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
985		let result2 = serializer2.finish();
986
987		// result2 (for IndexId(1)) should be > result (for IndexId(123456789))
988		// Compare from byte 1 onwards (after the variant prefix)
989		assert!(result2[1..] > result[1..]);
990	}
991
992	#[test]
993	fn test_source_id() {
994		use crate::interface::{SourceId, TableId};
995
996		let mut serializer = KeySerializer::new();
997		serializer.extend_source_id(SourceId::Table(TableId(987654321)));
998		let result = serializer.finish();
999
1000		// SourceId Table uses 1 byte prefix + 8 bytes u64 with bitwise NOT
1001		assert_eq!(result.len(), 9);
1002		assert_eq!(result[0], 0x01); // Table variant prefix
1003
1004		// Verify ordering
1005		let mut serializer2 = KeySerializer::new();
1006		serializer2.extend_source_id(SourceId::Table(TableId(987654322)));
1007		let result2 = serializer2.finish();
1008
1009		// result2 (for larger SourceId) should be < result (inverted ordering)
1010		// Compare from byte 1 onwards (after the variant prefix)
1011		assert!(result2[1..] < result[1..]);
1012	}
1013}