reifydb_transaction/multi/transaction/serializable/
query.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4// This file includes and modifies code from the skipdb project (https://github.com/al8n/skipdb),
5// originally licensed under the Apache License, Version 2.0.
6// Original copyright:
7//   Copyright (c) 2024 Al Liu
8//
9// The original Apache License can be found at:
10//   http://www.apache.org/licenses/LICENSE-2.0
11
12use reifydb_core::{CommitVersion, EncodedKey, EncodedKeyRange};
13use reifydb_store_transaction::{MultiVersionRange, MultiVersionRangeRev, TransactionStore};
14
15use crate::multi::{
16	transaction::{
17		query::TransactionManagerQuery, serializable::TransactionSerializable, version::StandardVersionProvider,
18	},
19	types::TransactionValue,
20};
21
22pub struct QueryTransaction {
23	pub(crate) engine: TransactionSerializable,
24	pub(crate) tm: TransactionManagerQuery<StandardVersionProvider>,
25}
26
27impl QueryTransaction {
28	pub fn new(engine: TransactionSerializable, 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}