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_value::{
19 util::hash::Hash128,
20 value::{
21 Value,
22 blob::Blob,
23 date::Date,
24 datetime::DateTime,
25 duration::Duration,
26 identity::IdentityId,
27 row_number::RowNumber,
28 time::Time,
29 uuid::{Uuid4, Uuid7},
30 },
31};
32use serde::{
33 de::{Deserialize, Deserializer},
34 ser::{Serialize, Serializer},
35};
36
37use crate::key::serializer::KeySerializer;
38
39fn decode_binary(s: &str) -> Vec<u8> {
40 let mut buf = [0; 4];
41 let mut bytes = Vec::new();
42 for c in s.chars() {
43 match c as u32 {
44 b @ 0x80..=0xff => bytes.push(b as u8),
45 _ => bytes.extend(c.encode_utf8(&mut buf).as_bytes()),
46 }
47 }
48 bytes
49}
50
51pub const INLINE_CAP: usize = 39;
52
53#[derive(Clone)]
54pub enum EncodedKey {
55 Inline {
56 len: u8,
57 buf: [u8; INLINE_CAP],
58 },
59 Shared(Arc<[u8]>),
60}
61
62const _: () = assert!(mem::size_of::<EncodedKey>() == INLINE_CAP + 1 + mem::size_of::<usize>());
63
64impl EncodedKey {
65 pub fn new(key: impl AsRef<[u8]>) -> Self {
66 let key = key.as_ref();
67 if key.len() <= INLINE_CAP {
68 let mut buf = [0u8; INLINE_CAP];
69 buf[..key.len()].copy_from_slice(key);
70 EncodedKey::Inline {
71 len: key.len() as u8,
72 buf,
73 }
74 } else {
75 EncodedKey::Shared(Arc::from(key))
76 }
77 }
78
79 pub fn builder() -> EncodedKeyBuilder {
80 EncodedKeyBuilder::new()
81 }
82
83 pub fn as_bytes(&self) -> &[u8] {
84 self.as_slice()
85 }
86
87 pub fn as_slice(&self) -> &[u8] {
88 match self {
89 EncodedKey::Inline {
90 len,
91 buf,
92 } => &buf[..*len as usize],
93 EncodedKey::Shared(bytes) => bytes,
94 }
95 }
96
97 pub fn to_vec(&self) -> Vec<u8> {
98 self.as_slice().to_vec()
99 }
100}
101
102impl Deref for EncodedKey {
103 type Target = [u8];
104
105 fn deref(&self) -> &[u8] {
106 self.as_slice()
107 }
108}
109
110impl AsRef<[u8]> for EncodedKey {
111 fn as_ref(&self) -> &[u8] {
112 self.as_slice()
113 }
114}
115
116impl Borrow<[u8]> for EncodedKey {
117 fn borrow(&self) -> &[u8] {
118 self.as_slice()
119 }
120}
121
122impl PartialEq for EncodedKey {
123 fn eq(&self, other: &Self) -> bool {
124 self.as_slice() == other.as_slice()
125 }
126}
127
128impl Eq for EncodedKey {}
129
130impl PartialOrd for EncodedKey {
131 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
132 Some(self.cmp(other))
133 }
134}
135
136impl Ord for EncodedKey {
137 fn cmp(&self, other: &Self) -> Ordering {
138 self.as_slice().cmp(other.as_slice())
139 }
140}
141
142impl Hash for EncodedKey {
143 fn hash<H: Hasher>(&self, state: &mut H) {
144 self.as_slice().hash(state);
145 }
146}
147
148impl PartialEq<Vec<u8>> for EncodedKey {
149 fn eq(&self, other: &Vec<u8>) -> bool {
150 self.as_slice() == other.as_slice()
151 }
152}
153
154impl PartialEq<[u8]> for EncodedKey {
155 fn eq(&self, other: &[u8]) -> bool {
156 self.as_slice() == other
157 }
158}
159
160impl Serialize for EncodedKey {
161 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
162 self.as_slice().serialize(serializer)
163 }
164}
165
166impl<'de> Deserialize<'de> for EncodedKey {
167 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
168 let vec = Vec::<u8>::deserialize(deserializer)?;
169 Ok(EncodedKey::new(vec))
170 }
171}
172
173impl fmt::Debug for EncodedKey {
174 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
175 write!(f, "EncodedKey({:02x?})", self.as_slice())
176 }
177}
178
179pub struct EncodedKeyBuilder {
180 serializer: KeySerializer,
181}
182
183impl EncodedKeyBuilder {
184 pub fn new() -> Self {
185 Self {
186 serializer: KeySerializer::new(),
187 }
188 }
189
190 pub fn with_capacity(capacity: usize) -> Self {
191 Self {
192 serializer: KeySerializer::with_capacity(capacity),
193 }
194 }
195
196 pub fn build(self) -> EncodedKey {
197 self.serializer.to_encoded_key()
198 }
199
200 pub fn bool(mut self, value: bool) -> Self {
201 self.serializer.extend_bool(value);
202 self
203 }
204
205 pub fn f32(mut self, value: f32) -> Self {
206 self.serializer.extend_f32(value);
207 self
208 }
209
210 pub fn f64(mut self, value: f64) -> Self {
211 self.serializer.extend_f64(value);
212 self
213 }
214
215 pub fn i8<T: Into<i8>>(mut self, value: T) -> Self {
216 self.serializer.extend_i8(value);
217 self
218 }
219
220 pub fn i16<T: Into<i16>>(mut self, value: T) -> Self {
221 self.serializer.extend_i16(value);
222 self
223 }
224
225 pub fn i32<T: Into<i32>>(mut self, value: T) -> Self {
226 self.serializer.extend_i32(value);
227 self
228 }
229
230 pub fn i64<T: Into<i64>>(mut self, value: T) -> Self {
231 self.serializer.extend_i64(value);
232 self
233 }
234
235 pub fn i128<T: Into<i128>>(mut self, value: T) -> Self {
236 self.serializer.extend_i128(value);
237 self
238 }
239
240 pub fn u8<T: Into<u8>>(mut self, value: T) -> Self {
241 self.serializer.extend_u8(value);
242 self
243 }
244
245 pub fn u16<T: Into<u16>>(mut self, value: T) -> Self {
246 self.serializer.extend_u16(value);
247 self
248 }
249
250 pub fn u32<T: Into<u32>>(mut self, value: T) -> Self {
251 self.serializer.extend_u32(value);
252 self
253 }
254
255 pub fn u64<T: Into<u64>>(mut self, value: T) -> Self {
256 self.serializer.extend_u64(value);
257 self
258 }
259
260 pub fn u128<T: Into<u128>>(mut self, value: T) -> Self {
261 self.serializer.extend_u128(value);
262 self
263 }
264
265 pub fn bytes<T: AsRef<[u8]>>(mut self, bytes: T) -> Self {
266 self.serializer.extend_bytes(bytes);
267 self
268 }
269
270 pub fn str<T: AsRef<str>>(mut self, s: T) -> Self {
271 self.serializer.extend_str(s);
272 self
273 }
274
275 pub fn raw(mut self, bytes: &[u8]) -> Self {
276 self.serializer.extend_raw(bytes);
277 self
278 }
279
280 pub fn len(&self) -> usize {
281 self.serializer.len()
282 }
283
284 pub fn is_empty(&self) -> bool {
285 self.serializer.is_empty()
286 }
287
288 pub fn date(mut self, date: &Date) -> Self {
289 self.serializer.extend_date(date);
290 self
291 }
292
293 pub fn datetime(mut self, datetime: &DateTime) -> Self {
294 self.serializer.extend_datetime(datetime);
295 self
296 }
297
298 pub fn time(mut self, time: &Time) -> Self {
299 self.serializer.extend_time(time);
300 self
301 }
302
303 pub fn duration(mut self, duration: &Duration) -> Self {
304 self.serializer.extend_duration(duration);
305 self
306 }
307
308 pub fn row_number(mut self, row_number: &RowNumber) -> Self {
309 self.serializer.extend_row_number(row_number);
310 self
311 }
312
313 pub fn identity_id(mut self, id: &IdentityId) -> Self {
314 self.serializer.extend_identity_id(id);
315 self
316 }
317
318 pub fn uuid4(mut self, uuid: &Uuid4) -> Self {
319 self.serializer.extend_uuid4(uuid);
320 self
321 }
322
323 pub fn uuid7(mut self, uuid: &Uuid7) -> Self {
324 self.serializer.extend_uuid7(uuid);
325 self
326 }
327
328 pub fn blob(mut self, blob: &Blob) -> Self {
329 self.serializer.extend_blob(blob);
330 self
331 }
332
333 pub fn value(mut self, value: &Value) -> Self {
334 self.serializer.extend_value(value);
335 self
336 }
337}
338
339impl Default for EncodedKeyBuilder {
340 fn default() -> Self {
341 Self::new()
342 }
343}
344
345pub trait IntoEncodedKey {
346 fn into_encoded_key(self) -> EncodedKey;
347}
348
349impl IntoEncodedKey for EncodedKey {
350 fn into_encoded_key(self) -> EncodedKey {
351 self
352 }
353}
354
355impl IntoEncodedKey for &str {
356 fn into_encoded_key(self) -> EncodedKey {
357 let mut serializer = KeySerializer::new();
358 serializer.extend_str(self);
359 serializer.to_encoded_key()
360 }
361}
362
363impl IntoEncodedKey for String {
364 fn into_encoded_key(self) -> EncodedKey {
365 let mut serializer = KeySerializer::new();
366 serializer.extend_str(&self);
367 serializer.to_encoded_key()
368 }
369}
370
371impl IntoEncodedKey for Vec<u8> {
372 fn into_encoded_key(self) -> EncodedKey {
373 let mut serializer = KeySerializer::new();
374 serializer.extend_bytes(&self);
375 serializer.to_encoded_key()
376 }
377}
378
379impl IntoEncodedKey for &[u8] {
380 fn into_encoded_key(self) -> EncodedKey {
381 let mut serializer = KeySerializer::new();
382 serializer.extend_bytes(self);
383 serializer.to_encoded_key()
384 }
385}
386
387impl IntoEncodedKey for u64 {
388 fn into_encoded_key(self) -> EncodedKey {
389 let mut serializer = KeySerializer::with_capacity(8);
390 serializer.extend_u64(self);
391 serializer.to_encoded_key()
392 }
393}
394
395impl IntoEncodedKey for i64 {
396 fn into_encoded_key(self) -> EncodedKey {
397 let mut serializer = KeySerializer::with_capacity(8);
398 serializer.extend_i64(self);
399 serializer.to_encoded_key()
400 }
401}
402
403impl IntoEncodedKey for u32 {
404 fn into_encoded_key(self) -> EncodedKey {
405 let mut serializer = KeySerializer::with_capacity(4);
406 serializer.extend_u32(self);
407 serializer.to_encoded_key()
408 }
409}
410
411impl IntoEncodedKey for i32 {
412 fn into_encoded_key(self) -> EncodedKey {
413 let mut serializer = KeySerializer::with_capacity(4);
414 serializer.extend_i32(self);
415 serializer.to_encoded_key()
416 }
417}
418
419impl IntoEncodedKey for u16 {
420 fn into_encoded_key(self) -> EncodedKey {
421 let mut serializer = KeySerializer::with_capacity(2);
422 serializer.extend_u16(self);
423 serializer.to_encoded_key()
424 }
425}
426
427impl IntoEncodedKey for i16 {
428 fn into_encoded_key(self) -> EncodedKey {
429 let mut serializer = KeySerializer::with_capacity(2);
430 serializer.extend_i16(self);
431 serializer.to_encoded_key()
432 }
433}
434
435impl IntoEncodedKey for u8 {
436 fn into_encoded_key(self) -> EncodedKey {
437 let mut serializer = KeySerializer::with_capacity(1);
438 serializer.extend_u8(self);
439 serializer.to_encoded_key()
440 }
441}
442
443impl IntoEncodedKey for i8 {
444 fn into_encoded_key(self) -> EncodedKey {
445 let mut serializer = KeySerializer::with_capacity(1);
446 serializer.extend_i8(self);
447 serializer.to_encoded_key()
448 }
449}
450
451impl IntoEncodedKey for &u64 {
452 fn into_encoded_key(self) -> EncodedKey {
453 (*self).into_encoded_key()
454 }
455}
456
457impl IntoEncodedKey for &i64 {
458 fn into_encoded_key(self) -> EncodedKey {
459 (*self).into_encoded_key()
460 }
461}
462
463impl IntoEncodedKey for &u32 {
464 fn into_encoded_key(self) -> EncodedKey {
465 (*self).into_encoded_key()
466 }
467}
468
469impl IntoEncodedKey for &i32 {
470 fn into_encoded_key(self) -> EncodedKey {
471 (*self).into_encoded_key()
472 }
473}
474
475impl IntoEncodedKey for &u16 {
476 fn into_encoded_key(self) -> EncodedKey {
477 (*self).into_encoded_key()
478 }
479}
480
481impl IntoEncodedKey for &i16 {
482 fn into_encoded_key(self) -> EncodedKey {
483 (*self).into_encoded_key()
484 }
485}
486
487impl IntoEncodedKey for &u8 {
488 fn into_encoded_key(self) -> EncodedKey {
489 (*self).into_encoded_key()
490 }
491}
492
493impl IntoEncodedKey for &i8 {
494 fn into_encoded_key(self) -> EncodedKey {
495 (*self).into_encoded_key()
496 }
497}
498
499impl IntoEncodedKey for &Hash128 {
500 fn into_encoded_key(self) -> EncodedKey {
501 let mut serializer = KeySerializer::with_capacity(16);
502 serializer.extend_u128(self.0);
503 serializer.to_encoded_key()
504 }
505}
506
507impl IntoEncodedKey for RowNumber {
508 fn into_encoded_key(self) -> EncodedKey {
509 self.0.into_encoded_key()
510 }
511}
512
513impl IntoEncodedKey for &RowNumber {
514 fn into_encoded_key(self) -> EncodedKey {
515 self.0.into_encoded_key()
516 }
517}
518
519impl IntoEncodedKey for Value {
520 fn into_encoded_key(self) -> EncodedKey {
521 let mut serializer = KeySerializer::new();
522 serializer.extend_value(&self);
523 serializer.to_encoded_key()
524 }
525}
526
527impl IntoEncodedKey for &Value {
528 fn into_encoded_key(self) -> EncodedKey {
529 let mut serializer = KeySerializer::new();
530 serializer.extend_value(self);
531 serializer.to_encoded_key()
532 }
533}
534
535impl IntoEncodedKey for Vec<Value> {
536 fn into_encoded_key(self) -> EncodedKey {
537 let mut serializer = KeySerializer::new();
538 for value in self.iter() {
539 serializer.extend_value(value);
540 }
541 serializer.to_encoded_key()
542 }
543}
544
545impl IntoEncodedKey for &[Value] {
546 fn into_encoded_key(self) -> EncodedKey {
547 let mut serializer = KeySerializer::new();
548 for value in self.iter() {
549 serializer.extend_value(value);
550 }
551 serializer.to_encoded_key()
552 }
553}
554
555impl IntoEncodedKey for (String, String) {
556 fn into_encoded_key(self) -> EncodedKey {
557 let mut serializer = KeySerializer::new();
558 serializer.extend_str(&self.0);
559 serializer.extend_str(&self.1);
560 serializer.to_encoded_key()
561 }
562}
563
564impl IntoEncodedKey for &(String, String) {
565 fn into_encoded_key(self) -> EncodedKey {
566 let mut serializer = KeySerializer::new();
567 serializer.extend_str(&self.0);
568 serializer.extend_str(&self.1);
569 serializer.to_encoded_key()
570 }
571}
572
573impl IntoEncodedKey for (&str, &str) {
574 fn into_encoded_key(self) -> EncodedKey {
575 let mut serializer = KeySerializer::new();
576 serializer.extend_str(self.0);
577 serializer.extend_str(self.1);
578 serializer.to_encoded_key()
579 }
580}
581
582impl IntoEncodedKey for (Arc<str>, Arc<str>) {
583 fn into_encoded_key(self) -> EncodedKey {
584 let mut serializer = KeySerializer::new();
585 serializer.extend_str(&self.0);
586 serializer.extend_str(&self.1);
587 serializer.to_encoded_key()
588 }
589}
590
591impl IntoEncodedKey for &(Arc<str>, Arc<str>) {
592 fn into_encoded_key(self) -> EncodedKey {
593 let mut serializer = KeySerializer::new();
594 serializer.extend_str(&self.0);
595 serializer.extend_str(&self.1);
596 serializer.to_encoded_key()
597 }
598}
599
600impl IntoEncodedKey for (String, String, String) {
601 fn into_encoded_key(self) -> EncodedKey {
602 let mut serializer = KeySerializer::new();
603 serializer.extend_str(&self.0);
604 serializer.extend_str(&self.1);
605 serializer.extend_str(&self.2);
606 serializer.to_encoded_key()
607 }
608}
609
610impl IntoEncodedKey for &(String, String, String) {
611 fn into_encoded_key(self) -> EncodedKey {
612 let mut serializer = KeySerializer::new();
613 serializer.extend_str(&self.0);
614 serializer.extend_str(&self.1);
615 serializer.extend_str(&self.2);
616 serializer.to_encoded_key()
617 }
618}
619
620impl IntoEncodedKey for &String {
621 fn into_encoded_key(self) -> EncodedKey {
622 let mut serializer = KeySerializer::new();
623 serializer.extend_str(self);
624 serializer.to_encoded_key()
625 }
626}
627
628#[derive(Clone, Debug)]
629pub struct EncodedKeyRange {
630 pub start: Bound<EncodedKey>,
631 pub end: Bound<EncodedKey>,
632}
633
634impl EncodedKeyRange {
635 pub fn new(start: Bound<EncodedKey>, end: Bound<EncodedKey>) -> Self {
636 Self {
637 start,
638 end,
639 }
640 }
641
642 pub fn prefix(prefix: &[u8]) -> Self {
643 let start = Bound::Included(EncodedKey::new(prefix));
644 let end = match prefix.iter().rposition(|&b| b != 0xff) {
645 Some(i) => Bound::Excluded(EncodedKey::new(
646 prefix.iter().take(i).copied().chain(iter::once(prefix[i] + 1)).collect::<Vec<_>>(),
647 )),
648 None => Bound::Unbounded,
649 };
650 Self {
651 start,
652 end,
653 }
654 }
655
656 pub fn with_prefix(&self, prefix: EncodedKey) -> Self {
657 let start = match self.start_bound() {
658 Included(key) => {
659 let mut prefixed = Vec::with_capacity(prefix.len() + key.len());
660 prefixed.extend_from_slice(prefix.as_ref());
661 prefixed.extend_from_slice(key.as_ref());
662 Included(EncodedKey::new(prefixed))
663 }
664 Excluded(key) => {
665 let mut prefixed = Vec::with_capacity(prefix.len() + key.len());
666 prefixed.extend_from_slice(prefix.as_ref());
667 prefixed.extend_from_slice(key.as_ref());
668 Excluded(EncodedKey::new(prefixed))
669 }
670 Unbounded => Included(prefix.clone()),
671 };
672
673 let end = match self.end_bound() {
674 Included(key) => {
675 let mut prefixed = Vec::with_capacity(prefix.len() + key.len());
676 prefixed.extend_from_slice(prefix.as_ref());
677 prefixed.extend_from_slice(key.as_ref());
678 Included(EncodedKey::new(prefixed))
679 }
680 Excluded(key) => {
681 let mut prefixed = Vec::with_capacity(prefix.len() + key.len());
682 prefixed.extend_from_slice(prefix.as_ref());
683 prefixed.extend_from_slice(key.as_ref());
684 Excluded(EncodedKey::new(prefixed))
685 }
686 Unbounded => match prefix.as_ref().iter().rposition(|&b| b != 0xff) {
687 Some(i) => {
688 let mut next_prefix = prefix.as_ref()[..=i].to_vec();
689 next_prefix[i] += 1;
690 Excluded(EncodedKey::new(next_prefix))
691 }
692 None => Unbounded,
693 },
694 };
695
696 EncodedKeyRange::new(start, end)
697 }
698
699 pub fn start_end(start: Option<EncodedKey>, end: Option<EncodedKey>) -> Self {
700 let start = match start {
701 Some(s) => Bound::Included(s),
702 None => Bound::Unbounded,
703 };
704
705 let end = match end {
706 Some(e) => Bound::Included(e),
707 None => Bound::Unbounded,
708 };
709
710 Self {
711 start,
712 end,
713 }
714 }
715
716 pub fn all() -> Self {
717 Self {
718 start: Bound::Unbounded,
719 end: Bound::Unbounded,
720 }
721 }
722
723 pub fn parse(str: &str) -> Self {
724 let (mut start, mut end) = (Bound::<EncodedKey>::Unbounded, Bound::<EncodedKey>::Unbounded);
725
726 if let Some(dot_pos) = str.find("..") {
727 let start_part = &str[..dot_pos];
728 let end_part = &str[dot_pos + 2..];
729
730 if !start_part.is_empty() {
731 start = Bound::Included(EncodedKey::new(decode_binary(start_part)));
732 }
733
734 if let Some(end_str) = end_part.strip_prefix('=') {
735 if !end_str.is_empty() {
736 end = Bound::Included(EncodedKey::new(decode_binary(end_str)));
737 }
738 } else if !end_part.is_empty() {
739 end = Bound::Excluded(EncodedKey::new(decode_binary(end_part)));
740 }
741
742 Self {
743 start,
744 end,
745 }
746 } else {
747 Self {
748 start: Bound::Included(EncodedKey::new([0xff])),
749 end: Bound::Excluded(EncodedKey::new([0xff])),
750 }
751 }
752 }
753}
754
755impl RangeBounds<EncodedKey> for EncodedKeyRange {
756 fn start_bound(&self) -> Bound<&EncodedKey> {
757 self.start.as_ref()
758 }
759
760 fn end_bound(&self) -> Bound<&EncodedKey> {
761 self.end.as_ref()
762 }
763}