1use num_bigint::Sign;
5use reifydb_type::value::{
6 Value,
7 blob::Blob,
8 date::Date,
9 datetime::DateTime,
10 decimal::Decimal,
11 dictionary::DictionaryEntryId,
12 duration::Duration,
13 identity::IdentityId,
14 int::Int,
15 row_number::RowNumber,
16 time::Time,
17 r#type::Type,
18 uint::Uint,
19 uuid::{Uuid4, Uuid7},
20};
21use serde::Serialize;
22
23use super::{
24 catalog, encode_bool, encode_bytes, encode_f32, encode_f64, encode_i8, encode_i16, encode_i32, encode_i64,
25 encode_i128, encode_u8, encode_u16, encode_u32, encode_u64, encode_u128, serialize,
26};
27use crate::{
28 encoded::key::EncodedKey,
29 interface::catalog::{id::IndexId, schema::SchemaId},
30};
31
32pub struct KeySerializer {
34 buffer: Vec<u8>,
35}
36
37impl KeySerializer {
38 pub fn new() -> Self {
40 Self {
41 buffer: Vec::new(),
42 }
43 }
44
45 pub fn with_capacity(capacity: usize) -> Self {
47 Self {
48 buffer: Vec::with_capacity(capacity),
49 }
50 }
51
52 pub fn extend_bool(&mut self, value: bool) -> &mut Self {
54 self.buffer.push(encode_bool(value));
55 self
56 }
57
58 pub fn extend_f32(&mut self, value: f32) -> &mut Self {
60 self.buffer.extend_from_slice(&encode_f32(value));
61 self
62 }
63
64 pub fn extend_f64(&mut self, value: f64) -> &mut Self {
66 self.buffer.extend_from_slice(&encode_f64(value));
67 self
68 }
69
70 pub fn extend_i8<T: Into<i8>>(&mut self, value: T) -> &mut Self {
72 self.buffer.extend_from_slice(&encode_i8(value.into()));
73 self
74 }
75
76 pub fn extend_i16<T: Into<i16>>(&mut self, value: T) -> &mut Self {
78 self.buffer.extend_from_slice(&encode_i16(value.into()));
79 self
80 }
81
82 pub fn extend_i32<T: Into<i32>>(&mut self, value: T) -> &mut Self {
84 self.buffer.extend_from_slice(&encode_i32(value.into()));
85 self
86 }
87
88 pub fn extend_i64<T: Into<i64>>(&mut self, value: T) -> &mut Self {
90 self.buffer.extend_from_slice(&encode_i64(value.into()));
91 self
92 }
93
94 pub fn extend_i128<T: Into<i128>>(&mut self, value: T) -> &mut Self {
96 self.buffer.extend_from_slice(&encode_i128(value.into()));
97 self
98 }
99
100 pub fn extend_u8<T: Into<u8>>(&mut self, value: T) -> &mut Self {
102 self.buffer.push(encode_u8(value.into()));
103 self
104 }
105
106 pub fn extend_u16<T: Into<u16>>(&mut self, value: T) -> &mut Self {
108 self.buffer.extend_from_slice(&encode_u16(value.into()));
109 self
110 }
111
112 pub fn extend_u32<T: Into<u32>>(&mut self, value: T) -> &mut Self {
114 self.buffer.extend_from_slice(&encode_u32(value.into()));
115 self
116 }
117
118 pub fn extend_u64<T: Into<u64>>(&mut self, value: T) -> &mut Self {
120 self.buffer.extend_from_slice(&encode_u64(value.into()));
121 self
122 }
123
124 pub fn extend_u128<T: Into<u128>>(&mut self, value: T) -> &mut Self {
126 self.buffer.extend_from_slice(&encode_u128(value.into()));
127 self
128 }
129
130 pub fn extend_bytes<T: AsRef<[u8]>>(&mut self, bytes: T) -> &mut Self {
132 encode_bytes(bytes.as_ref(), &mut self.buffer);
133 self
134 }
135
136 pub fn extend_str<T: AsRef<str>>(&mut self, s: T) -> &mut Self {
138 self.extend_bytes(s.as_ref().as_bytes())
139 }
140
141 pub fn finish(self) -> Vec<u8> {
143 self.buffer
144 }
145
146 pub fn to_encoded_key(self) -> EncodedKey {
148 EncodedKey::new(self.buffer)
149 }
150
151 pub fn extend_schema_id(&mut self, object: impl Into<SchemaId>) -> &mut Self {
153 let primitive = object.into();
154 self.buffer.extend_from_slice(&catalog::serialize_schema_id(&primitive));
155 self
156 }
157
158 pub fn extend_index_id(&mut self, index: impl Into<IndexId>) -> &mut Self {
160 let index = index.into();
161 self.buffer.extend_from_slice(&catalog::serialize_index_id(&index));
162 self
163 }
164
165 pub fn extend_serialize<T: Serialize>(&mut self, value: &T) -> &mut Self {
167 self.buffer.extend_from_slice(&serialize(value));
168 self
169 }
170
171 pub fn extend_raw(&mut self, bytes: &[u8]) -> &mut Self {
173 self.buffer.extend_from_slice(bytes);
174 self
175 }
176
177 pub fn len(&self) -> usize {
179 self.buffer.len()
180 }
181
182 pub fn is_empty(&self) -> bool {
184 self.buffer.is_empty()
185 }
186
187 pub fn extend_date(&mut self, date: &Date) -> &mut Self {
189 self.extend_i32(date.to_days_since_epoch())
190 }
191
192 pub fn extend_datetime(&mut self, datetime: &DateTime) -> &mut Self {
194 self.extend_u64(datetime.to_nanos())
195 }
196
197 pub fn extend_time(&mut self, time: &Time) -> &mut Self {
199 self.extend_u64(time.to_nanos_since_midnight())
200 }
201
202 pub fn extend_duration(&mut self, duration: &Duration) -> &mut Self {
204 self.extend_i32(duration.get_months()).extend_i32(duration.get_days()).extend_i64(duration.get_nanos())
205 }
206
207 pub fn extend_row_number(&mut self, row_number: &RowNumber) -> &mut Self {
209 self.extend_u64(row_number.0)
210 }
211
212 pub fn extend_identity_id(&mut self, id: &IdentityId) -> &mut Self {
214 self.extend_bytes(id.as_bytes())
215 }
216
217 pub fn extend_uuid4(&mut self, uuid: &Uuid4) -> &mut Self {
219 self.extend_bytes(uuid.as_bytes())
220 }
221
222 pub fn extend_uuid7(&mut self, uuid: &Uuid7) -> &mut Self {
224 self.extend_bytes(uuid.as_bytes())
225 }
226
227 pub fn extend_blob(&mut self, blob: &Blob) -> &mut Self {
229 self.extend_bytes(blob.as_ref())
230 }
231
232 pub fn extend_int(&mut self, int: &Int) -> &mut Self {
234 let (sign, bytes) = int.to_bytes_be();
236 self.buffer.push(match sign {
238 Sign::Minus => 0,
239 _ => 1,
240 });
241 self.extend_u32(bytes.len() as u32);
242 self.buffer.extend_from_slice(&bytes);
243 self
244 }
245
246 pub fn extend_uint(&mut self, uint: &Uint) -> &mut Self {
248 let (_sign, bytes) = uint.0.to_bytes_be();
250 self.extend_u32(bytes.len() as u32);
251 self.buffer.extend_from_slice(&bytes);
252 self
253 }
254
255 pub fn extend_decimal(&mut self, decimal: &Decimal) -> &mut Self {
257 let s = decimal.to_string();
260 self.extend_str(&s);
261 self
262 }
263
264 pub fn extend_value(&mut self, value: &Value) -> &mut Self {
267 match value {
268 Value::None {
269 inner,
270 ..
271 } => {
272 self.buffer.push(0x00);
273 self.buffer.push(match inner {
274 Type::Any => 0x00,
275 Type::Boolean => 0x01,
276 Type::Float4 => 0x02,
277 Type::Float8 => 0x03,
278 Type::Int1 => 0x04,
279 Type::Int2 => 0x05,
280 Type::Int4 => 0x06,
281 Type::Int8 => 0x07,
282 Type::Int16 => 0x08,
283 Type::Utf8 => 0x09,
284 Type::Uint1 => 0x0a,
285 Type::Uint2 => 0x0b,
286 Type::Uint4 => 0x0c,
287 Type::Uint8 => 0x0d,
288 Type::Uint16 => 0x0e,
289 Type::Date => 0x0f,
290 Type::DateTime => 0x10,
291 Type::Time => 0x11,
292 Type::Duration => 0x12,
293 Type::IdentityId => 0x14,
294 Type::Uuid4 => 0x15,
295 Type::Uuid7 => 0x16,
296 Type::Blob => 0x17,
297 Type::Int => 0x18,
298 Type::Uint => 0x19,
299 Type::Decimal => 0x1a,
300 Type::DictionaryId => 0x1b,
301 _ => unreachable!(
302 "Option/List/Record/Tuple types cannot be encoded as None inner type in keys"
303 ),
304 });
305 }
306 Value::Boolean(b) => {
307 self.buffer.push(0x01);
308 self.extend_bool(*b);
309 }
310 Value::Float4(f) => {
311 self.buffer.push(0x02);
312 self.extend_f32(**f);
313 }
314 Value::Float8(f) => {
315 self.buffer.push(0x03);
316 self.extend_f64(**f);
317 }
318 Value::Int1(i) => {
319 self.buffer.push(0x04);
320 self.extend_i8(*i);
321 }
322 Value::Int2(i) => {
323 self.buffer.push(0x05);
324 self.extend_i16(*i);
325 }
326 Value::Int4(i) => {
327 self.buffer.push(0x06);
328 self.extend_i32(*i);
329 }
330 Value::Int8(i) => {
331 self.buffer.push(0x07);
332 self.extend_i64(*i);
333 }
334 Value::Int16(i) => {
335 self.buffer.push(0x08);
336 self.extend_i128(*i);
337 }
338 Value::Utf8(s) => {
339 self.buffer.push(0x09);
340 self.extend_str(s);
341 }
342 Value::Uint1(u) => {
343 self.buffer.push(0x0a);
344 self.extend_u8(*u);
345 }
346 Value::Uint2(u) => {
347 self.buffer.push(0x0b);
348 self.extend_u16(*u);
349 }
350 Value::Uint4(u) => {
351 self.buffer.push(0x0c);
352 self.extend_u32(*u);
353 }
354 Value::Uint8(u) => {
355 self.buffer.push(0x0d);
356 self.extend_u64(*u);
357 }
358 Value::Uint16(u) => {
359 self.buffer.push(0x0e);
360 self.extend_u128(*u);
361 }
362 Value::Date(d) => {
363 self.buffer.push(0x0f);
364 self.extend_date(d);
365 }
366 Value::DateTime(dt) => {
367 self.buffer.push(0x10);
368 self.extend_datetime(dt);
369 }
370 Value::Time(t) => {
371 self.buffer.push(0x11);
372 self.extend_time(t);
373 }
374 Value::Duration(i) => {
375 self.buffer.push(0x12);
376 self.extend_duration(i);
377 }
378 Value::IdentityId(id) => {
379 self.buffer.push(0x14);
380 self.extend_identity_id(id);
381 }
382 Value::Uuid4(uuid) => {
383 self.buffer.push(0x15);
384 self.extend_uuid4(uuid);
385 }
386 Value::Uuid7(uuid) => {
387 self.buffer.push(0x16);
388 self.extend_uuid7(uuid);
389 }
390 Value::Blob(b) => {
391 self.buffer.push(0x17);
392 self.extend_blob(b);
393 }
394 Value::Int(i) => {
395 self.buffer.push(0x18);
396 self.extend_int(i);
397 }
398 Value::Uint(u) => {
399 self.buffer.push(0x19);
400 self.extend_uint(u);
401 }
402 Value::Decimal(d) => {
403 self.buffer.push(0x1a);
404 self.extend_decimal(d);
405 }
406 Value::Any(_) | Value::Type(_) | Value::List(_) | Value::Record(_) | Value::Tuple(_) => {
407 unreachable!("Any/Type/List/Record/Tuple values cannot be serialized in keys");
408 }
409 Value::DictionaryId(id) => {
410 self.buffer.push(0x1b);
411 match id {
412 DictionaryEntryId::U1(v) => {
413 self.buffer.push(0x00);
414 self.extend_u8(*v);
415 }
416 DictionaryEntryId::U2(v) => {
417 self.buffer.push(0x01);
418 self.extend_u16(*v);
419 }
420 DictionaryEntryId::U4(v) => {
421 self.buffer.push(0x02);
422 self.extend_u32(*v);
423 }
424 DictionaryEntryId::U8(v) => {
425 self.buffer.push(0x03);
426 self.extend_u64(*v);
427 }
428 DictionaryEntryId::U16(v) => {
429 self.buffer.push(0x04);
430 self.extend_u128(*v);
431 }
432 }
433 }
434 }
435 self
436 }
437}
438
439impl Default for KeySerializer {
440 fn default() -> Self {
441 Self::new()
442 }
443}
444
445#[cfg(test)]
446pub mod tests {
447 use std::{f64, str::FromStr};
448
449 use num_bigint::BigInt;
450 use reifydb_type::{
451 util::hex,
452 value::{
453 Value,
454 blob::Blob,
455 date::Date,
456 datetime::DateTime,
457 decimal::Decimal,
458 dictionary::DictionaryEntryId,
459 duration::Duration,
460 identity::IdentityId,
461 int::Int,
462 ordered_f32::OrderedF32,
463 ordered_f64::OrderedF64,
464 row_number::RowNumber,
465 time::Time,
466 r#type::Type,
467 uint::Uint,
468 uuid::{Uuid4, Uuid7},
469 },
470 };
471
472 use crate::{
473 interface::catalog::{
474 id::{IndexId, PrimaryKeyId, TableId},
475 schema::SchemaId,
476 },
477 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
478 };
479
480 #[test]
481 fn test_new() {
482 let serializer = KeySerializer::new();
483 assert!(serializer.is_empty());
484 assert_eq!(serializer.len(), 0);
485 }
486
487 #[test]
488 fn test_with_capacity() {
489 let serializer = KeySerializer::with_capacity(100);
490 assert!(serializer.is_empty());
491 assert_eq!(serializer.len(), 0);
492 }
493
494 #[test]
495 fn test_extend_bool() {
496 let mut serializer = KeySerializer::new();
497 serializer.extend_bool(true);
498 let result = serializer.finish();
499 assert_eq!(result, vec![0x00]);
500 assert_eq!(hex::encode(&result), "00");
501
502 let mut serializer = KeySerializer::new();
503 serializer.extend_bool(false);
504 let result = serializer.finish();
505 assert_eq!(result, vec![0x01]);
506 assert_eq!(hex::encode(&result), "01");
507 }
508
509 #[test]
510 fn test_extend_f32() {
511 let mut serializer = KeySerializer::new();
512 serializer.extend_f32(3.14f32);
513 let result = serializer.finish();
514 assert_eq!(result.len(), 4);
515 assert_eq!(hex::encode(&result), "3fb70a3c");
516
517 let mut serializer = KeySerializer::new();
518 serializer.extend_f32(-3.14f32);
519 let result = serializer.finish();
520 assert_eq!(result.len(), 4);
521 assert_eq!(hex::encode(&result), "c048f5c3");
522
523 let mut serializer = KeySerializer::new();
524 serializer.extend_f32(0.0f32);
525 let result = serializer.finish();
526 assert_eq!(hex::encode(&result), "7fffffff");
527
528 let mut serializer = KeySerializer::new();
529 serializer.extend_f32(f32::MAX);
530 let result = serializer.finish();
531 assert_eq!(hex::encode(&result), "00800000");
532
533 let mut serializer = KeySerializer::new();
534 serializer.extend_f32(f32::MIN);
535 let result = serializer.finish();
536 assert_eq!(hex::encode(&result), "ff7fffff");
537 }
538
539 #[test]
540 fn test_extend_f64() {
541 let mut serializer = KeySerializer::new();
542 serializer.extend_f64(f64::consts::PI);
543 let result = serializer.finish();
544 assert_eq!(result.len(), 8);
545 assert_eq!(hex::encode(&result), "3ff6de04abbbd2e7");
546
547 let mut serializer = KeySerializer::new();
548 serializer.extend_f64(-f64::consts::PI);
549 let result = serializer.finish();
550 assert_eq!(result.len(), 8);
551 assert_eq!(hex::encode(&result), "c00921fb54442d18");
552
553 let mut serializer = KeySerializer::new();
554 serializer.extend_f64(0.0f64);
555 let result = serializer.finish();
556 assert_eq!(hex::encode(&result), "7fffffffffffffff");
557 }
558
559 #[test]
560 fn test_extend_i8() {
561 let mut serializer = KeySerializer::new();
562 serializer.extend_i8(0i8);
563 let result = serializer.finish();
564 assert_eq!(hex::encode(&result), "7f");
565
566 let mut serializer = KeySerializer::new();
567 serializer.extend_i8(1i8);
568 let result = serializer.finish();
569 assert_eq!(hex::encode(&result), "7e");
570
571 let mut serializer = KeySerializer::new();
572 serializer.extend_i8(-1i8);
573 let result = serializer.finish();
574 assert_eq!(hex::encode(&result), "80");
575
576 let mut serializer = KeySerializer::new();
577 serializer.extend_i8(i8::MAX);
578 let result = serializer.finish();
579 assert_eq!(hex::encode(&result), "00");
580
581 let mut serializer = KeySerializer::new();
582 serializer.extend_i8(i8::MIN);
583 let result = serializer.finish();
584 assert_eq!(hex::encode(&result), "ff");
585 }
586
587 #[test]
588 fn test_extend_i16() {
589 let mut serializer = KeySerializer::new();
590 serializer.extend_i16(0i16);
591 let result = serializer.finish();
592 assert_eq!(hex::encode(&result), "7fff");
593
594 let mut serializer = KeySerializer::new();
595 serializer.extend_i16(1i16);
596 let result = serializer.finish();
597 assert_eq!(hex::encode(&result), "7ffe");
598
599 let mut serializer = KeySerializer::new();
600 serializer.extend_i16(-1i16);
601 let result = serializer.finish();
602 assert_eq!(hex::encode(&result), "8000");
603
604 let mut serializer = KeySerializer::new();
605 serializer.extend_i16(i16::MAX);
606 let result = serializer.finish();
607 assert_eq!(hex::encode(&result), "0000");
608
609 let mut serializer = KeySerializer::new();
610 serializer.extend_i16(i16::MIN);
611 let result = serializer.finish();
612 assert_eq!(hex::encode(&result), "ffff");
613 }
614
615 #[test]
616 fn test_extend_i32() {
617 let mut serializer = KeySerializer::new();
618 serializer.extend_i32(0i32);
619 let result = serializer.finish();
620 assert_eq!(hex::encode(&result), "7fffffff");
621
622 let mut serializer = KeySerializer::new();
623 serializer.extend_i32(1i32);
624 let result = serializer.finish();
625 assert_eq!(hex::encode(&result), "7ffffffe");
626
627 let mut serializer = KeySerializer::new();
628 serializer.extend_i32(-1i32);
629 let result = serializer.finish();
630 assert_eq!(hex::encode(&result), "80000000");
631
632 let mut serializer = KeySerializer::new();
633 serializer.extend_i32(i32::MAX);
634 let result = serializer.finish();
635 assert_eq!(hex::encode(&result), "00000000");
636
637 let mut serializer = KeySerializer::new();
638 serializer.extend_i32(i32::MIN);
639 let result = serializer.finish();
640 assert_eq!(hex::encode(&result), "ffffffff");
641 }
642
643 #[test]
644 fn test_extend_i64() {
645 let mut serializer = KeySerializer::new();
646 serializer.extend_i64(0i64);
647 let result = serializer.finish();
648 assert_eq!(hex::encode(&result), "7fffffffffffffff");
649
650 let mut serializer = KeySerializer::new();
651 serializer.extend_i64(1i64);
652 let result = serializer.finish();
653 assert_eq!(hex::encode(&result), "7ffffffffffffffe");
654
655 let mut serializer = KeySerializer::new();
656 serializer.extend_i64(-1i64);
657 let result = serializer.finish();
658 assert_eq!(hex::encode(&result), "8000000000000000");
659
660 let mut serializer = KeySerializer::new();
661 serializer.extend_i64(i64::MAX);
662 let result = serializer.finish();
663 assert_eq!(hex::encode(&result), "0000000000000000");
664
665 let mut serializer = KeySerializer::new();
666 serializer.extend_i64(i64::MIN);
667 let result = serializer.finish();
668 assert_eq!(hex::encode(&result), "ffffffffffffffff");
669 }
670
671 #[test]
672 fn test_extend_i128() {
673 let mut serializer = KeySerializer::new();
674 serializer.extend_i128(0i128);
675 let result = serializer.finish();
676 assert_eq!(hex::encode(&result), "7fffffffffffffffffffffffffffffff");
677
678 let mut serializer = KeySerializer::new();
679 serializer.extend_i128(1i128);
680 let result = serializer.finish();
681 assert_eq!(hex::encode(&result), "7ffffffffffffffffffffffffffffffe");
682
683 let mut serializer = KeySerializer::new();
684 serializer.extend_i128(-1i128);
685 let result = serializer.finish();
686 assert_eq!(hex::encode(&result), "80000000000000000000000000000000");
687
688 let mut serializer = KeySerializer::new();
689 serializer.extend_i128(i128::MAX);
690 let result = serializer.finish();
691 assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
692
693 let mut serializer = KeySerializer::new();
694 serializer.extend_i128(i128::MIN);
695 let result = serializer.finish();
696 assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
697 }
698
699 #[test]
700 fn test_extend_u8() {
701 let mut serializer = KeySerializer::new();
702 serializer.extend_u8(0u8);
703 let result = serializer.finish();
704 assert_eq!(hex::encode(&result), "ff");
705
706 let mut serializer = KeySerializer::new();
707 serializer.extend_u8(1u8);
708 let result = serializer.finish();
709 assert_eq!(hex::encode(&result), "fe");
710
711 let mut serializer = KeySerializer::new();
712 serializer.extend_u8(255u8);
713 let result = serializer.finish();
714 assert_eq!(hex::encode(&result), "00");
715 }
716
717 #[test]
718 fn test_extend_u16() {
719 let mut serializer = KeySerializer::new();
720 serializer.extend_u16(0u16);
721 let result = serializer.finish();
722 assert_eq!(hex::encode(&result), "ffff");
723
724 let mut serializer = KeySerializer::new();
725 serializer.extend_u16(1u16);
726 let result = serializer.finish();
727 assert_eq!(hex::encode(&result), "fffe");
728
729 let mut serializer = KeySerializer::new();
730 serializer.extend_u16(255u16);
731 let result = serializer.finish();
732 assert_eq!(hex::encode(&result), "ff00");
733
734 let mut serializer = KeySerializer::new();
735 serializer.extend_u16(u16::MAX);
736 let result = serializer.finish();
737 assert_eq!(hex::encode(&result), "0000");
738 }
739
740 #[test]
741 fn test_extend_u32() {
742 let mut serializer = KeySerializer::new();
743 serializer.extend_u32(0u32);
744 let result = serializer.finish();
745 assert_eq!(hex::encode(&result), "ffffffff");
746
747 let mut serializer = KeySerializer::new();
748 serializer.extend_u32(1u32);
749 let result = serializer.finish();
750 assert_eq!(hex::encode(&result), "fffffffe");
751
752 let mut serializer = KeySerializer::new();
753 serializer.extend_u32(u32::MAX);
754 let result = serializer.finish();
755 assert_eq!(hex::encode(&result), "00000000");
756 }
757
758 #[test]
759 fn test_extend_u64() {
760 let mut serializer = KeySerializer::new();
761 serializer.extend_u64(0u64);
762 let result = serializer.finish();
763 assert_eq!(hex::encode(&result), "ffffffffffffffff");
764
765 let mut serializer = KeySerializer::new();
766 serializer.extend_u64(1u64);
767 let result = serializer.finish();
768 assert_eq!(hex::encode(&result), "fffffffffffffffe");
769
770 let mut serializer = KeySerializer::new();
771 serializer.extend_u64(65535u64);
772 let result = serializer.finish();
773 assert_eq!(hex::encode(&result), "ffffffffffff0000");
774
775 let mut serializer = KeySerializer::new();
776 serializer.extend_u64(u64::MAX);
777 let result = serializer.finish();
778 assert_eq!(hex::encode(&result), "0000000000000000");
779 }
780
781 #[test]
782 fn test_extend_u128() {
783 let mut serializer = KeySerializer::new();
784 serializer.extend_u128(0u128);
785 let result = serializer.finish();
786 assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
787
788 let mut serializer = KeySerializer::new();
789 serializer.extend_u128(1u128);
790 let result = serializer.finish();
791 assert_eq!(hex::encode(&result), "fffffffffffffffffffffffffffffffe");
792
793 let mut serializer = KeySerializer::new();
794 serializer.extend_u128(u128::MAX);
795 let result = serializer.finish();
796 assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
797 }
798
799 #[test]
800 fn test_extend_bytes() {
801 let mut serializer = KeySerializer::new();
802 serializer.extend_bytes(b"hello");
803 let result = serializer.finish();
804 assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
806
807 let mut serializer = KeySerializer::new();
809 serializer.extend_bytes(&[0x01, 0xff, 0x02]);
810 let result = serializer.finish();
811 assert_eq!(result, vec![0x01, 0xff, 0x00, 0x02, 0xff, 0xff]);
813 }
814
815 #[test]
816 fn test_extend_str() {
817 let mut serializer = KeySerializer::new();
818 serializer.extend_str("hello world");
819 let result = serializer.finish();
820 assert!(result.len() > "hello world".len());
822 assert!(result.ends_with(&[0xff, 0xff]));
823 }
824
825 #[test]
826 fn test_extend_raw() {
827 let mut serializer = KeySerializer::new();
828 serializer.extend_raw(&[0x01, 0x02, 0x03]);
829 let result = serializer.finish();
830 assert_eq!(result, vec![0x01, 0x02, 0x03]);
831 }
832
833 #[test]
834 fn test_chaining() {
835 let mut serializer = KeySerializer::new();
836 serializer.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
837 let result = serializer.finish();
838
839 assert!(result.len() >= 19);
841
842 let mut de = KeyDeserializer::from_bytes(&result);
843 assert_eq!(de.read_bool().unwrap(), true);
844 assert_eq!(de.read_i32().unwrap(), 42);
845 assert_eq!(de.read_str().unwrap(), "test");
846 assert_eq!(de.read_u64().unwrap(), 1000);
847 assert!(de.is_empty());
848 }
849
850 #[test]
851 fn test_ordering_descending_i32() {
852 let mut ser1 = KeySerializer::new();
854 ser1.extend_i32(1i32);
855 let bytes1 = ser1.finish();
856
857 let mut ser2 = KeySerializer::new();
858 ser2.extend_i32(100i32);
859 let bytes2 = ser2.finish();
860
861 let mut ser3 = KeySerializer::new();
862 ser3.extend_i32(1000i32);
863 let bytes3 = ser3.finish();
864
865 assert!(bytes3 < bytes2, "encode(1000) should be < encode(100)");
868 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
869 }
870
871 #[test]
872 fn test_ordering_descending_u64() {
873 let mut ser1 = KeySerializer::new();
874 ser1.extend_u64(1u64);
875 let bytes1 = ser1.finish();
876
877 let mut ser2 = KeySerializer::new();
878 ser2.extend_u64(100u64);
879 let bytes2 = ser2.finish();
880
881 let mut ser3 = KeySerializer::new();
882 ser3.extend_u64(10000u64);
883 let bytes3 = ser3.finish();
884
885 assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
887 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
888 }
889
890 #[test]
891 fn test_ordering_descending_negative() {
892 let mut ser1 = KeySerializer::new();
896 ser1.extend_i32(-1i32);
897 let bytes_neg1 = ser1.finish();
898
899 let mut ser2 = KeySerializer::new();
900 ser2.extend_i32(-100i32);
901 let bytes_neg100 = ser2.finish();
902
903 let mut ser3 = KeySerializer::new();
904 ser3.extend_i32(-1000i32);
905 let bytes_neg1000 = ser3.finish();
906
907 assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
909 assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
910 }
911
912 #[test]
913 fn test_ordering_mixed_sign() {
914 let mut ser_neg = KeySerializer::new();
916 ser_neg.extend_i32(-1i32);
917 let bytes_neg = ser_neg.finish();
918
919 let mut ser_zero = KeySerializer::new();
920 ser_zero.extend_i32(0i32);
921 let bytes_zero = ser_zero.finish();
922
923 let mut ser_pos = KeySerializer::new();
924 ser_pos.extend_i32(1i32);
925 let bytes_pos = ser_pos.finish();
926
927 assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
929 assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
930 }
931
932 #[test]
933 fn test_date() {
934 let mut serializer = KeySerializer::new();
935 let date = Date::from_ymd(2024, 1, 1).unwrap();
936 serializer.extend_date(&date);
937 let result = serializer.finish();
938 assert_eq!(result.len(), 4); }
940
941 #[test]
942 fn test_datetime() {
943 let mut serializer = KeySerializer::new();
944 let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
945 serializer.extend_datetime(&datetime);
946 let result = serializer.finish();
947 assert_eq!(result.len(), 8); }
949
950 #[test]
951 fn test_time() {
952 let mut serializer = KeySerializer::new();
953 let time = Time::from_hms(12, 30, 45).unwrap();
954 serializer.extend_time(&time);
955 let result = serializer.finish();
956 assert_eq!(result.len(), 8); }
958
959 #[test]
960 fn test_interval() {
961 let mut serializer = KeySerializer::new();
962 let duration = Duration::from_nanoseconds(1000000).unwrap();
963 serializer.extend_duration(&duration);
964 let result = serializer.finish();
965 assert_eq!(result.len(), 16); }
967
968 #[test]
969 fn test_row_number() {
970 let mut serializer = KeySerializer::new();
971 let row_number = RowNumber(42);
972 serializer.extend_row_number(&row_number);
973 let result = serializer.finish();
974 assert_eq!(result.len(), 8); }
976
977 #[test]
978 fn test_identity_id() {
979 let mut serializer = KeySerializer::new();
980 let id = IdentityId::generate();
981 serializer.extend_identity_id(&id);
982 let result = serializer.finish();
983 assert!(result.len() > 0);
984 }
985
986 #[test]
987 fn test_uuid4() {
988 let mut serializer = KeySerializer::new();
989 let uuid = Uuid4::generate();
990 serializer.extend_uuid4(&uuid);
991 let result = serializer.finish();
992 assert!(result.len() > 16);
994 }
995
996 #[test]
997 fn test_uuid7() {
998 let mut serializer = KeySerializer::new();
999 let uuid = Uuid7::generate();
1000 serializer.extend_uuid7(&uuid);
1001 let result = serializer.finish();
1002 assert!(result.len() > 16);
1004 }
1005
1006 #[test]
1007 fn test_blob() {
1008 let mut serializer = KeySerializer::new();
1009 let blob = Blob::from(vec![0x01, 0x02, 0x03]);
1010 serializer.extend_blob(&blob);
1011 let result = serializer.finish();
1012 assert!(result.len() > 3);
1014 }
1015
1016 #[test]
1017 fn test_int() {
1018 let mut serializer = KeySerializer::new();
1019 let int = Int(BigInt::from(42));
1020 serializer.extend_int(&int);
1021 let result = serializer.finish();
1022 assert!(result.len() > 0);
1024 }
1025
1026 #[test]
1027 fn test_uint() {
1028 let mut serializer = KeySerializer::new();
1029 let uint = Uint(BigInt::from(42));
1030 serializer.extend_uint(&uint);
1031 let result = serializer.finish();
1032 assert!(result.len() > 0);
1034 }
1035
1036 #[test]
1037 fn test_decimal() {
1038 let mut serializer = KeySerializer::new();
1039 let decimal = Decimal::from_str("3.14").unwrap();
1040 serializer.extend_decimal(&decimal);
1041 let result = serializer.finish();
1042 assert!(result.len() > 0);
1044 }
1045
1046 #[test]
1047 fn test_extend_value() {
1048 let mut serializer = KeySerializer::new();
1050 serializer.extend_value(&Value::none());
1051 let result = serializer.finish();
1052 assert_eq!(result, vec![0x00, 0x00]); let mut serializer = KeySerializer::new();
1056 serializer.extend_value(&Value::none_of(Type::Int4));
1057 let result = serializer.finish();
1058 assert_eq!(result, vec![0x00, 0x06]); let mut serializer = KeySerializer::new();
1062 serializer.extend_value(&Value::Boolean(true));
1063 let result = serializer.finish();
1064 assert_eq!(result[0], 0x01); assert_eq!(result.len(), 2); let mut serializer = KeySerializer::new();
1069 serializer.extend_value(&Value::Int4(42));
1070 let result = serializer.finish();
1071 assert_eq!(result[0], 0x06); assert_eq!(result.len(), 5); let mut serializer = KeySerializer::new();
1076 serializer.extend_value(&Value::Utf8("test".to_string()));
1077 let result = serializer.finish();
1078 assert_eq!(result[0], 0x09); assert!(result.ends_with(&[0xff, 0xff]));
1080 }
1081
1082 #[test]
1083 fn test_roundtrip_none() {
1084 let value = Value::none();
1085 let mut ser = KeySerializer::new();
1086 ser.extend_value(&value);
1087 let bytes = ser.finish();
1088 let mut de = KeyDeserializer::from_bytes(&bytes);
1089 assert_eq!(de.read_value().unwrap(), value);
1090 assert!(de.is_empty());
1091 }
1092
1093 #[test]
1094 fn test_roundtrip_none_typed() {
1095 let value = Value::none_of(Type::Int4);
1096 let mut ser = KeySerializer::new();
1097 ser.extend_value(&value);
1098 let bytes = ser.finish();
1099 let mut de = KeyDeserializer::from_bytes(&bytes);
1100 assert_eq!(de.read_value().unwrap(), value);
1101 assert!(de.is_empty());
1102 }
1103
1104 #[test]
1105 fn test_roundtrip_boolean_true() {
1106 let value = Value::Boolean(true);
1107 let mut ser = KeySerializer::new();
1108 ser.extend_value(&value);
1109 let bytes = ser.finish();
1110 let mut de = KeyDeserializer::from_bytes(&bytes);
1111 assert_eq!(de.read_value().unwrap(), value);
1112 assert!(de.is_empty());
1113 }
1114
1115 #[test]
1116 fn test_roundtrip_boolean_false() {
1117 let value = Value::Boolean(false);
1118 let mut ser = KeySerializer::new();
1119 ser.extend_value(&value);
1120 let bytes = ser.finish();
1121 let mut de = KeyDeserializer::from_bytes(&bytes);
1122 assert_eq!(de.read_value().unwrap(), value);
1123 assert!(de.is_empty());
1124 }
1125
1126 #[test]
1127 fn test_roundtrip_float4() {
1128 let value = Value::Float4(OrderedF32::try_from(3.14f32).unwrap());
1129 let mut ser = KeySerializer::new();
1130 ser.extend_value(&value);
1131 let bytes = ser.finish();
1132 let mut de = KeyDeserializer::from_bytes(&bytes);
1133 assert_eq!(de.read_value().unwrap(), value);
1134 assert!(de.is_empty());
1135 }
1136
1137 #[test]
1138 fn test_roundtrip_float8() {
1139 let value = Value::Float8(OrderedF64::try_from(3.14).unwrap());
1140 let mut ser = KeySerializer::new();
1141 ser.extend_value(&value);
1142 let bytes = ser.finish();
1143 let mut de = KeyDeserializer::from_bytes(&bytes);
1144 assert_eq!(de.read_value().unwrap(), value);
1145 assert!(de.is_empty());
1146 }
1147
1148 #[test]
1149 fn test_roundtrip_int1() {
1150 let value = Value::Int1(-42);
1151 let mut ser = KeySerializer::new();
1152 ser.extend_value(&value);
1153 let bytes = ser.finish();
1154 let mut de = KeyDeserializer::from_bytes(&bytes);
1155 assert_eq!(de.read_value().unwrap(), value);
1156 assert!(de.is_empty());
1157 }
1158
1159 #[test]
1160 fn test_roundtrip_int2() {
1161 let value = Value::Int2(-1000);
1162 let mut ser = KeySerializer::new();
1163 ser.extend_value(&value);
1164 let bytes = ser.finish();
1165 let mut de = KeyDeserializer::from_bytes(&bytes);
1166 assert_eq!(de.read_value().unwrap(), value);
1167 assert!(de.is_empty());
1168 }
1169
1170 #[test]
1171 fn test_roundtrip_int4() {
1172 let value = Value::Int4(42);
1173 let mut ser = KeySerializer::new();
1174 ser.extend_value(&value);
1175 let bytes = ser.finish();
1176 let mut de = KeyDeserializer::from_bytes(&bytes);
1177 assert_eq!(de.read_value().unwrap(), value);
1178 assert!(de.is_empty());
1179 }
1180
1181 #[test]
1182 fn test_roundtrip_int8() {
1183 let value = Value::Int8(-1_000_000);
1184 let mut ser = KeySerializer::new();
1185 ser.extend_value(&value);
1186 let bytes = ser.finish();
1187 let mut de = KeyDeserializer::from_bytes(&bytes);
1188 assert_eq!(de.read_value().unwrap(), value);
1189 assert!(de.is_empty());
1190 }
1191
1192 #[test]
1193 fn test_roundtrip_int16() {
1194 let value = Value::Int16(123_456_789);
1195 let mut ser = KeySerializer::new();
1196 ser.extend_value(&value);
1197 let bytes = ser.finish();
1198 let mut de = KeyDeserializer::from_bytes(&bytes);
1199 assert_eq!(de.read_value().unwrap(), value);
1200 assert!(de.is_empty());
1201 }
1202
1203 #[test]
1204 fn test_roundtrip_utf8() {
1205 let value = Value::Utf8("hello world".to_string());
1206 let mut ser = KeySerializer::new();
1207 ser.extend_value(&value);
1208 let bytes = ser.finish();
1209 let mut de = KeyDeserializer::from_bytes(&bytes);
1210 assert_eq!(de.read_value().unwrap(), value);
1211 assert!(de.is_empty());
1212 }
1213
1214 #[test]
1215 fn test_roundtrip_uint1() {
1216 let value = Value::Uint1(255);
1217 let mut ser = KeySerializer::new();
1218 ser.extend_value(&value);
1219 let bytes = ser.finish();
1220 let mut de = KeyDeserializer::from_bytes(&bytes);
1221 assert_eq!(de.read_value().unwrap(), value);
1222 assert!(de.is_empty());
1223 }
1224
1225 #[test]
1226 fn test_roundtrip_uint2() {
1227 let value = Value::Uint2(65535);
1228 let mut ser = KeySerializer::new();
1229 ser.extend_value(&value);
1230 let bytes = ser.finish();
1231 let mut de = KeyDeserializer::from_bytes(&bytes);
1232 assert_eq!(de.read_value().unwrap(), value);
1233 assert!(de.is_empty());
1234 }
1235
1236 #[test]
1237 fn test_roundtrip_uint4() {
1238 let value = Value::Uint4(100_000);
1239 let mut ser = KeySerializer::new();
1240 ser.extend_value(&value);
1241 let bytes = ser.finish();
1242 let mut de = KeyDeserializer::from_bytes(&bytes);
1243 assert_eq!(de.read_value().unwrap(), value);
1244 assert!(de.is_empty());
1245 }
1246
1247 #[test]
1248 fn test_roundtrip_uint8() {
1249 let value = Value::Uint8(999);
1250 let mut ser = KeySerializer::new();
1251 ser.extend_value(&value);
1252 let bytes = ser.finish();
1253 let mut de = KeyDeserializer::from_bytes(&bytes);
1254 assert_eq!(de.read_value().unwrap(), value);
1255 assert!(de.is_empty());
1256 }
1257
1258 #[test]
1259 fn test_roundtrip_uint16() {
1260 let value = Value::Uint16(u128::MAX);
1261 let mut ser = KeySerializer::new();
1262 ser.extend_value(&value);
1263 let bytes = ser.finish();
1264 let mut de = KeyDeserializer::from_bytes(&bytes);
1265 assert_eq!(de.read_value().unwrap(), value);
1266 assert!(de.is_empty());
1267 }
1268
1269 #[test]
1270 fn test_roundtrip_date() {
1271 let value = Value::Date(Date::from_ymd(2024, 6, 15).unwrap());
1272 let mut ser = KeySerializer::new();
1273 ser.extend_value(&value);
1274 let bytes = ser.finish();
1275 let mut de = KeyDeserializer::from_bytes(&bytes);
1276 assert_eq!(de.read_value().unwrap(), value);
1277 assert!(de.is_empty());
1278 }
1279
1280 #[test]
1281 fn test_roundtrip_datetime() {
1282 let value = Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap());
1283 let mut ser = KeySerializer::new();
1284 ser.extend_value(&value);
1285 let bytes = ser.finish();
1286 let mut de = KeyDeserializer::from_bytes(&bytes);
1287 assert_eq!(de.read_value().unwrap(), value);
1288 assert!(de.is_empty());
1289 }
1290
1291 #[test]
1292 fn test_roundtrip_time() {
1293 let value = Value::Time(Time::from_hms(12, 30, 45).unwrap());
1294 let mut ser = KeySerializer::new();
1295 ser.extend_value(&value);
1296 let bytes = ser.finish();
1297 let mut de = KeyDeserializer::from_bytes(&bytes);
1298 assert_eq!(de.read_value().unwrap(), value);
1299 assert!(de.is_empty());
1300 }
1301
1302 #[test]
1303 fn test_roundtrip_duration() {
1304 let value = Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap());
1305 let mut ser = KeySerializer::new();
1306 ser.extend_value(&value);
1307 let bytes = ser.finish();
1308 let mut de = KeyDeserializer::from_bytes(&bytes);
1309 assert_eq!(de.read_value().unwrap(), value);
1310 assert!(de.is_empty());
1311 }
1312
1313 #[test]
1314 fn test_roundtrip_identity_id() {
1315 let value = Value::IdentityId(IdentityId::generate());
1316 let mut ser = KeySerializer::new();
1317 ser.extend_value(&value);
1318 let bytes = ser.finish();
1319 let mut de = KeyDeserializer::from_bytes(&bytes);
1320 assert_eq!(de.read_value().unwrap(), value);
1321 assert!(de.is_empty());
1322 }
1323
1324 #[test]
1325 fn test_roundtrip_uuid4() {
1326 let value = Value::Uuid4(Uuid4::generate());
1327 let mut ser = KeySerializer::new();
1328 ser.extend_value(&value);
1329 let bytes = ser.finish();
1330 let mut de = KeyDeserializer::from_bytes(&bytes);
1331 assert_eq!(de.read_value().unwrap(), value);
1332 assert!(de.is_empty());
1333 }
1334
1335 #[test]
1336 fn test_roundtrip_uuid7() {
1337 let value = Value::Uuid7(Uuid7::generate());
1338 let mut ser = KeySerializer::new();
1339 ser.extend_value(&value);
1340 let bytes = ser.finish();
1341 let mut de = KeyDeserializer::from_bytes(&bytes);
1342 assert_eq!(de.read_value().unwrap(), value);
1343 assert!(de.is_empty());
1344 }
1345
1346 #[test]
1347 fn test_roundtrip_blob() {
1348 let value = Value::Blob(Blob::from(vec![0x01, 0x02, 0x03]));
1349 let mut ser = KeySerializer::new();
1350 ser.extend_value(&value);
1351 let bytes = ser.finish();
1352 let mut de = KeyDeserializer::from_bytes(&bytes);
1353 assert_eq!(de.read_value().unwrap(), value);
1354 assert!(de.is_empty());
1355 }
1356
1357 #[test]
1358 fn test_roundtrip_int() {
1359 let value = Value::Int(Int(BigInt::from(-42)));
1360 let mut ser = KeySerializer::new();
1361 ser.extend_value(&value);
1362 let bytes = ser.finish();
1363 let mut de = KeyDeserializer::from_bytes(&bytes);
1364 assert_eq!(de.read_value().unwrap(), value);
1365 assert!(de.is_empty());
1366 }
1367
1368 #[test]
1369 fn test_roundtrip_uint() {
1370 let value = Value::Uint(Uint(BigInt::from(42)));
1371 let mut ser = KeySerializer::new();
1372 ser.extend_value(&value);
1373 let bytes = ser.finish();
1374 let mut de = KeyDeserializer::from_bytes(&bytes);
1375 assert_eq!(de.read_value().unwrap(), value);
1376 assert!(de.is_empty());
1377 }
1378
1379 #[test]
1380 fn test_roundtrip_decimal() {
1381 let value = Value::Decimal(Decimal::from_str("3.14").unwrap());
1382 let mut ser = KeySerializer::new();
1383 ser.extend_value(&value);
1384 let bytes = ser.finish();
1385 let mut de = KeyDeserializer::from_bytes(&bytes);
1386 assert_eq!(de.read_value().unwrap(), value);
1387 assert!(de.is_empty());
1388 }
1389
1390 #[test]
1391 fn test_roundtrip_dictionary_id_u1() {
1392 let value = Value::DictionaryId(DictionaryEntryId::U1(42));
1393 let mut ser = KeySerializer::new();
1394 ser.extend_value(&value);
1395 let bytes = ser.finish();
1396 let mut de = KeyDeserializer::from_bytes(&bytes);
1397 assert_eq!(de.read_value().unwrap(), value);
1398 assert!(de.is_empty());
1399 }
1400
1401 #[test]
1402 fn test_roundtrip_dictionary_id_u2() {
1403 let value = Value::DictionaryId(DictionaryEntryId::U2(1000));
1404 let mut ser = KeySerializer::new();
1405 ser.extend_value(&value);
1406 let bytes = ser.finish();
1407 let mut de = KeyDeserializer::from_bytes(&bytes);
1408 assert_eq!(de.read_value().unwrap(), value);
1409 assert!(de.is_empty());
1410 }
1411
1412 #[test]
1413 fn test_roundtrip_dictionary_id_u4() {
1414 let value = Value::DictionaryId(DictionaryEntryId::U4(100_000));
1415 let mut ser = KeySerializer::new();
1416 ser.extend_value(&value);
1417 let bytes = ser.finish();
1418 let mut de = KeyDeserializer::from_bytes(&bytes);
1419 assert_eq!(de.read_value().unwrap(), value);
1420 assert!(de.is_empty());
1421 }
1422
1423 #[test]
1424 fn test_roundtrip_dictionary_id_u8() {
1425 let value = Value::DictionaryId(DictionaryEntryId::U8(10_000_000_000));
1426 let mut ser = KeySerializer::new();
1427 ser.extend_value(&value);
1428 let bytes = ser.finish();
1429 let mut de = KeyDeserializer::from_bytes(&bytes);
1430 assert_eq!(de.read_value().unwrap(), value);
1431 assert!(de.is_empty());
1432 }
1433
1434 #[test]
1435 fn test_roundtrip_dictionary_id_u16() {
1436 let value = Value::DictionaryId(DictionaryEntryId::U16(u128::MAX));
1437 let mut ser = KeySerializer::new();
1438 ser.extend_value(&value);
1439 let bytes = ser.finish();
1440 let mut de = KeyDeserializer::from_bytes(&bytes);
1441 assert_eq!(de.read_value().unwrap(), value);
1442 assert!(de.is_empty());
1443 }
1444
1445 #[test]
1446 fn test_roundtrip_all() {
1447 let values = vec![
1448 Value::none(),
1449 Value::none_of(Type::Int4),
1450 Value::Boolean(true),
1451 Value::Boolean(false),
1452 Value::Float4(OrderedF32::try_from(3.14f32).unwrap()),
1453 Value::Float8(OrderedF64::try_from(3.14).unwrap()),
1454 Value::Int1(-42),
1455 Value::Int2(-1000),
1456 Value::Int4(42),
1457 Value::Int8(-1_000_000),
1458 Value::Int16(123_456_789),
1459 Value::Utf8("hello world".to_string()),
1460 Value::Uint1(255),
1461 Value::Uint2(65535),
1462 Value::Uint4(100_000),
1463 Value::Uint8(999),
1464 Value::Uint16(u128::MAX),
1465 Value::Date(Date::from_ymd(2024, 6, 15).unwrap()),
1466 Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap()),
1467 Value::Time(Time::from_hms(12, 30, 45).unwrap()),
1468 Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap()),
1469 Value::IdentityId(IdentityId::generate()),
1470 Value::Uuid4(Uuid4::generate()),
1471 Value::Uuid7(Uuid7::generate()),
1472 Value::Blob(Blob::from(vec![0x01, 0x02, 0x03])),
1473 Value::Int(Int(BigInt::from(-42))),
1474 Value::Uint(Uint(BigInt::from(42))),
1475 Value::Decimal(Decimal::from_str("3.14").unwrap()),
1476 Value::DictionaryId(DictionaryEntryId::U8(42)),
1477 ];
1478
1479 let mut ser = KeySerializer::new();
1480 for v in &values {
1481 ser.extend_value(v);
1482 }
1483 let bytes = ser.finish();
1484
1485 let mut de = KeyDeserializer::from_bytes(&bytes);
1486 for expected in &values {
1487 let actual = de.read_value().unwrap();
1488 assert_eq!(&actual, expected);
1489 }
1490 assert!(de.is_empty());
1491 }
1492
1493 #[test]
1497 fn test_roundtrip_exhaustiveness_guard() {
1498 let value = Value::none();
1499 match value {
1500 Value::None {
1501 ..
1502 } => {}
1503 Value::Boolean(_) => {}
1504 Value::Float4(_) => {}
1505 Value::Float8(_) => {}
1506 Value::Int1(_) => {}
1507 Value::Int2(_) => {}
1508 Value::Int4(_) => {}
1509 Value::Int8(_) => {}
1510 Value::Int16(_) => {}
1511 Value::Utf8(_) => {}
1512 Value::Uint1(_) => {}
1513 Value::Uint2(_) => {}
1514 Value::Uint4(_) => {}
1515 Value::Uint8(_) => {}
1516 Value::Uint16(_) => {}
1517 Value::Date(_) => {}
1518 Value::DateTime(_) => {}
1519 Value::Time(_) => {}
1520 Value::Duration(_) => {}
1521 Value::IdentityId(_) => {}
1522 Value::Uuid4(_) => {}
1523 Value::Uuid7(_) => {}
1524 Value::Blob(_) => {}
1525 Value::Int(_) => {}
1526 Value::Uint(_) => {}
1527 Value::Decimal(_) => {}
1528 Value::DictionaryId(_) => {}
1529 Value::Any(_) => {}
1531 Value::Type(_) => {}
1532 Value::List(_) => {}
1533 Value::Record(_) => {}
1534 Value::Tuple(_) => {}
1535 }
1536 }
1537
1538 #[test]
1539 fn test_to_encoded_key() {
1540 let mut serializer = KeySerializer::new();
1541 serializer.extend_i32(42);
1542 let key = serializer.to_encoded_key();
1543 assert_eq!(key.len(), 4);
1544 }
1545
1546 #[test]
1547 fn test_index_id() {
1548 let mut serializer = KeySerializer::new();
1549 serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
1550 let result = serializer.finish();
1551
1552 assert_eq!(result.len(), 9);
1554 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1558 serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1559 let result2 = serializer2.finish();
1560
1561 assert!(result2[1..] > result[1..]);
1564 }
1565
1566 #[test]
1567 fn test_object_id() {
1568 let mut serializer = KeySerializer::new();
1569 serializer.extend_schema_id(SchemaId::Table(TableId(987654321)));
1570 let result = serializer.finish();
1571
1572 assert_eq!(result.len(), 9);
1574 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1578 serializer2.extend_schema_id(SchemaId::Table(TableId(987654322)));
1579 let result2 = serializer2.finish();
1580
1581 assert!(result2[1..] < result[1..]);
1584 }
1585}