reifydb_core/interface/
store.rs1use 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#[derive(Debug, Clone)]
30pub struct MultiVersionBatch {
31 pub items: Vec<MultiVersionValues>,
33 pub has_more: bool,
35}
36
37impl MultiVersionBatch {
38 pub fn empty() -> Self {
40 Self {
41 items: Vec::new(),
42 has_more: false,
43 }
44 }
45
46 pub fn is_empty(&self) -> bool {
48 self.items.is_empty()
49 }
50}
51
52pub trait MultiVersionCommit: Send + Sync {
54 fn commit(&self, deltas: CowVec<Delta>, version: CommitVersion) -> reifydb_type::Result<()>;
56}
57
58pub trait MultiVersionGet: Send + Sync {
60 fn get(&self, key: &EncodedKey, version: CommitVersion) -> reifydb_type::Result<Option<MultiVersionValues>>;
62}
63
64pub trait MultiVersionContains: Send + Sync {
66 fn contains(&self, key: &EncodedKey, version: CommitVersion) -> reifydb_type::Result<bool>;
68}
69
70pub trait MultiVersionGetPrevious: Send + Sync {
76 fn get_previous_version(
87 &self,
88 key: &EncodedKey,
89 before_version: CommitVersion,
90 ) -> reifydb_type::Result<Option<MultiVersionValues>>;
91}
92
93pub trait MultiVersionStore:
95 Send + Sync + Clone + MultiVersionCommit + MultiVersionGet + MultiVersionGetPrevious + MultiVersionContains + 'static
96{
97}
98
99#[derive(Debug, Clone)]
101pub struct SingleVersionBatch {
102 pub items: Vec<SingleVersionValues>,
104 pub has_more: bool,
106}
107
108impl SingleVersionBatch {
109 pub fn empty() -> Self {
111 Self {
112 items: Vec::new(),
113 has_more: false,
114 }
115 }
116
117 pub fn is_empty(&self) -> bool {
119 self.items.is_empty()
120 }
121}
122
123pub trait SingleVersionCommit: Send + Sync {
125 fn commit(&mut self, deltas: CowVec<Delta>) -> reifydb_type::Result<()>;
127}
128
129pub trait SingleVersionGet: Send + Sync {
131 fn get(&self, key: &EncodedKey) -> reifydb_type::Result<Option<SingleVersionValues>>;
133}
134
135pub trait SingleVersionContains: Send + Sync {
137 fn contains(&self, key: &EncodedKey) -> reifydb_type::Result<bool>;
139}
140
141pub trait SingleVersionSet: SingleVersionCommit {
143 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
155pub trait SingleVersionRemove: SingleVersionCommit {
157 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 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
179pub trait SingleVersionRange: Send + Sync {
181 fn range_batch(&self, range: EncodedKeyRange, batch_size: u64) -> reifydb_type::Result<SingleVersionBatch>;
183
184 fn range(&self, range: EncodedKeyRange) -> reifydb_type::Result<SingleVersionBatch> {
186 self.range_batch(range, 1024)
187 }
188
189 fn prefix(&self, prefix: &EncodedKey) -> reifydb_type::Result<SingleVersionBatch> {
191 self.range(EncodedKeyRange::prefix(prefix))
192 }
193}
194
195pub trait SingleVersionRangeRev: Send + Sync {
197 fn range_rev_batch(&self, range: EncodedKeyRange, batch_size: u64) -> reifydb_type::Result<SingleVersionBatch>;
199
200 fn range_rev(&self, range: EncodedKeyRange) -> reifydb_type::Result<SingleVersionBatch> {
202 self.range_rev_batch(range, 1024)
203 }
204
205 fn prefix_rev(&self, prefix: &EncodedKey) -> reifydb_type::Result<SingleVersionBatch> {
207 self.range_rev(EncodedKeyRange::prefix(prefix))
208 }
209}
210
211pub 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}