Skip to main content

reifydb_core/encoded/
key.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 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_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			// decode_binary("0101") = [0x01, 0x01]
1030			assert_eq!(r.start, included(b"0101"));
1031			// decode_binary("0aff") = [0x0a, 0xff]
1032			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}