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