Skip to main content

reifydb_core/interface/
store.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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}