reifydb_store_transaction/
single.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use async_trait::async_trait;
5use reifydb_core::{
6	CowVec, EncodedKey, EncodedKeyRange, delta::Delta, interface::SingleVersionValues,
7	value::encoded::EncodedValues,
8};
9
10/// Composite trait for single-version storage capabilities.
11pub trait SingleVersionStore:
12	Send
13	+ Sync
14	+ Clone
15	+ SingleVersionCommit
16	+ SingleVersionGet
17	+ SingleVersionContains
18	+ SingleVersionSet
19	+ SingleVersionRemove
20	+ SingleVersionRange
21	+ SingleVersionRangeRev
22	+ 'static
23{
24}
25
26/// A batch of single-version range results with continuation info.
27#[derive(Debug, Clone)]
28pub struct SingleVersionBatch {
29	/// The values in this batch.
30	pub items: Vec<SingleVersionValues>,
31	/// Whether there are more items after this batch.
32	pub has_more: bool,
33}
34
35impl SingleVersionBatch {
36	/// Creates an empty batch with no more results.
37	pub fn empty() -> Self {
38		Self {
39			items: Vec::new(),
40			has_more: false,
41		}
42	}
43
44	/// Returns true if this batch contains no items.
45	pub fn is_empty(&self) -> bool {
46		self.items.is_empty()
47	}
48}
49
50/// Trait for committing deltas to single-version storage.
51#[async_trait]
52pub trait SingleVersionCommit: Send + Sync {
53	/// Commit a batch of deltas.
54	async fn commit(&mut self, deltas: CowVec<Delta>) -> crate::Result<()>;
55}
56
57/// Trait for getting values from single-version storage.
58#[async_trait]
59pub trait SingleVersionGet: Send + Sync {
60	/// Get the value for a key.
61	async fn get(&self, key: &EncodedKey) -> crate::Result<Option<SingleVersionValues>>;
62}
63
64/// Trait for checking key existence in single-version storage.
65#[async_trait]
66pub trait SingleVersionContains: Send + Sync {
67	/// Check if a key exists.
68	async fn contains(&self, key: &EncodedKey) -> crate::Result<bool>;
69}
70
71/// Trait for setting values in single-version storage.
72#[async_trait]
73pub trait SingleVersionSet: SingleVersionCommit {
74	/// Set a value for a key.
75	async fn set(&mut self, key: &EncodedKey, values: EncodedValues) -> crate::Result<()> {
76		Self::commit(
77			self,
78			CowVec::new(vec![Delta::Set {
79				key: key.clone(),
80				values: values.clone(),
81			}]),
82		)
83		.await
84	}
85}
86
87/// Trait for removing values from single-version storage.
88#[async_trait]
89pub trait SingleVersionRemove: SingleVersionCommit {
90	/// Remove a key.
91	async fn remove(&mut self, key: &EncodedKey) -> crate::Result<()> {
92		Self::commit(
93			self,
94			CowVec::new(vec![Delta::Remove {
95				key: key.clone(),
96			}]),
97		)
98		.await
99	}
100}
101
102/// Trait for forward range queries with batch-fetch pattern.
103#[async_trait]
104pub trait SingleVersionRange: Send + Sync {
105	/// Fetch a batch of values in key order (ascending).
106	async fn range_batch(&self, range: EncodedKeyRange, batch_size: u64) -> crate::Result<SingleVersionBatch>;
107
108	/// Convenience method with default batch size.
109	async fn range(&self, range: EncodedKeyRange) -> crate::Result<SingleVersionBatch> {
110		self.range_batch(range, 1024).await
111	}
112
113	/// Range query with prefix.
114	async fn prefix(&self, prefix: &EncodedKey) -> crate::Result<SingleVersionBatch> {
115		self.range(EncodedKeyRange::prefix(prefix)).await
116	}
117}
118
119/// Trait for reverse range queries with batch-fetch pattern.
120#[async_trait]
121pub trait SingleVersionRangeRev: Send + Sync {
122	/// Fetch a batch of values in reverse key order (descending).
123	async fn range_rev_batch(&self, range: EncodedKeyRange, batch_size: u64) -> crate::Result<SingleVersionBatch>;
124
125	/// Convenience method with default batch size.
126	async fn range_rev(&self, range: EncodedKeyRange) -> crate::Result<SingleVersionBatch> {
127		self.range_rev_batch(range, 1024).await
128	}
129
130	/// Reverse range query with prefix.
131	async fn prefix_rev(&self, prefix: &EncodedKey) -> crate::Result<SingleVersionBatch> {
132		self.range_rev(EncodedKeyRange::prefix(prefix)).await
133	}
134}