reifydb_transaction/multi/transaction/optimistic/
query.rs1use reifydb_core::{CommitVersion, EncodedKey, EncodedKeyRange};
13use reifydb_store_transaction::{MultiVersionRange, MultiVersionRangeRev, TransactionStore};
14
15use crate::multi::{
16 transaction::{
17 optimistic::TransactionOptimistic, query::TransactionManagerQuery, version::StandardVersionProvider,
18 },
19 types::TransactionValue,
20};
21
22pub struct QueryTransaction {
23 pub(crate) engine: TransactionOptimistic,
24 pub(crate) tm: TransactionManagerQuery<StandardVersionProvider>,
25}
26
27impl QueryTransaction {
28 pub fn new(engine: TransactionOptimistic, version: Option<CommitVersion>) -> crate::Result<Self> {
29 let tm = engine.tm.query(version)?;
30 Ok(Self {
31 engine,
32 tm,
33 })
34 }
35}
36
37impl QueryTransaction {
38 pub fn version(&self) -> CommitVersion {
39 self.tm.version()
40 }
41
42 pub fn read_as_of_version_exclusive(&mut self, version: CommitVersion) {
43 self.tm.read_as_of_version_exclusive(version);
44 }
45
46 pub fn read_as_of_version_inclusive(&mut self, version: CommitVersion) {
47 self.read_as_of_version_exclusive(CommitVersion(version.0 + 1))
48 }
49
50 pub fn get(&self, key: &EncodedKey) -> crate::Result<Option<TransactionValue>> {
51 let version = self.tm.version();
52 Ok(self.engine.get(key, version)?.map(Into::into))
53 }
54
55 pub fn contains_key(&self, key: &EncodedKey) -> crate::Result<bool> {
56 let version = self.tm.version();
57 Ok(self.engine.contains_key(key, version)?)
58 }
59
60 pub fn scan(&self) -> crate::Result<<TransactionStore as MultiVersionRange>::RangeIter<'_>> {
61 self.range(EncodedKeyRange::all())
62 }
63
64 pub fn scan_rev(&self) -> crate::Result<<TransactionStore as MultiVersionRangeRev>::RangeIterRev<'_>> {
65 self.range_rev(EncodedKeyRange::all())
66 }
67
68 pub fn range_batched(
69 &self,
70 range: EncodedKeyRange,
71 batch_size: u64,
72 ) -> crate::Result<<TransactionStore as MultiVersionRange>::RangeIter<'_>> {
73 let version = self.tm.version();
74 Ok(self.engine.range_batched(range, version, batch_size)?)
75 }
76
77 pub fn range(
78 &self,
79 range: EncodedKeyRange,
80 ) -> crate::Result<<TransactionStore as MultiVersionRange>::RangeIter<'_>> {
81 self.range_batched(range, 1024)
82 }
83
84 pub fn range_rev_batched(
85 &self,
86 range: EncodedKeyRange,
87 batch_size: u64,
88 ) -> crate::Result<<TransactionStore as MultiVersionRangeRev>::RangeIterRev<'_>> {
89 let version = self.tm.version();
90 Ok(self.engine.range_rev_batched(range, version, batch_size)?)
91 }
92
93 pub fn range_rev(
94 &self,
95 range: EncodedKeyRange,
96 ) -> crate::Result<<TransactionStore as MultiVersionRangeRev>::RangeIterRev<'_>> {
97 self.range_rev_batched(range, 1024)
98 }
99
100 pub fn prefix(
101 &self,
102 prefix: &EncodedKey,
103 ) -> crate::Result<<TransactionStore as MultiVersionRange>::RangeIter<'_>> {
104 self.range(EncodedKeyRange::prefix(prefix))
105 }
106
107 pub fn prefix_rev(
108 &self,
109 prefix: &EncodedKey,
110 ) -> crate::Result<<TransactionStore as MultiVersionRangeRev>::RangeIterRev<'_>> {
111 self.range_rev(EncodedKeyRange::prefix(prefix))
112 }
113}