1use std::{
5 borrow::Borrow,
6 cmp::Ordering,
7 collections::{
8 Bound,
9 Bound::{Excluded, Included, Unbounded},
10 },
11 fmt,
12 hash::{Hash, Hasher},
13 iter, mem,
14 ops::{Deref, RangeBounds},
15 sync::Arc,
16};
17
18use reifydb_runtime::hash::Hash128;
19use reifydb_value::value::{
20 Value,
21 blob::Blob,
22 date::Date,
23 datetime::DateTime,
24 decimal::Decimal,
25 duration::Duration,
26 identity::IdentityId,
27 int::Int,
28 row_number::RowNumber,
29 time::Time,
30 uint::Uint,
31 uuid::{Uuid4, Uuid7},
32};
33use serde::{
34 de::{Deserialize, Deserializer},
35 ser::{Serialize, Serializer},
36};
37
38use crate::{
39 interface::catalog::{id::IndexId, shape::ShapeId},
40 util::encoding::{binary::decode_binary, keycode::serializer::KeySerializer},
41};
42
43#[derive(Clone)]
44pub enum EncodedKey {
45 Inline {
46 len: u8,
47 buf: [u8; 62],
48 },
49 Heap(Vec<u8>),
50}
51
52const _: () = assert!(mem::size_of::<EncodedKey>() == 64);
53
54impl EncodedKey {
55 const INLINE_CAP: usize = 62;
56
57 pub fn new(key: impl Into<Vec<u8>>) -> Self {
58 let vec = key.into();
59 if vec.len() <= Self::INLINE_CAP {
60 let len = vec.len() as u8;
61 let mut buf = [0u8; 62];
62 buf[..vec.len()].copy_from_slice(&vec);
63 EncodedKey::Inline {
64 len,
65 buf,
66 }
67 } else {
68 EncodedKey::Heap(vec)
69 }
70 }
71
72 pub fn with_capacity(capacity: usize) -> Self {
73 if capacity <= Self::INLINE_CAP {
74 EncodedKey::Inline {
75 len: 0,
76 buf: [0u8; 62],
77 }
78 } else {
79 EncodedKey::Heap(Vec::with_capacity(capacity))
80 }
81 }
82
83 pub fn builder() -> EncodedKeyBuilder {
84 EncodedKeyBuilder::new()
85 }
86
87 pub fn as_bytes(&self) -> &[u8] {
88 self.as_slice()
89 }
90
91 pub fn as_slice(&self) -> &[u8] {
92 match self {
93 EncodedKey::Inline {
94 len,
95 buf,
96 } => &buf[..*len as usize],
97 EncodedKey::Heap(v) => v.as_slice(),
98 }
99 }
100
101 pub fn to_vec(&self) -> Vec<u8> {
102 self.as_slice().to_vec()
103 }
104
105 pub fn push(&mut self, byte: u8) {
106 match self {
107 EncodedKey::Inline {
108 len,
109 buf,
110 } => {
111 let cur = *len as usize;
112 if cur < Self::INLINE_CAP {
113 buf[cur] = byte;
114 *len += 1;
115 return;
116 }
117 let mut vec = Vec::with_capacity(cur + 1);
118 vec.extend_from_slice(&buf[..cur]);
119 vec.push(byte);
120 *self = EncodedKey::Heap(vec);
121 }
122 EncodedKey::Heap(v) => v.push(byte),
123 }
124 }
125
126 pub fn extend_from_slice(&mut self, slice: &[u8]) {
127 match self {
128 EncodedKey::Inline {
129 len,
130 buf,
131 } => {
132 let cur = *len as usize;
133 let total = cur + slice.len();
134 if total <= Self::INLINE_CAP {
135 buf[cur..total].copy_from_slice(slice);
136 *len = total as u8;
137 return;
138 }
139 let mut vec = Vec::with_capacity(total);
140 vec.extend_from_slice(&buf[..cur]);
141 vec.extend_from_slice(slice);
142 *self = EncodedKey::Heap(vec);
143 }
144 EncodedKey::Heap(v) => v.extend_from_slice(slice),
145 }
146 }
147}
148
149impl Deref for EncodedKey {
150 type Target = [u8];
151
152 fn deref(&self) -> &[u8] {
153 self.as_slice()
154 }
155}
156
157impl AsRef<[u8]> for EncodedKey {
158 fn as_ref(&self) -> &[u8] {
159 self.as_slice()
160 }
161}
162
163impl Borrow<[u8]> for EncodedKey {
164 fn borrow(&self) -> &[u8] {
165 self.as_slice()
166 }
167}
168
169impl PartialEq for EncodedKey {
170 fn eq(&self, other: &Self) -> bool {
171 self.as_slice() == other.as_slice()
172 }
173}
174
175impl Eq for EncodedKey {}
176
177impl PartialOrd for EncodedKey {
178 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
179 Some(self.cmp(other))
180 }
181}
182
183impl Ord for EncodedKey {
184 fn cmp(&self, other: &Self) -> Ordering {
185 self.as_slice().cmp(other.as_slice())
186 }
187}
188
189impl Hash for EncodedKey {
190 fn hash<H: Hasher>(&self, state: &mut H) {
191 self.as_slice().hash(state);
192 }
193}
194
195impl PartialEq<Vec<u8>> for EncodedKey {
196 fn eq(&self, other: &Vec<u8>) -> bool {
197 self.as_slice() == other.as_slice()
198 }
199}
200
201impl PartialEq<[u8]> for EncodedKey {
202 fn eq(&self, other: &[u8]) -> bool {
203 self.as_slice() == other
204 }
205}
206
207impl Serialize for EncodedKey {
208 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
209 self.as_slice().serialize(serializer)
210 }
211}
212
213impl<'de> Deserialize<'de> for EncodedKey {
214 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
215 let vec = Vec::<u8>::deserialize(deserializer)?;
216 Ok(EncodedKey::new(vec))
217 }
218}
219
220impl fmt::Debug for EncodedKey {
221 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
222 write!(f, "EncodedKey({:02x?})", self.as_slice())
223 }
224}
225
226pub struct EncodedKeyBuilder {
227 serializer: KeySerializer,
228}
229
230impl EncodedKeyBuilder {
231 pub fn new() -> Self {
232 Self {
233 serializer: KeySerializer::new(),
234 }
235 }
236
237 pub fn with_capacity(capacity: usize) -> Self {
238 Self {
239 serializer: KeySerializer::with_capacity(capacity),
240 }
241 }
242
243 pub fn build(self) -> EncodedKey {
244 self.serializer.to_encoded_key()
245 }
246
247 pub fn bool(mut self, value: bool) -> Self {
248 self.serializer.extend_bool(value);
249 self
250 }
251
252 pub fn f32(mut self, value: f32) -> Self {
253 self.serializer.extend_f32(value);
254 self
255 }
256
257 pub fn f64(mut self, value: f64) -> Self {
258 self.serializer.extend_f64(value);
259 self
260 }
261
262 pub fn i8<T: Into<i8>>(mut self, value: T) -> Self {
263 self.serializer.extend_i8(value);
264 self
265 }
266
267 pub fn i16<T: Into<i16>>(mut self, value: T) -> Self {
268 self.serializer.extend_i16(value);
269 self
270 }
271
272 pub fn i32<T: Into<i32>>(mut self, value: T) -> Self {
273 self.serializer.extend_i32(value);
274 self
275 }
276
277 pub fn i64<T: Into<i64>>(mut self, value: T) -> Self {
278 self.serializer.extend_i64(value);
279 self
280 }
281
282 pub fn i128<T: Into<i128>>(mut self, value: T) -> Self {
283 self.serializer.extend_i128(value);
284 self
285 }
286
287 pub fn u8<T: Into<u8>>(mut self, value: T) -> Self {
288 self.serializer.extend_u8(value);
289 self
290 }
291
292 pub fn u16<T: Into<u16>>(mut self, value: T) -> Self {
293 self.serializer.extend_u16(value);
294 self
295 }
296
297 pub fn u32<T: Into<u32>>(mut self, value: T) -> Self {
298 self.serializer.extend_u32(value);
299 self
300 }
301
302 pub fn u64<T: Into<u64>>(mut self, value: T) -> Self {
303 self.serializer.extend_u64(value);
304 self
305 }
306
307 pub fn u128<T: Into<u128>>(mut self, value: T) -> Self {
308 self.serializer.extend_u128(value);
309 self
310 }
311
312 pub fn bytes<T: AsRef<[u8]>>(mut self, bytes: T) -> Self {
313 self.serializer.extend_bytes(bytes);
314 self
315 }
316
317 pub fn str<T: AsRef<str>>(mut self, s: T) -> Self {
318 self.serializer.extend_str(s);
319 self
320 }
321
322 pub fn shape_id(mut self, shape: impl Into<ShapeId>) -> Self {
323 self.serializer.extend_shape_id(shape);
324 self
325 }
326
327 pub fn index_id(mut self, index: impl Into<IndexId>) -> Self {
328 self.serializer.extend_index_id(index);
329 self
330 }
331
332 pub fn serialize<T: Serialize>(mut self, value: &T) -> Self {
333 self.serializer.extend_serialize(value);
334 self
335 }
336
337 pub fn raw(mut self, bytes: &[u8]) -> Self {
338 self.serializer.extend_raw(bytes);
339 self
340 }
341
342 pub fn len(&self) -> usize {
343 self.serializer.len()
344 }
345
346 pub fn is_empty(&self) -> bool {
347 self.serializer.is_empty()
348 }
349
350 pub fn date(mut self, date: &Date) -> Self {
351 self.serializer.extend_date(date);
352 self
353 }
354
355 pub fn datetime(mut self, datetime: &DateTime) -> Self {
356 self.serializer.extend_datetime(datetime);
357 self
358 }
359
360 pub fn time(mut self, time: &Time) -> Self {
361 self.serializer.extend_time(time);
362 self
363 }
364
365 pub fn duration(mut self, duration: &Duration) -> Self {
366 self.serializer.extend_duration(duration);
367 self
368 }
369
370 pub fn row_number(mut self, row_number: &RowNumber) -> Self {
371 self.serializer.extend_row_number(row_number);
372 self
373 }
374
375 pub fn identity_id(mut self, id: &IdentityId) -> Self {
376 self.serializer.extend_identity_id(id);
377 self
378 }
379
380 pub fn uuid4(mut self, uuid: &Uuid4) -> Self {
381 self.serializer.extend_uuid4(uuid);
382 self
383 }
384
385 pub fn uuid7(mut self, uuid: &Uuid7) -> Self {
386 self.serializer.extend_uuid7(uuid);
387 self
388 }
389
390 pub fn blob(mut self, blob: &Blob) -> Self {
391 self.serializer.extend_blob(blob);
392 self
393 }
394
395 pub fn int(mut self, int: &Int) -> Self {
396 self.serializer.extend_int(int);
397 self
398 }
399
400 pub fn uint(mut self, uint: &Uint) -> Self {
401 self.serializer.extend_uint(uint);
402 self
403 }
404
405 pub fn decimal(mut self, decimal: &Decimal) -> Self {
406 self.serializer.extend_decimal(decimal);
407 self
408 }
409
410 pub fn value(mut self, value: &Value) -> Self {
411 self.serializer.extend_value(value);
412 self
413 }
414}
415
416impl Default for EncodedKeyBuilder {
417 fn default() -> Self {
418 Self::new()
419 }
420}
421
422pub trait IntoEncodedKey {
423 fn into_encoded_key(self) -> EncodedKey;
424}
425
426impl IntoEncodedKey for EncodedKey {
427 fn into_encoded_key(self) -> EncodedKey {
428 self
429 }
430}
431
432impl IntoEncodedKey for &str {
433 fn into_encoded_key(self) -> EncodedKey {
434 let mut serializer = KeySerializer::new();
435 serializer.extend_str(self);
436 serializer.to_encoded_key()
437 }
438}
439
440impl IntoEncodedKey for String {
441 fn into_encoded_key(self) -> EncodedKey {
442 let mut serializer = KeySerializer::new();
443 serializer.extend_str(&self);
444 serializer.to_encoded_key()
445 }
446}
447
448impl IntoEncodedKey for Vec<u8> {
449 fn into_encoded_key(self) -> EncodedKey {
450 let mut serializer = KeySerializer::new();
451 serializer.extend_bytes(&self);
452 serializer.to_encoded_key()
453 }
454}
455
456impl IntoEncodedKey for &[u8] {
457 fn into_encoded_key(self) -> EncodedKey {
458 let mut serializer = KeySerializer::new();
459 serializer.extend_bytes(self);
460 serializer.to_encoded_key()
461 }
462}
463
464impl IntoEncodedKey for u64 {
465 fn into_encoded_key(self) -> EncodedKey {
466 let mut serializer = KeySerializer::with_capacity(8);
467 serializer.extend_u64(self);
468 serializer.to_encoded_key()
469 }
470}
471
472impl IntoEncodedKey for i64 {
473 fn into_encoded_key(self) -> EncodedKey {
474 let mut serializer = KeySerializer::with_capacity(8);
475 serializer.extend_i64(self);
476 serializer.to_encoded_key()
477 }
478}
479
480impl IntoEncodedKey for u32 {
481 fn into_encoded_key(self) -> EncodedKey {
482 let mut serializer = KeySerializer::with_capacity(4);
483 serializer.extend_u32(self);
484 serializer.to_encoded_key()
485 }
486}
487
488impl IntoEncodedKey for i32 {
489 fn into_encoded_key(self) -> EncodedKey {
490 let mut serializer = KeySerializer::with_capacity(4);
491 serializer.extend_i32(self);
492 serializer.to_encoded_key()
493 }
494}
495
496impl IntoEncodedKey for u16 {
497 fn into_encoded_key(self) -> EncodedKey {
498 let mut serializer = KeySerializer::with_capacity(2);
499 serializer.extend_u16(self);
500 serializer.to_encoded_key()
501 }
502}
503
504impl IntoEncodedKey for i16 {
505 fn into_encoded_key(self) -> EncodedKey {
506 let mut serializer = KeySerializer::with_capacity(2);
507 serializer.extend_i16(self);
508 serializer.to_encoded_key()
509 }
510}
511
512impl IntoEncodedKey for u8 {
513 fn into_encoded_key(self) -> EncodedKey {
514 let mut serializer = KeySerializer::with_capacity(1);
515 serializer.extend_u8(self);
516 serializer.to_encoded_key()
517 }
518}
519
520impl IntoEncodedKey for i8 {
521 fn into_encoded_key(self) -> EncodedKey {
522 let mut serializer = KeySerializer::with_capacity(1);
523 serializer.extend_i8(self);
524 serializer.to_encoded_key()
525 }
526}
527
528impl IntoEncodedKey for &u64 {
529 fn into_encoded_key(self) -> EncodedKey {
530 (*self).into_encoded_key()
531 }
532}
533
534impl IntoEncodedKey for &i64 {
535 fn into_encoded_key(self) -> EncodedKey {
536 (*self).into_encoded_key()
537 }
538}
539
540impl IntoEncodedKey for &u32 {
541 fn into_encoded_key(self) -> EncodedKey {
542 (*self).into_encoded_key()
543 }
544}
545
546impl IntoEncodedKey for &i32 {
547 fn into_encoded_key(self) -> EncodedKey {
548 (*self).into_encoded_key()
549 }
550}
551
552impl IntoEncodedKey for &u16 {
553 fn into_encoded_key(self) -> EncodedKey {
554 (*self).into_encoded_key()
555 }
556}
557
558impl IntoEncodedKey for &i16 {
559 fn into_encoded_key(self) -> EncodedKey {
560 (*self).into_encoded_key()
561 }
562}
563
564impl IntoEncodedKey for &u8 {
565 fn into_encoded_key(self) -> EncodedKey {
566 (*self).into_encoded_key()
567 }
568}
569
570impl IntoEncodedKey for &i8 {
571 fn into_encoded_key(self) -> EncodedKey {
572 (*self).into_encoded_key()
573 }
574}
575
576impl IntoEncodedKey for &Hash128 {
577 fn into_encoded_key(self) -> EncodedKey {
578 let mut serializer = KeySerializer::with_capacity(16);
579 serializer.extend_u128(self.0);
580 serializer.to_encoded_key()
581 }
582}
583
584impl IntoEncodedKey for RowNumber {
585 fn into_encoded_key(self) -> EncodedKey {
586 self.0.into_encoded_key()
587 }
588}
589
590impl IntoEncodedKey for &RowNumber {
591 fn into_encoded_key(self) -> EncodedKey {
592 self.0.into_encoded_key()
593 }
594}
595
596impl IntoEncodedKey for Value {
597 fn into_encoded_key(self) -> EncodedKey {
598 let mut serializer = KeySerializer::new();
599 serializer.extend_value(&self);
600 serializer.to_encoded_key()
601 }
602}
603
604impl IntoEncodedKey for &Value {
605 fn into_encoded_key(self) -> EncodedKey {
606 let mut serializer = KeySerializer::new();
607 serializer.extend_value(self);
608 serializer.to_encoded_key()
609 }
610}
611
612impl IntoEncodedKey for Vec<Value> {
613 fn into_encoded_key(self) -> EncodedKey {
614 let mut serializer = KeySerializer::new();
615 for value in self.iter() {
616 serializer.extend_value(value);
617 }
618 serializer.to_encoded_key()
619 }
620}
621
622impl IntoEncodedKey for &[Value] {
623 fn into_encoded_key(self) -> EncodedKey {
624 let mut serializer = KeySerializer::new();
625 for value in self.iter() {
626 serializer.extend_value(value);
627 }
628 serializer.to_encoded_key()
629 }
630}
631
632impl IntoEncodedKey for (String, String) {
633 fn into_encoded_key(self) -> EncodedKey {
634 let mut serializer = KeySerializer::new();
635 serializer.extend_str(&self.0);
636 serializer.extend_str(&self.1);
637 serializer.to_encoded_key()
638 }
639}
640
641impl IntoEncodedKey for &(String, String) {
642 fn into_encoded_key(self) -> EncodedKey {
643 let mut serializer = KeySerializer::new();
644 serializer.extend_str(&self.0);
645 serializer.extend_str(&self.1);
646 serializer.to_encoded_key()
647 }
648}
649
650impl IntoEncodedKey for (&str, &str) {
651 fn into_encoded_key(self) -> EncodedKey {
652 let mut serializer = KeySerializer::new();
653 serializer.extend_str(self.0);
654 serializer.extend_str(self.1);
655 serializer.to_encoded_key()
656 }
657}
658
659impl IntoEncodedKey for (Arc<str>, Arc<str>) {
660 fn into_encoded_key(self) -> EncodedKey {
661 let mut serializer = KeySerializer::new();
662 serializer.extend_str(&self.0);
663 serializer.extend_str(&self.1);
664 serializer.to_encoded_key()
665 }
666}
667
668impl IntoEncodedKey for &(Arc<str>, Arc<str>) {
669 fn into_encoded_key(self) -> EncodedKey {
670 let mut serializer = KeySerializer::new();
671 serializer.extend_str(&self.0);
672 serializer.extend_str(&self.1);
673 serializer.to_encoded_key()
674 }
675}
676
677impl IntoEncodedKey for (String, String, String) {
678 fn into_encoded_key(self) -> EncodedKey {
679 let mut serializer = KeySerializer::new();
680 serializer.extend_str(&self.0);
681 serializer.extend_str(&self.1);
682 serializer.extend_str(&self.2);
683 serializer.to_encoded_key()
684 }
685}
686
687impl IntoEncodedKey for &(String, String, String) {
688 fn into_encoded_key(self) -> EncodedKey {
689 let mut serializer = KeySerializer::new();
690 serializer.extend_str(&self.0);
691 serializer.extend_str(&self.1);
692 serializer.extend_str(&self.2);
693 serializer.to_encoded_key()
694 }
695}
696
697impl IntoEncodedKey for &String {
698 fn into_encoded_key(self) -> EncodedKey {
699 let mut serializer = KeySerializer::new();
700 serializer.extend_str(self);
701 serializer.to_encoded_key()
702 }
703}
704
705#[derive(Clone, Debug)]
706pub struct EncodedKeyRange {
707 pub start: Bound<EncodedKey>,
708 pub end: Bound<EncodedKey>,
709}
710
711impl EncodedKeyRange {
712 pub fn new(start: Bound<EncodedKey>, end: Bound<EncodedKey>) -> Self {
713 Self {
714 start,
715 end,
716 }
717 }
718
719 pub fn prefix(prefix: &[u8]) -> Self {
720 let start = Bound::Included(EncodedKey::new(prefix));
721 let end = match prefix.iter().rposition(|&b| b != 0xff) {
722 Some(i) => Bound::Excluded(EncodedKey::new(
723 prefix.iter().take(i).copied().chain(iter::once(prefix[i] + 1)).collect::<Vec<_>>(),
724 )),
725 None => Bound::Unbounded,
726 };
727 Self {
728 start,
729 end,
730 }
731 }
732
733 pub fn with_prefix(&self, prefix: EncodedKey) -> Self {
734 let start = match self.start_bound() {
735 Included(key) => {
736 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
737 prefixed.extend_from_slice(prefix.as_ref());
738 prefixed.extend_from_slice(key.as_ref());
739 Included(prefixed)
740 }
741 Excluded(key) => {
742 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
743 prefixed.extend_from_slice(prefix.as_ref());
744 prefixed.extend_from_slice(key.as_ref());
745 Excluded(prefixed)
746 }
747 Unbounded => Included(prefix.clone()),
748 };
749
750 let end = match self.end_bound() {
751 Included(key) => {
752 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
753 prefixed.extend_from_slice(prefix.as_ref());
754 prefixed.extend_from_slice(key.as_ref());
755 Included(prefixed)
756 }
757 Excluded(key) => {
758 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
759 prefixed.extend_from_slice(prefix.as_ref());
760 prefixed.extend_from_slice(key.as_ref());
761 Excluded(prefixed)
762 }
763 Unbounded => match prefix.as_ref().iter().rposition(|&b| b != 0xff) {
764 Some(i) => {
765 let mut next_prefix = prefix.as_ref()[..=i].to_vec();
766 next_prefix[i] += 1;
767 Excluded(EncodedKey::new(next_prefix))
768 }
769 None => Unbounded,
770 },
771 };
772
773 EncodedKeyRange::new(start, end)
774 }
775
776 pub fn start_end(start: Option<EncodedKey>, end: Option<EncodedKey>) -> Self {
777 let start = match start {
778 Some(s) => Bound::Included(s),
779 None => Bound::Unbounded,
780 };
781
782 let end = match end {
783 Some(e) => Bound::Included(e),
784 None => Bound::Unbounded,
785 };
786
787 Self {
788 start,
789 end,
790 }
791 }
792
793 pub fn all() -> Self {
794 Self {
795 start: Bound::Unbounded,
796 end: Bound::Unbounded,
797 }
798 }
799
800 pub fn parse(str: &str) -> Self {
801 let (mut start, mut end) = (Bound::<EncodedKey>::Unbounded, Bound::<EncodedKey>::Unbounded);
802
803 if let Some(dot_pos) = str.find("..") {
804 let start_part = &str[..dot_pos];
805 let end_part = &str[dot_pos + 2..];
806
807 if !start_part.is_empty() {
808 start = Bound::Included(EncodedKey::new(decode_binary(start_part)));
809 }
810
811 if let Some(end_str) = end_part.strip_prefix('=') {
812 if !end_str.is_empty() {
813 end = Bound::Included(EncodedKey::new(decode_binary(end_str)));
814 }
815 } else if !end_part.is_empty() {
816 end = Bound::Excluded(EncodedKey::new(decode_binary(end_part)));
817 }
818
819 Self {
820 start,
821 end,
822 }
823 } else {
824 Self {
825 start: Bound::Included(EncodedKey::new([0xff])),
826 end: Bound::Excluded(EncodedKey::new([0xff])),
827 }
828 }
829 }
830}
831
832impl RangeBounds<EncodedKey> for EncodedKeyRange {
833 fn start_bound(&self) -> Bound<&EncodedKey> {
834 self.start.as_ref()
835 }
836
837 fn end_bound(&self) -> Bound<&EncodedKey> {
838 self.end.as_ref()
839 }
840}
841
842#[cfg(test)]
843pub mod tests {
844 use std::collections::Bound;
845
846 use super::EncodedKey;
847
848 macro_rules! as_key {
849 ($key:expr) => {{ EncodedKey::new(keycode::serialize(&$key)) }};
850 }
851
852 mod prefix {
853 use std::ops::Bound;
854
855 use crate::encoded::key::{
856 EncodedKeyRange,
857 tests::{excluded, included},
858 };
859
860 #[test]
861 fn test_simple() {
862 let range = EncodedKeyRange::prefix(&[0x12, 0x34]);
863 assert_eq!(range.start, included(&[0x12, 0x34]));
864 assert_eq!(range.end, excluded(&[0x12, 0x35]));
865 }
866
867 #[test]
868 fn test_with_trailing_ff() {
869 let range = EncodedKeyRange::prefix(&[0x12, 0xff]);
870 assert_eq!(range.start, included(&[0x12, 0xff]));
871 assert_eq!(range.end, excluded(&[0x13]));
872 }
873
874 #[test]
875 fn test_with_multiple_trailing_ff() {
876 let range = EncodedKeyRange::prefix(&[0x12, 0xff, 0xff]);
877 assert_eq!(range.start, included(&[0x12, 0xff, 0xff]));
878 assert_eq!(range.end, excluded(&[0x13]));
879 }
880
881 #[test]
882 fn test_all_ff() {
883 let range = EncodedKeyRange::prefix(&[0xff, 0xff]);
884 assert_eq!(range.start, included(&[0xff, 0xff]));
885 assert_eq!(range.end, Bound::Unbounded);
886 }
887
888 #[test]
889 fn test_empty() {
890 let range = EncodedKeyRange::prefix(&[]);
891 assert_eq!(range.start, included(&[]));
892 assert_eq!(range.end, Bound::Unbounded);
893 }
894
895 #[test]
896 fn test_mid_increment() {
897 let range = EncodedKeyRange::prefix(&[0x12, 0x00, 0xff]);
898 assert_eq!(range.start, included(&[0x12, 0x00, 0xff]));
899 assert_eq!(range.end, excluded(&[0x12, 0x01]));
900 }
901 }
902
903 mod start_end {
904 use std::ops::Bound;
905
906 use crate::{
907 encoded::key::{EncodedKey, EncodedKeyRange, tests::included},
908 util::encoding::keycode,
909 };
910
911 #[test]
912 fn test_start_and_end() {
913 let range = EncodedKeyRange::start_end(Some(as_key!(1)), Some(as_key!(2)));
914 assert_eq!(range.start, included(&as_key!(1)));
915 assert_eq!(range.end, included(&as_key!(2)));
916 }
917
918 #[test]
919 fn test_start_only() {
920 let range = EncodedKeyRange::start_end(Some(as_key!(1)), None);
921 assert_eq!(range.start, included(&as_key!(1)));
922 assert_eq!(range.end, Bound::Unbounded);
923 }
924
925 #[test]
926 fn test_end_only() {
927 let range = EncodedKeyRange::start_end(None, Some(as_key!(2)));
928 assert_eq!(range.start, Bound::Unbounded);
929 assert_eq!(range.end, included(&as_key!(2)));
930 }
931
932 #[test]
933 fn test_unbounded_range() {
934 let range = EncodedKeyRange::start_end(None, None);
935 assert_eq!(range.start, Bound::Unbounded);
936 assert_eq!(range.end, Bound::Unbounded);
937 }
938
939 #[test]
940 fn test_full_byte_range() {
941 let range = EncodedKeyRange::start_end(Some(as_key!(0x00)), Some(as_key!(0xff)));
942 assert_eq!(range.start, included(&as_key!(0x00)));
943 assert_eq!(range.end, included(&as_key!(0xff)));
944 }
945
946 #[test]
947 fn test_identical_bounds() {
948 let range = EncodedKeyRange::start_end(Some(as_key!(0x42)), Some(as_key!(0x42)));
949 assert_eq!(range.start, included(&as_key!(0x42)));
950 assert_eq!(range.end, included(&as_key!(0x42)));
951 }
952 }
953
954 mod all {
955 use std::ops::Bound;
956
957 use crate::encoded::key::EncodedKeyRange;
958
959 #[test]
960 fn test_is_unbounded() {
961 let range = EncodedKeyRange::all();
962 assert_eq!(range.start, Bound::Unbounded);
963 assert_eq!(range.end, Bound::Unbounded);
964 }
965 }
966
967 mod parse {
968 use std::ops::Bound;
969
970 use crate::encoded::key::{
971 EncodedKey, EncodedKeyRange,
972 tests::{excluded, included},
973 };
974
975 #[test]
976 fn test_full_range() {
977 let r = EncodedKeyRange::parse("a..z");
978 assert_eq!(r.start, included(b"a"));
979 assert_eq!(r.end, excluded(b"z"));
980 }
981
982 #[test]
983 fn test_inclusive_end() {
984 let r = EncodedKeyRange::parse("a..=z");
985 assert_eq!(r.start, included(b"a"));
986 assert_eq!(r.end, included(b"z"));
987 }
988
989 #[test]
990 fn test_unbounded_start() {
991 let r = EncodedKeyRange::parse("..z");
992 assert_eq!(r.start, Bound::Unbounded);
993 assert_eq!(r.end, excluded(b"z"));
994 }
995
996 #[test]
997 fn test_unbounded_end() {
998 let r = EncodedKeyRange::parse("a..");
999 assert_eq!(r.start, included(b"a"));
1000 assert_eq!(r.end, Bound::Unbounded);
1001 }
1002
1003 #[test]
1004 fn test_inclusive_only() {
1005 let r = EncodedKeyRange::parse("..=z");
1006 assert_eq!(r.start, Bound::Unbounded);
1007 assert_eq!(r.end, included(b"z"));
1008 }
1009
1010 #[test]
1011 fn test_invalid_string_returns_degenerate_range() {
1012 let r = EncodedKeyRange::parse("not a range");
1013 let expected = EncodedKey::new([0xff]);
1014 assert_eq!(r.start, Bound::Included(expected.clone()));
1015 assert_eq!(r.end, Bound::Excluded(expected));
1016 }
1017
1018 #[test]
1019 fn test_empty_string_returns_degenerate_range() {
1020 let r = EncodedKeyRange::parse("");
1021 let expected = EncodedKey::new([0xff]);
1022 assert_eq!(r.start, Bound::Included(expected.clone()));
1023 assert_eq!(r.end, Bound::Excluded(expected));
1024 }
1025
1026 #[test]
1027 fn test_binary_encoded_row() {
1028 let r = EncodedKeyRange::parse("0101..=0aff");
1029 assert_eq!(r.start, included(b"0101"));
1031 assert_eq!(r.end, included(b"0aff"));
1033 }
1034 }
1035
1036 fn included(key: &[u8]) -> Bound<EncodedKey> {
1037 Bound::Included(EncodedKey::new(key))
1038 }
1039
1040 fn excluded(key: &[u8]) -> Bound<EncodedKey> {
1041 Bound::Excluded(EncodedKey::new(key))
1042 }
1043}