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)]
17pub enum Tier {
18 Buffer,
19 Persistent,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23pub enum EntryKind {
24 Multi,
25
26 Source(ShapeId),
27
28 Operator(FlowNodeId),
29}
30
31#[derive(Debug, Clone)]
32pub struct MultiVersionRow {
33 pub key: EncodedKey,
34 pub row: EncodedRow,
35 pub version: CommitVersion,
36}
37
38#[derive(Debug, Clone)]
39pub struct SingleVersionRow {
40 pub key: EncodedKey,
41 pub row: EncodedRow,
42}
43
44#[derive(Debug, Clone)]
45pub struct MultiVersionBatch {
46 pub items: Vec<MultiVersionRow>,
47
48 pub has_more: bool,
49}
50
51impl MultiVersionBatch {
52 pub fn empty() -> Self {
53 Self {
54 items: Vec::new(),
55 has_more: false,
56 }
57 }
58
59 pub fn is_empty(&self) -> bool {
60 self.items.is_empty()
61 }
62}
63
64pub trait MultiVersionCommit: Send + Sync {
65 fn commit(&self, deltas: CowVec<Delta>, version: CommitVersion) -> Result<()>;
66}
67
68pub trait MultiVersionGet: Send + Sync {
69 fn get(&self, key: &EncodedKey, version: CommitVersion) -> Result<Option<MultiVersionRow>>;
70}
71
72pub trait MultiVersionContains: Send + Sync {
73 fn contains(&self, key: &EncodedKey, version: CommitVersion) -> Result<bool>;
74}
75
76pub trait MultiVersionGetPrevious: Send + Sync {
77 fn get_previous_version(
78 &self,
79 key: &EncodedKey,
80 before_version: CommitVersion,
81 ) -> Result<Option<MultiVersionRow>>;
82}
83
84pub trait MultiVersionStore:
85 Send + Sync + Clone + MultiVersionCommit + MultiVersionGet + MultiVersionGetPrevious + MultiVersionContains + 'static
86{
87}
88
89#[derive(Debug, Clone)]
90pub struct SingleVersionBatch {
91 pub items: Vec<SingleVersionRow>,
92
93 pub has_more: bool,
94}
95
96impl SingleVersionBatch {
97 pub fn empty() -> Self {
98 Self {
99 items: Vec::new(),
100 has_more: false,
101 }
102 }
103
104 pub fn is_empty(&self) -> bool {
105 self.items.is_empty()
106 }
107}
108
109pub trait SingleVersionCommit: Send + Sync {
110 fn commit(&mut self, deltas: CowVec<Delta>) -> Result<()>;
111}
112
113pub trait SingleVersionGet: Send + Sync {
114 fn get(&self, key: &EncodedKey) -> Result<Option<SingleVersionRow>>;
115}
116
117pub trait SingleVersionContains: Send + Sync {
118 fn contains(&self, key: &EncodedKey) -> Result<bool>;
119}
120
121pub trait SingleVersionSet: SingleVersionCommit {
122 fn set(&mut self, key: &EncodedKey, row: EncodedRow) -> Result<()> {
123 Self::commit(
124 self,
125 CowVec::new(vec![Delta::Set {
126 key: key.clone(),
127 row: row.clone(),
128 }]),
129 )
130 }
131}
132
133pub trait SingleVersionRemove: SingleVersionCommit {
134 fn unset(&mut self, key: &EncodedKey, row: EncodedRow) -> Result<()> {
135 Self::commit(
136 self,
137 CowVec::new(vec![Delta::Unset {
138 key: key.clone(),
139 row,
140 }]),
141 )
142 }
143
144 fn remove(&mut self, key: &EncodedKey) -> Result<()> {
145 Self::commit(
146 self,
147 CowVec::new(vec![Delta::Remove {
148 key: key.clone(),
149 }]),
150 )
151 }
152}
153
154pub trait SingleVersionRange: Send + Sync {
155 fn range_batch(&self, range: EncodedKeyRange, batch_size: u64) -> Result<SingleVersionBatch>;
156
157 fn range(&self, range: EncodedKeyRange) -> Result<SingleVersionBatch> {
158 self.range_batch(range, 1024)
159 }
160
161 fn prefix(&self, prefix: &EncodedKey) -> Result<SingleVersionBatch> {
162 self.range(EncodedKeyRange::prefix(prefix))
163 }
164}
165
166pub trait SingleVersionRangeRev: Send + Sync {
167 fn range_rev_batch(&self, range: EncodedKeyRange, batch_size: u64) -> Result<SingleVersionBatch>;
168
169 fn range_rev(&self, range: EncodedKeyRange) -> Result<SingleVersionBatch> {
170 self.range_rev_batch(range, 1024)
171 }
172
173 fn prefix_rev(&self, prefix: &EncodedKey) -> Result<SingleVersionBatch> {
174 self.range_rev(EncodedKeyRange::prefix(prefix))
175 }
176}
177
178pub trait SingleVersionStore:
179 Send
180 + Sync
181 + Clone
182 + SingleVersionCommit
183 + SingleVersionGet
184 + SingleVersionContains
185 + SingleVersionSet
186 + SingleVersionRemove
187 + SingleVersionRange
188 + SingleVersionRangeRev
189 + 'static
190{
191}