reifydb_store_transaction/
multi.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::{CommitVersion, CowVec, EncodedKey, EncodedKeyRange, delta::Delta, interface::MultiVersionValues};
6
7/// Composite trait for multi-version storage capabilities.
8pub trait MultiVersionStore:
9	Send
10	+ Sync
11	+ Clone
12	+ MultiVersionCommit
13	+ MultiVersionGet
14	+ MultiVersionContains
15	+ MultiVersionRange
16	+ MultiVersionRangeRev
17	+ 'static
18{
19}
20
21/// A batch of multi-version range results with continuation info.
22#[derive(Debug, Clone)]
23pub struct MultiVersionBatch {
24	/// The values in this batch.
25	pub items: Vec<MultiVersionValues>,
26	/// Whether there are more items after this batch.
27	pub has_more: bool,
28}
29
30impl MultiVersionBatch {
31	/// Creates an empty batch with no more results.
32	pub fn empty() -> Self {
33		Self {
34			items: Vec::new(),
35			has_more: false,
36		}
37	}
38
39	/// Returns true if this batch contains no items.
40	pub fn is_empty(&self) -> bool {
41		self.items.is_empty()
42	}
43}
44
45/// Trait for committing deltas to multi-version storage.
46#[async_trait]
47pub trait MultiVersionCommit: Send + Sync {
48	/// Commit a batch of deltas at the given version.
49	async fn commit(&self, deltas: CowVec<Delta>, version: CommitVersion) -> crate::Result<()>;
50}
51
52/// Trait for getting values from multi-version storage.
53#[async_trait]
54pub trait MultiVersionGet: Send + Sync {
55	/// Get the value for a key at a specific version.
56	async fn get(&self, key: &EncodedKey, version: CommitVersion) -> crate::Result<Option<MultiVersionValues>>;
57}
58
59/// Trait for checking key existence in multi-version storage.
60#[async_trait]
61pub trait MultiVersionContains: Send + Sync {
62	/// Check if a key exists at a specific version.
63	async fn contains(&self, key: &EncodedKey, version: CommitVersion) -> crate::Result<bool>;
64}
65
66/// Trait for forward range queries with batch-fetch pattern.
67#[async_trait]
68pub trait MultiVersionRange: Send + Sync {
69	/// Fetch a batch of values in key order (ascending).
70	///
71	/// Returns up to `batch_size` values. The `has_more` field indicates
72	/// whether there are more values after this batch.
73	async fn range_batch(
74		&self,
75		range: EncodedKeyRange,
76		version: CommitVersion,
77		batch_size: u64,
78	) -> crate::Result<MultiVersionBatch>;
79
80	/// Convenience method with default batch size.
81	async fn range(&self, range: EncodedKeyRange, version: CommitVersion) -> crate::Result<MultiVersionBatch> {
82		self.range_batch(range, version, 1024).await
83	}
84
85	/// Range query with prefix.
86	async fn prefix(&self, prefix: &EncodedKey, version: CommitVersion) -> crate::Result<MultiVersionBatch> {
87		self.range(EncodedKeyRange::prefix(prefix), version).await
88	}
89}
90
91/// Trait for reverse range queries with batch-fetch pattern.
92#[async_trait]
93pub trait MultiVersionRangeRev: Send + Sync {
94	/// Fetch a batch of values in reverse key order (descending).
95	///
96	/// Returns up to `batch_size` values. The `has_more` field indicates
97	/// whether there are more values after this batch.
98	async fn range_rev_batch(
99		&self,
100		range: EncodedKeyRange,
101		version: CommitVersion,
102		batch_size: u64,
103	) -> crate::Result<MultiVersionBatch>;
104
105	/// Convenience method with default batch size.
106	async fn range_rev(&self, range: EncodedKeyRange, version: CommitVersion) -> crate::Result<MultiVersionBatch> {
107		self.range_rev_batch(range, version, 1024).await
108	}
109
110	/// Reverse range query with prefix.
111	async fn prefix_rev(&self, prefix: &EncodedKey, version: CommitVersion) -> crate::Result<MultiVersionBatch> {
112		self.range_rev(EncodedKeyRange::prefix(prefix), version).await
113	}
114}