reifydb_core/interface/
store.rs1use reifydb_type::{Result, util::cowvec::CowVec};
5
6use crate::{
7 common::CommitVersion,
8 delta::Delta,
9 encoded::{
10 key::{EncodedKey, EncodedKeyRange},
11 row::EncodedRow,
12 },
13 interface::catalog::{flow::FlowNodeId, shape::ShapeId},
14};
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18pub enum Tier {
19 Hot,
20 Warm,
21 Cold,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
28pub enum EntryKind {
29 Multi,
31 Source(ShapeId),
33 Operator(FlowNodeId),
35}
36
37#[derive(Debug, Clone)]
38pub struct MultiVersionRow {
39 pub key: EncodedKey,
40 pub row: EncodedRow,
41 pub version: CommitVersion,
42}
43
44#[derive(Debug, Clone)]
45pub struct SingleVersionRow {
46 pub key: EncodedKey,
47 pub row: EncodedRow,
48}
49
50#[derive(Debug, Clone)]
52pub struct MultiVersionBatch {
53 pub items: Vec<MultiVersionRow>,
55 pub has_more: bool,
57}
58
59impl MultiVersionBatch {
60 pub fn empty() -> Self {
62 Self {
63 items: Vec::new(),
64 has_more: false,
65 }
66 }
67
68 pub fn is_empty(&self) -> bool {
70 self.items.is_empty()
71 }
72}
73
74pub trait MultiVersionCommit: Send + Sync {
76 fn commit(&self, deltas: CowVec<Delta>, version: CommitVersion) -> Result<()>;
78}
79
80pub trait MultiVersionGet: Send + Sync {
82 fn get(&self, key: &EncodedKey, version: CommitVersion) -> Result<Option<MultiVersionRow>>;
84}
85
86pub trait MultiVersionContains: Send + Sync {
88 fn contains(&self, key: &EncodedKey, version: CommitVersion) -> Result<bool>;
90}
91
92pub trait MultiVersionGetPrevious: Send + Sync {
98 fn get_previous_version(
109 &self,
110 key: &EncodedKey,
111 before_version: CommitVersion,
112 ) -> Result<Option<MultiVersionRow>>;
113}
114
115pub trait MultiVersionStore:
117 Send + Sync + Clone + MultiVersionCommit + MultiVersionGet + MultiVersionGetPrevious + MultiVersionContains + 'static
118{
119}
120
121#[derive(Debug, Clone)]
123pub struct SingleVersionBatch {
124 pub items: Vec<SingleVersionRow>,
126 pub has_more: bool,
128}
129
130impl SingleVersionBatch {
131 pub fn empty() -> Self {
133 Self {
134 items: Vec::new(),
135 has_more: false,
136 }
137 }
138
139 pub fn is_empty(&self) -> bool {
141 self.items.is_empty()
142 }
143}
144
145pub trait SingleVersionCommit: Send + Sync {
147 fn commit(&mut self, deltas: CowVec<Delta>) -> Result<()>;
149}
150
151pub trait SingleVersionGet: Send + Sync {
153 fn get(&self, key: &EncodedKey) -> Result<Option<SingleVersionRow>>;
155}
156
157pub trait SingleVersionContains: Send + Sync {
159 fn contains(&self, key: &EncodedKey) -> Result<bool>;
161}
162
163pub trait SingleVersionSet: SingleVersionCommit {
165 fn set(&mut self, key: &EncodedKey, row: EncodedRow) -> Result<()> {
167 Self::commit(
168 self,
169 CowVec::new(vec![Delta::Set {
170 key: key.clone(),
171 row: row.clone(),
172 }]),
173 )
174 }
175}
176
177pub trait SingleVersionRemove: SingleVersionCommit {
179 fn unset(&mut self, key: &EncodedKey, row: EncodedRow) -> Result<()> {
181 Self::commit(
182 self,
183 CowVec::new(vec![Delta::Unset {
184 key: key.clone(),
185 row,
186 }]),
187 )
188 }
189
190 fn remove(&mut self, key: &EncodedKey) -> Result<()> {
192 Self::commit(
193 self,
194 CowVec::new(vec![Delta::Remove {
195 key: key.clone(),
196 }]),
197 )
198 }
199}
200
201pub trait SingleVersionRange: Send + Sync {
203 fn range_batch(&self, range: EncodedKeyRange, batch_size: u64) -> Result<SingleVersionBatch>;
205
206 fn range(&self, range: EncodedKeyRange) -> Result<SingleVersionBatch> {
208 self.range_batch(range, 1024)
209 }
210
211 fn prefix(&self, prefix: &EncodedKey) -> Result<SingleVersionBatch> {
213 self.range(EncodedKeyRange::prefix(prefix))
214 }
215}
216
217pub trait SingleVersionRangeRev: Send + Sync {
219 fn range_rev_batch(&self, range: EncodedKeyRange, batch_size: u64) -> Result<SingleVersionBatch>;
221
222 fn range_rev(&self, range: EncodedKeyRange) -> Result<SingleVersionBatch> {
224 self.range_rev_batch(range, 1024)
225 }
226
227 fn prefix_rev(&self, prefix: &EncodedKey) -> Result<SingleVersionBatch> {
229 self.range_rev(EncodedKeyRange::prefix(prefix))
230 }
231}
232
233pub trait SingleVersionStore:
235 Send
236 + Sync
237 + Clone
238 + SingleVersionCommit
239 + SingleVersionGet
240 + SingleVersionContains
241 + SingleVersionSet
242 + SingleVersionRemove
243 + SingleVersionRange
244 + SingleVersionRangeRev
245 + 'static
246{
247}