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