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::IdentityId(id) => {
308 self.extend_identity_id(id);
309 }
310 Value::Uuid4(uuid) => {
311 self.extend_uuid4(uuid);
312 }
313 Value::Uuid7(uuid) => {
314 self.extend_uuid7(uuid);
315 }
316 Value::Blob(b) => {
317 self.extend_blob(b);
318 }
319 Value::Int(i) => {
320 self.extend_int(i);
321 }
322 Value::Uint(u) => {
323 self.extend_uint(u);
324 }
325 Value::Decimal(d) => {
326 self.extend_decimal(d);
327 }
328 Value::Any(_) => {
329 unreachable!("Any type cannot be serialized in keys");
330 }
331 }
332 self
333 }
334}
335
336impl Default for KeySerializer {
337 fn default() -> Self {
338 Self::new()
339 }
340}
341
342#[cfg(test)]
343mod tests {
344 use std::f64;
345
346 use reifydb_type::util::hex;
347
348 use super::*;
349 use crate::util::encoding::keycode::KeyDeserializer;
350
351 #[test]
352 fn test_new() {
353 let serializer = KeySerializer::new();
354 assert!(serializer.is_empty());
355 assert_eq!(serializer.len(), 0);
356 }
357
358 #[test]
359 fn test_with_capacity() {
360 let serializer = KeySerializer::with_capacity(100);
361 assert!(serializer.is_empty());
362 assert_eq!(serializer.len(), 0);
363 }
364
365 #[test]
366 fn test_extend_bool() {
367 let mut serializer = KeySerializer::new();
368 serializer.extend_bool(true);
369 let result = serializer.finish();
370 assert_eq!(result, vec![0x00]);
371 assert_eq!(hex::encode(&result), "00");
372
373 let mut serializer = KeySerializer::new();
374 serializer.extend_bool(false);
375 let result = serializer.finish();
376 assert_eq!(result, vec![0x01]);
377 assert_eq!(hex::encode(&result), "01");
378 }
379
380 #[test]
381 fn test_extend_f32() {
382 let mut serializer = KeySerializer::new();
383 serializer.extend_f32(3.14f32);
384 let result = serializer.finish();
385 assert_eq!(result.len(), 4);
386 assert_eq!(hex::encode(&result), "3fb70a3c");
387
388 let mut serializer = KeySerializer::new();
389 serializer.extend_f32(-3.14f32);
390 let result = serializer.finish();
391 assert_eq!(result.len(), 4);
392 assert_eq!(hex::encode(&result), "c048f5c3");
393
394 let mut serializer = KeySerializer::new();
395 serializer.extend_f32(0.0f32);
396 let result = serializer.finish();
397 assert_eq!(hex::encode(&result), "7fffffff");
398
399 let mut serializer = KeySerializer::new();
400 serializer.extend_f32(f32::MAX);
401 let result = serializer.finish();
402 assert_eq!(hex::encode(&result), "00800000");
403
404 let mut serializer = KeySerializer::new();
405 serializer.extend_f32(f32::MIN);
406 let result = serializer.finish();
407 assert_eq!(hex::encode(&result), "ff7fffff");
408 }
409
410 #[test]
411 fn test_extend_f64() {
412 let mut serializer = KeySerializer::new();
413 serializer.extend_f64(f64::consts::PI);
414 let result = serializer.finish();
415 assert_eq!(result.len(), 8);
416 assert_eq!(hex::encode(&result), "3ff6de04abbbd2e7");
417
418 let mut serializer = KeySerializer::new();
419 serializer.extend_f64(-f64::consts::PI);
420 let result = serializer.finish();
421 assert_eq!(result.len(), 8);
422 assert_eq!(hex::encode(&result), "c00921fb54442d18");
423
424 let mut serializer = KeySerializer::new();
425 serializer.extend_f64(0.0f64);
426 let result = serializer.finish();
427 assert_eq!(hex::encode(&result), "7fffffffffffffff");
428 }
429
430 #[test]
431 fn test_extend_i8() {
432 let mut serializer = KeySerializer::new();
433 serializer.extend_i8(0i8);
434 let result = serializer.finish();
435 assert_eq!(hex::encode(&result), "7f");
436
437 let mut serializer = KeySerializer::new();
438 serializer.extend_i8(1i8);
439 let result = serializer.finish();
440 assert_eq!(hex::encode(&result), "7e");
441
442 let mut serializer = KeySerializer::new();
443 serializer.extend_i8(-1i8);
444 let result = serializer.finish();
445 assert_eq!(hex::encode(&result), "80");
446
447 let mut serializer = KeySerializer::new();
448 serializer.extend_i8(i8::MAX);
449 let result = serializer.finish();
450 assert_eq!(hex::encode(&result), "00");
451
452 let mut serializer = KeySerializer::new();
453 serializer.extend_i8(i8::MIN);
454 let result = serializer.finish();
455 assert_eq!(hex::encode(&result), "ff");
456 }
457
458 #[test]
459 fn test_extend_i16() {
460 let mut serializer = KeySerializer::new();
461 serializer.extend_i16(0i16);
462 let result = serializer.finish();
463 assert_eq!(hex::encode(&result), "7fff");
464
465 let mut serializer = KeySerializer::new();
466 serializer.extend_i16(1i16);
467 let result = serializer.finish();
468 assert_eq!(hex::encode(&result), "7ffe");
469
470 let mut serializer = KeySerializer::new();
471 serializer.extend_i16(-1i16);
472 let result = serializer.finish();
473 assert_eq!(hex::encode(&result), "8000");
474
475 let mut serializer = KeySerializer::new();
476 serializer.extend_i16(i16::MAX);
477 let result = serializer.finish();
478 assert_eq!(hex::encode(&result), "0000");
479
480 let mut serializer = KeySerializer::new();
481 serializer.extend_i16(i16::MIN);
482 let result = serializer.finish();
483 assert_eq!(hex::encode(&result), "ffff");
484 }
485
486 #[test]
487 fn test_extend_i32() {
488 let mut serializer = KeySerializer::new();
489 serializer.extend_i32(0i32);
490 let result = serializer.finish();
491 assert_eq!(hex::encode(&result), "7fffffff");
492
493 let mut serializer = KeySerializer::new();
494 serializer.extend_i32(1i32);
495 let result = serializer.finish();
496 assert_eq!(hex::encode(&result), "7ffffffe");
497
498 let mut serializer = KeySerializer::new();
499 serializer.extend_i32(-1i32);
500 let result = serializer.finish();
501 assert_eq!(hex::encode(&result), "80000000");
502
503 let mut serializer = KeySerializer::new();
504 serializer.extend_i32(i32::MAX);
505 let result = serializer.finish();
506 assert_eq!(hex::encode(&result), "00000000");
507
508 let mut serializer = KeySerializer::new();
509 serializer.extend_i32(i32::MIN);
510 let result = serializer.finish();
511 assert_eq!(hex::encode(&result), "ffffffff");
512 }
513
514 #[test]
515 fn test_extend_i64() {
516 let mut serializer = KeySerializer::new();
517 serializer.extend_i64(0i64);
518 let result = serializer.finish();
519 assert_eq!(hex::encode(&result), "7fffffffffffffff");
520
521 let mut serializer = KeySerializer::new();
522 serializer.extend_i64(1i64);
523 let result = serializer.finish();
524 assert_eq!(hex::encode(&result), "7ffffffffffffffe");
525
526 let mut serializer = KeySerializer::new();
527 serializer.extend_i64(-1i64);
528 let result = serializer.finish();
529 assert_eq!(hex::encode(&result), "8000000000000000");
530
531 let mut serializer = KeySerializer::new();
532 serializer.extend_i64(i64::MAX);
533 let result = serializer.finish();
534 assert_eq!(hex::encode(&result), "0000000000000000");
535
536 let mut serializer = KeySerializer::new();
537 serializer.extend_i64(i64::MIN);
538 let result = serializer.finish();
539 assert_eq!(hex::encode(&result), "ffffffffffffffff");
540 }
541
542 #[test]
543 fn test_extend_i128() {
544 let mut serializer = KeySerializer::new();
545 serializer.extend_i128(0i128);
546 let result = serializer.finish();
547 assert_eq!(hex::encode(&result), "7fffffffffffffffffffffffffffffff");
548
549 let mut serializer = KeySerializer::new();
550 serializer.extend_i128(1i128);
551 let result = serializer.finish();
552 assert_eq!(hex::encode(&result), "7ffffffffffffffffffffffffffffffe");
553
554 let mut serializer = KeySerializer::new();
555 serializer.extend_i128(-1i128);
556 let result = serializer.finish();
557 assert_eq!(hex::encode(&result), "80000000000000000000000000000000");
558
559 let mut serializer = KeySerializer::new();
560 serializer.extend_i128(i128::MAX);
561 let result = serializer.finish();
562 assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
563
564 let mut serializer = KeySerializer::new();
565 serializer.extend_i128(i128::MIN);
566 let result = serializer.finish();
567 assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
568 }
569
570 #[test]
571 fn test_extend_u8() {
572 let mut serializer = KeySerializer::new();
573 serializer.extend_u8(0u8);
574 let result = serializer.finish();
575 assert_eq!(hex::encode(&result), "ff");
576
577 let mut serializer = KeySerializer::new();
578 serializer.extend_u8(1u8);
579 let result = serializer.finish();
580 assert_eq!(hex::encode(&result), "fe");
581
582 let mut serializer = KeySerializer::new();
583 serializer.extend_u8(255u8);
584 let result = serializer.finish();
585 assert_eq!(hex::encode(&result), "00");
586 }
587
588 #[test]
589 fn test_extend_u16() {
590 let mut serializer = KeySerializer::new();
591 serializer.extend_u16(0u16);
592 let result = serializer.finish();
593 assert_eq!(hex::encode(&result), "ffff");
594
595 let mut serializer = KeySerializer::new();
596 serializer.extend_u16(1u16);
597 let result = serializer.finish();
598 assert_eq!(hex::encode(&result), "fffe");
599
600 let mut serializer = KeySerializer::new();
601 serializer.extend_u16(255u16);
602 let result = serializer.finish();
603 assert_eq!(hex::encode(&result), "ff00");
604
605 let mut serializer = KeySerializer::new();
606 serializer.extend_u16(u16::MAX);
607 let result = serializer.finish();
608 assert_eq!(hex::encode(&result), "0000");
609 }
610
611 #[test]
612 fn test_extend_u32() {
613 let mut serializer = KeySerializer::new();
614 serializer.extend_u32(0u32);
615 let result = serializer.finish();
616 assert_eq!(hex::encode(&result), "ffffffff");
617
618 let mut serializer = KeySerializer::new();
619 serializer.extend_u32(1u32);
620 let result = serializer.finish();
621 assert_eq!(hex::encode(&result), "fffffffe");
622
623 let mut serializer = KeySerializer::new();
624 serializer.extend_u32(u32::MAX);
625 let result = serializer.finish();
626 assert_eq!(hex::encode(&result), "00000000");
627 }
628
629 #[test]
630 fn test_extend_u64() {
631 let mut serializer = KeySerializer::new();
632 serializer.extend_u64(0u64);
633 let result = serializer.finish();
634 assert_eq!(hex::encode(&result), "ffffffffffffffff");
635
636 let mut serializer = KeySerializer::new();
637 serializer.extend_u64(1u64);
638 let result = serializer.finish();
639 assert_eq!(hex::encode(&result), "fffffffffffffffe");
640
641 let mut serializer = KeySerializer::new();
642 serializer.extend_u64(65535u64);
643 let result = serializer.finish();
644 assert_eq!(hex::encode(&result), "ffffffffffff0000");
645
646 let mut serializer = KeySerializer::new();
647 serializer.extend_u64(u64::MAX);
648 let result = serializer.finish();
649 assert_eq!(hex::encode(&result), "0000000000000000");
650 }
651
652 #[test]
653 fn test_extend_u128() {
654 let mut serializer = KeySerializer::new();
655 serializer.extend_u128(0u128);
656 let result = serializer.finish();
657 assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
658
659 let mut serializer = KeySerializer::new();
660 serializer.extend_u128(1u128);
661 let result = serializer.finish();
662 assert_eq!(hex::encode(&result), "fffffffffffffffffffffffffffffffe");
663
664 let mut serializer = KeySerializer::new();
665 serializer.extend_u128(u128::MAX);
666 let result = serializer.finish();
667 assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
668 }
669
670 #[test]
671 fn test_extend_bytes() {
672 let mut serializer = KeySerializer::new();
673 serializer.extend_bytes(b"hello");
674 let result = serializer.finish();
675 assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
677
678 let mut serializer = KeySerializer::new();
680 serializer.extend_bytes(&[0x01, 0xff, 0x02]);
681 let result = serializer.finish();
682 assert_eq!(result, vec![0x01, 0xff, 0x00, 0x02, 0xff, 0xff]);
684 }
685
686 #[test]
687 fn test_extend_str() {
688 let mut serializer = KeySerializer::new();
689 serializer.extend_str("hello world");
690 let result = serializer.finish();
691 assert!(result.len() > "hello world".len());
693 assert!(result.ends_with(&[0xff, 0xff]));
694 }
695
696 #[test]
697 fn test_extend_raw() {
698 let mut serializer = KeySerializer::new();
699 serializer.extend_raw(&[0x01, 0x02, 0x03]);
700 let result = serializer.finish();
701 assert_eq!(result, vec![0x01, 0x02, 0x03]);
702 }
703
704 #[test]
705 fn test_chaining() {
706 let mut serializer = KeySerializer::new();
707 serializer.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
708 let result = serializer.finish();
709
710 assert!(result.len() >= 19);
712
713 let mut de = KeyDeserializer::from_bytes(&result);
714 assert_eq!(de.read_bool().unwrap(), true);
715 assert_eq!(de.read_i32().unwrap(), 42);
716 assert_eq!(de.read_str().unwrap(), "test");
717 assert_eq!(de.read_u64().unwrap(), 1000);
718 assert!(de.is_empty());
719 }
720
721 #[test]
722 fn test_ordering_descending_i32() {
723 let mut ser1 = KeySerializer::new();
725 ser1.extend_i32(1i32);
726 let bytes1 = ser1.finish();
727
728 let mut ser2 = KeySerializer::new();
729 ser2.extend_i32(100i32);
730 let bytes2 = ser2.finish();
731
732 let mut ser3 = KeySerializer::new();
733 ser3.extend_i32(1000i32);
734 let bytes3 = ser3.finish();
735
736 assert!(bytes3 < bytes2, "encode(1000) should be < encode(100)");
739 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
740 }
741
742 #[test]
743 fn test_ordering_descending_u64() {
744 let mut ser1 = KeySerializer::new();
745 ser1.extend_u64(1u64);
746 let bytes1 = ser1.finish();
747
748 let mut ser2 = KeySerializer::new();
749 ser2.extend_u64(100u64);
750 let bytes2 = ser2.finish();
751
752 let mut ser3 = KeySerializer::new();
753 ser3.extend_u64(10000u64);
754 let bytes3 = ser3.finish();
755
756 assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
758 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
759 }
760
761 #[test]
762 fn test_ordering_descending_negative() {
763 let mut ser1 = KeySerializer::new();
767 ser1.extend_i32(-1i32);
768 let bytes_neg1 = ser1.finish();
769
770 let mut ser2 = KeySerializer::new();
771 ser2.extend_i32(-100i32);
772 let bytes_neg100 = ser2.finish();
773
774 let mut ser3 = KeySerializer::new();
775 ser3.extend_i32(-1000i32);
776 let bytes_neg1000 = ser3.finish();
777
778 assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
780 assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
781 }
782
783 #[test]
784 fn test_ordering_mixed_sign() {
785 let mut ser_neg = KeySerializer::new();
787 ser_neg.extend_i32(-1i32);
788 let bytes_neg = ser_neg.finish();
789
790 let mut ser_zero = KeySerializer::new();
791 ser_zero.extend_i32(0i32);
792 let bytes_zero = ser_zero.finish();
793
794 let mut ser_pos = KeySerializer::new();
795 ser_pos.extend_i32(1i32);
796 let bytes_pos = ser_pos.finish();
797
798 assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
800 assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
801 }
802
803 #[test]
804 fn test_date() {
805 use reifydb_type::Date;
806 let mut serializer = KeySerializer::new();
807 let date = Date::from_ymd(2024, 1, 1).unwrap();
808 serializer.extend_date(&date);
809 let result = serializer.finish();
810 assert_eq!(result.len(), 4); }
812
813 #[test]
814 fn test_datetime() {
815 use reifydb_type::DateTime;
816 let mut serializer = KeySerializer::new();
817 let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
818 serializer.extend_datetime(&datetime);
819 let result = serializer.finish();
820 assert_eq!(result.len(), 8); }
822
823 #[test]
824 fn test_time() {
825 use reifydb_type::Time;
826 let mut serializer = KeySerializer::new();
827 let time = Time::from_hms(12, 30, 45).unwrap();
828 serializer.extend_time(&time);
829 let result = serializer.finish();
830 assert_eq!(result.len(), 8); }
832
833 #[test]
834 fn test_interval() {
835 use reifydb_type::Duration;
836 let mut serializer = KeySerializer::new();
837 let duration = Duration::from_nanoseconds(1000000);
838 serializer.extend_duration(&duration);
839 let result = serializer.finish();
840 assert_eq!(result.len(), 8); }
842
843 #[test]
844 fn test_row_number() {
845 use reifydb_type::RowNumber;
846 let mut serializer = KeySerializer::new();
847 let row_number = RowNumber(42);
848 serializer.extend_row_number(&row_number);
849 let result = serializer.finish();
850 assert_eq!(result.len(), 8); }
852
853 #[test]
854 fn test_identity_id() {
855 use reifydb_type::IdentityId;
856 let mut serializer = KeySerializer::new();
857 let id = IdentityId::generate();
858 serializer.extend_identity_id(&id);
859 let result = serializer.finish();
860 assert!(result.len() > 0);
861 }
862
863 #[test]
864 fn test_uuid4() {
865 use reifydb_type::Uuid4;
866 let mut serializer = KeySerializer::new();
867 let uuid = Uuid4::generate();
868 serializer.extend_uuid4(&uuid);
869 let result = serializer.finish();
870 assert!(result.len() > 16);
872 }
873
874 #[test]
875 fn test_uuid7() {
876 use reifydb_type::Uuid7;
877 let mut serializer = KeySerializer::new();
878 let uuid = Uuid7::generate();
879 serializer.extend_uuid7(&uuid);
880 let result = serializer.finish();
881 assert!(result.len() > 16);
883 }
884
885 #[test]
886 fn test_blob() {
887 use reifydb_type::Blob;
888 let mut serializer = KeySerializer::new();
889 let blob = Blob::from(vec![0x01, 0x02, 0x03]);
890 serializer.extend_blob(&blob);
891 let result = serializer.finish();
892 assert!(result.len() > 3);
894 }
895
896 #[test]
897 fn test_int() {
898 use num_bigint::BigInt;
899 use reifydb_type::Int;
900 let mut serializer = KeySerializer::new();
901 let int = Int(BigInt::from(42));
902 serializer.extend_int(&int);
903 let result = serializer.finish();
904 assert!(result.len() > 0);
906 }
907
908 #[test]
909 fn test_uint() {
910 use num_bigint::BigInt;
911 use reifydb_type::Uint;
912 let mut serializer = KeySerializer::new();
913 let uint = Uint(BigInt::from(42));
914 serializer.extend_uint(&uint);
915 let result = serializer.finish();
916 assert!(result.len() > 0);
918 }
919
920 #[test]
921 fn test_decimal() {
922 use std::str::FromStr;
923
924 use reifydb_type::Decimal;
925 let mut serializer = KeySerializer::new();
926 let decimal = Decimal::from_str("3.14").unwrap();
927 serializer.extend_decimal(&decimal);
928 let result = serializer.finish();
929 assert!(result.len() > 0);
931 }
932
933 #[test]
934 fn test_extend_value() {
935 use reifydb_type::Value;
936
937 let mut serializer = KeySerializer::new();
939 serializer.extend_value(&Value::Undefined);
940 let result = serializer.finish();
941 assert_eq!(result, vec![0x00]);
942
943 let mut serializer = KeySerializer::new();
945 serializer.extend_value(&Value::Boolean(true));
946 let result = serializer.finish();
947 assert_eq!(result, vec![0x00]);
948
949 let mut serializer = KeySerializer::new();
951 serializer.extend_value(&Value::Int4(42));
952 let result = serializer.finish();
953 assert_eq!(result.len(), 4);
954
955 let mut serializer = KeySerializer::new();
957 serializer.extend_value(&Value::Utf8("test".to_string()));
958 let result = serializer.finish();
959 assert!(result.ends_with(&[0xff, 0xff]));
960 }
961
962 #[test]
963 fn test_to_encoded_key() {
964 let mut serializer = KeySerializer::new();
965 serializer.extend_i32(42);
966 let key = serializer.to_encoded_key();
967 assert_eq!(key.len(), 4);
968 }
969
970 #[test]
971 fn test_index_id() {
972 use crate::interface::{IndexId, PrimaryKeyId};
973
974 let mut serializer = KeySerializer::new();
975 serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
976 let result = serializer.finish();
977
978 assert_eq!(result.len(), 9);
980 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
984 serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
985 let result2 = serializer2.finish();
986
987 assert!(result2[1..] > result[1..]);
990 }
991
992 #[test]
993 fn test_source_id() {
994 use crate::interface::{SourceId, TableId};
995
996 let mut serializer = KeySerializer::new();
997 serializer.extend_source_id(SourceId::Table(TableId(987654321)));
998 let result = serializer.finish();
999
1000 assert_eq!(result.len(), 9);
1002 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1006 serializer2.extend_source_id(SourceId::Table(TableId(987654322)));
1007 let result2 = serializer2.finish();
1008
1009 assert!(result2[1..] < result[1..]);
1012 }
1013}