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