Skip to main content

reifydb_codec/key/
encoded.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_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}