Skip to main content

reifydb_core/interface/
store.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::util::cowvec::CowVec;
5
6use crate::{
7	common::CommitVersion,
8	delta::Delta,
9	encoded::{
10		encoded::EncodedValues,
11		key::{EncodedKey, EncodedKeyRange},
12	},
13};
14
15#[derive(Debug, Clone)]
16pub struct MultiVersionValues {
17	pub key: EncodedKey,
18	pub values: EncodedValues,
19	pub version: CommitVersion,
20}
21
22#[derive(Debug, Clone)]
23pub struct SingleVersionValues {
24	pub key: EncodedKey,
25	pub values: EncodedValues,
26}
27
28/// A batch of multi-version range results with continuation info.
29#[derive(Debug, Clone)]
30pub struct MultiVersionBatch {
31	/// The values in this batch.
32	pub items: Vec<MultiVersionValues>,
33	/// Whether there are more items after this batch.
34	pub has_more: bool,
35}
36
37impl MultiVersionBatch {
38	/// Creates an empty batch with no more results.
39	pub fn empty() -> Self {
40		Self {
41			items: Vec::new(),
42			has_more: false,
43		}
44	}
45
46	/// Returns true if this batch contains no items.
47	pub fn is_empty(&self) -> bool {
48		self.items.is_empty()
49	}
50}
51
52/// Trait for committing deltas to multi-version storage.
53pub trait MultiVersionCommit: Send + Sync {
54	/// Commit a batch of deltas at the given version.
55	fn commit(&self, deltas: CowVec<Delta>, version: CommitVersion) -> reifydb_type::Result<()>;
56}
57
58/// Trait for getting values from multi-version storage.
59pub trait MultiVersionGet: Send + Sync {
60	/// Get the value for a key at a specific version.
61	fn get(&self, key: &EncodedKey, version: CommitVersion) -> reifydb_type::Result<Option<MultiVersionValues>>;
62}
63
64/// Trait for checking key existence in multi-version storage.
65pub trait MultiVersionContains: Send + Sync {
66	/// Check if a key exists at a specific version.
67	fn contains(&self, key: &EncodedKey, version: CommitVersion) -> reifydb_type::Result<bool>;
68}
69
70/// Trait for getting the previous version of a key before a given version.
71///
72/// This trait allows looking up what value existed for a key before a specific version,
73/// which is essential for CDC (Change Data Capture) to determine if a change is an
74/// Insert, Update, or Delete.
75pub trait MultiVersionGetPrevious: Send + Sync {
76	/// Get the previous version of a key before the given version.
77	///
78	/// # Arguments
79	/// * `key` - The encoded key to look up
80	/// * `before_version` - Look for versions strictly before this version
81	///
82	/// # Returns
83	/// * `Ok(Some(values))` - Found a previous version with its value
84	/// * `Ok(None)` - No previous version exists (this is the first version)
85	/// * `Err(_)` - Lookup failed
86	fn get_previous_version(
87		&self,
88		key: &EncodedKey,
89		before_version: CommitVersion,
90	) -> reifydb_type::Result<Option<MultiVersionValues>>;
91}
92
93/// Composite trait for multi-version storage capabilities.
94pub trait MultiVersionStore:
95	Send + Sync + Clone + MultiVersionCommit + MultiVersionGet + MultiVersionGetPrevious + MultiVersionContains + 'static
96{
97}
98
99/// A batch of single-version range results with continuation info.
100#[derive(Debug, Clone)]
101pub struct SingleVersionBatch {
102	/// The values in this batch.
103	pub items: Vec<SingleVersionValues>,
104	/// Whether there are more items after this batch.
105	pub has_more: bool,
106}
107
108impl SingleVersionBatch {
109	/// Creates an empty batch with no more results.
110	pub fn empty() -> Self {
111		Self {
112			items: Vec::new(),
113			has_more: false,
114		}
115	}
116
117	/// Returns true if this batch contains no items.
118	pub fn is_empty(&self) -> bool {
119		self.items.is_empty()
120	}
121}
122
123/// Trait for committing deltas to single-version storage.
124pub trait SingleVersionCommit: Send + Sync {
125	/// Commit a batch of deltas.
126	fn commit(&mut self, deltas: CowVec<Delta>) -> reifydb_type::Result<()>;
127}
128
129/// Trait for getting values from single-version storage.
130pub trait SingleVersionGet: Send + Sync {
131	/// Get the value for a key.
132	fn get(&self, key: &EncodedKey) -> reifydb_type::Result<Option<SingleVersionValues>>;
133}
134
135/// Trait for checking key existence in single-version storage.
136pub trait SingleVersionContains: Send + Sync {
137	/// Check if a key exists.
138	fn contains(&self, key: &EncodedKey) -> reifydb_type::Result<bool>;
139}
140
141/// Trait for setting values in single-version storage.
142pub trait SingleVersionSet: SingleVersionCommit {
143	/// Set a value for a key.
144	fn set(&mut self, key: &EncodedKey, values: EncodedValues) -> reifydb_type::Result<()> {
145		Self::commit(
146			self,
147			CowVec::new(vec![Delta::Set {
148				key: key.clone(),
149				values: values.clone(),
150			}]),
151		)
152	}
153}
154
155/// Trait for removing values from single-version storage.
156pub trait SingleVersionRemove: SingleVersionCommit {
157	/// Unset a key, preserving the deleted values for CDC and metrics.
158	fn unset(&mut self, key: &EncodedKey, values: EncodedValues) -> reifydb_type::Result<()> {
159		Self::commit(
160			self,
161			CowVec::new(vec![Delta::Unset {
162				key: key.clone(),
163				values,
164			}]),
165		)
166	}
167
168	/// Remove a key without preserving the deleted values.
169	fn remove(&mut self, key: &EncodedKey) -> reifydb_type::Result<()> {
170		Self::commit(
171			self,
172			CowVec::new(vec![Delta::Remove {
173				key: key.clone(),
174			}]),
175		)
176	}
177}
178
179/// Trait for forward range queries with batch-fetch pattern.
180pub trait SingleVersionRange: Send + Sync {
181	/// Fetch a batch of values in key order (ascending).
182	fn range_batch(&self, range: EncodedKeyRange, batch_size: u64) -> reifydb_type::Result<SingleVersionBatch>;
183
184	/// Convenience method with default batch size.
185	fn range(&self, range: EncodedKeyRange) -> reifydb_type::Result<SingleVersionBatch> {
186		self.range_batch(range, 1024)
187	}
188
189	/// Range query with prefix.
190	fn prefix(&self, prefix: &EncodedKey) -> reifydb_type::Result<SingleVersionBatch> {
191		self.range(EncodedKeyRange::prefix(prefix))
192	}
193}
194
195/// Trait for reverse range queries with batch-fetch pattern.
196pub trait SingleVersionRangeRev: Send + Sync {
197	/// Fetch a batch of values in reverse key order (descending).
198	fn range_rev_batch(&self, range: EncodedKeyRange, batch_size: u64) -> reifydb_type::Result<SingleVersionBatch>;
199
200	/// Convenience method with default batch size.
201	fn range_rev(&self, range: EncodedKeyRange) -> reifydb_type::Result<SingleVersionBatch> {
202		self.range_rev_batch(range, 1024)
203	}
204
205	/// Reverse range query with prefix.
206	fn prefix_rev(&self, prefix: &EncodedKey) -> reifydb_type::Result<SingleVersionBatch> {
207		self.range_rev(EncodedKeyRange::prefix(prefix))
208	}
209}
210
211/// Composite trait for single-version storage capabilities.
212pub trait SingleVersionStore:
213	Send
214	+ Sync
215	+ Clone
216	+ SingleVersionCommit
217	+ SingleVersionGet
218	+ SingleVersionContains
219	+ SingleVersionSet
220	+ SingleVersionRemove
221	+ SingleVersionRange
222	+ SingleVersionRangeRev
223	+ 'static
224{
225}