1use 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
30pub struct KeySerializer {
32 buffer: Vec<u8>,
33}
34
35impl KeySerializer {
36 pub fn new() -> Self {
38 Self {
39 buffer: Vec::new(),
40 }
41 }
42
43 pub fn with_capacity(capacity: usize) -> Self {
45 Self {
46 buffer: Vec::with_capacity(capacity),
47 }
48 }
49
50 pub fn extend_bool(&mut self, value: bool) -> &mut Self {
52 self.buffer.push(encode_bool(value));
53 self
54 }
55
56 pub fn extend_f32(&mut self, value: f32) -> &mut Self {
58 self.buffer.extend_from_slice(&encode_f32(value));
59 self
60 }
61
62 pub fn extend_f64(&mut self, value: f64) -> &mut Self {
64 self.buffer.extend_from_slice(&encode_f64(value));
65 self
66 }
67
68 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 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 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 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 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 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 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 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 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 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 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 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 pub fn finish(self) -> Vec<u8> {
141 self.buffer
142 }
143
144 pub fn to_encoded_key(self) -> EncodedKey {
146 EncodedKey::new(self.buffer)
147 }
148
149 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 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 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 pub fn extend_raw(&mut self, bytes: &[u8]) -> &mut Self {
171 self.buffer.extend_from_slice(bytes);
172 self
173 }
174
175 pub fn len(&self) -> usize {
177 self.buffer.len()
178 }
179
180 pub fn is_empty(&self) -> bool {
182 self.buffer.is_empty()
183 }
184
185 pub fn extend_date(&mut self, date: &Date) -> &mut Self {
187 self.extend_i32(date.to_days_since_epoch())
188 }
189
190 pub fn extend_datetime(&mut self, datetime: &DateTime) -> &mut Self {
192 self.extend_i64(datetime.to_nanos_since_epoch())
193 }
194
195 pub fn extend_time(&mut self, time: &Time) -> &mut Self {
197 self.extend_u64(time.to_nanos_since_midnight())
198 }
199
200 pub fn extend_duration(&mut self, duration: &Duration) -> &mut Self {
202 self.extend_i64(duration.get_nanos())
203 }
204
205 pub fn extend_row_number(&mut self, row_number: &RowNumber) -> &mut Self {
207 self.extend_u64(row_number.0)
208 }
209
210 pub fn extend_identity_id(&mut self, id: &IdentityId) -> &mut Self {
212 self.extend_bytes(id.as_bytes())
213 }
214
215 pub fn extend_uuid4(&mut self, uuid: &Uuid4) -> &mut Self {
217 self.extend_bytes(uuid.as_bytes())
218 }
219
220 pub fn extend_uuid7(&mut self, uuid: &Uuid7) -> &mut Self {
222 self.extend_bytes(uuid.as_bytes())
223 }
224
225 pub fn extend_blob(&mut self, blob: &Blob) -> &mut Self {
227 self.extend_bytes(blob.as_ref())
228 }
229
230 pub fn extend_int(&mut self, int: &Int) -> &mut Self {
232 let (sign, bytes) = int.to_bytes_be();
234 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 pub fn extend_uint(&mut self, uint: &Uint) -> &mut Self {
246 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 pub fn extend_decimal(&mut self, decimal: &Decimal) -> &mut Self {
255 let s = decimal.to_string();
258 self.extend_str(&s);
259 self
260 }
261
262 pub fn extend_value(&mut self, value: &Value) -> &mut Self {
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(_) | 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 assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
720
721 let mut serializer = KeySerializer::new();
723 serializer.extend_bytes(&[0x01, 0xff, 0x02]);
724 let result = serializer.finish();
725 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 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 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 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 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 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 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 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 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 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); }
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); }
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); }
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); }
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); }
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 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 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 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 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 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 assert!(result.len() > 0);
958 }
959
960 #[test]
961 fn test_extend_value() {
962 let mut serializer = KeySerializer::new();
964 serializer.extend_value(&Value::none());
965 let result = serializer.finish();
966 assert_eq!(result, vec![0x00]);
967
968 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 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 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 assert_eq!(result.len(), 9);
1003 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1007 serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1008 let result2 = serializer2.finish();
1009
1010 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 assert_eq!(result.len(), 9);
1023 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1027 serializer2.extend_primitive_id(PrimitiveId::Table(TableId(987654322)));
1028 let result2 = serializer2.finish();
1029
1030 assert!(result2[1..] < result[1..]);
1033 }
1034}