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