Skip to main content

reifydb_core/encoded/
key.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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			// decode_binary("0101") = [0x01, 0x01]
1021			assert_eq!(r.start, included(b"0101"));
1022			// decode_binary("0aff") = [0x0a, 0xff]
1023			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}