reifydb_transaction/multi/
serializable.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 reifydb_core::{
5	CommitVersion, EncodedKey, EncodedKeyRange, Error,
6	event::EventBus,
7	interface::{
8		BoxedMultiVersionIter, MultiVersionCommandTransaction, MultiVersionQueryTransaction,
9		MultiVersionTransaction, MultiVersionValues, TransactionId, WithEventBus,
10	},
11	value::encoded::EncodedValues,
12};
13
14use crate::multi::transaction::serializable::{CommandTransaction, QueryTransaction, TransactionSerializable};
15
16impl WithEventBus for TransactionSerializable {
17	fn event_bus(&self) -> &EventBus {
18		&self.event_bus
19	}
20}
21
22impl MultiVersionTransaction for TransactionSerializable {
23	type Query = QueryTransaction;
24	type Command = CommandTransaction;
25
26	fn begin_query(&self) -> Result<Self::Query, Error> {
27		self.begin_query()
28	}
29
30	fn begin_command(&self) -> Result<Self::Command, Error> {
31		self.begin_command()
32	}
33}
34
35impl MultiVersionQueryTransaction for QueryTransaction {
36	fn version(&self) -> CommitVersion {
37		self.tm.version()
38	}
39
40	fn id(&self) -> TransactionId {
41		self.tm.id()
42	}
43
44	fn get(&mut self, key: &EncodedKey) -> Result<Option<MultiVersionValues>, Error> {
45		Ok(QueryTransaction::get(self, key)?.map(|tv| MultiVersionValues {
46			key: tv.key().clone(),
47			values: tv.values().clone(),
48			version: tv.version(),
49		}))
50	}
51
52	fn contains_key(&mut self, key: &EncodedKey) -> Result<bool, Error> {
53		QueryTransaction::contains_key(self, key)
54	}
55
56	fn range_batched(&mut self, range: EncodedKeyRange, batch_size: u64) -> Result<BoxedMultiVersionIter, Error> {
57		let iter = QueryTransaction::range_batched(self, range, batch_size)?;
58		Ok(Box::new(iter.into_iter()))
59	}
60
61	fn range_rev_batched(
62		&mut self,
63		range: EncodedKeyRange,
64		batch_size: u64,
65	) -> Result<BoxedMultiVersionIter, Error> {
66		let iter = QueryTransaction::range_rev_batched(self, range, batch_size)?;
67		Ok(Box::new(iter.into_iter()))
68	}
69
70	fn prefix(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter, Error> {
71		let iter = QueryTransaction::prefix(self, prefix)?;
72		Ok(Box::new(iter.into_iter()))
73	}
74
75	fn prefix_rev(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter, Error> {
76		let iter = QueryTransaction::prefix_rev(self, prefix)?;
77		Ok(Box::new(iter.into_iter()))
78	}
79
80	fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> Result<(), Error> {
81		QueryTransaction::read_as_of_version_exclusive(self, version);
82		Ok(())
83	}
84}
85
86impl MultiVersionQueryTransaction for CommandTransaction {
87	fn version(&self) -> CommitVersion {
88		self.tm.version()
89	}
90
91	fn id(&self) -> TransactionId {
92		self.tm.id()
93	}
94
95	fn get(&mut self, key: &EncodedKey) -> Result<Option<MultiVersionValues>, Error> {
96		Ok(CommandTransaction::get(self, key)?.map(|tv| MultiVersionValues {
97			key: tv.key().clone(),
98			values: tv.values().clone(),
99			version: tv.version(),
100		}))
101	}
102
103	fn contains_key(&mut self, key: &EncodedKey) -> Result<bool, Error> {
104		Ok(CommandTransaction::contains_key(self, key)?)
105	}
106
107	fn range_batched(&mut self, range: EncodedKeyRange, batch_size: u64) -> Result<BoxedMultiVersionIter, Error> {
108		let iter = self.range_batched(range, batch_size)?.map(|tv| MultiVersionValues {
109			key: tv.key().clone(),
110			values: tv.values().clone(),
111			version: tv.version(),
112		});
113
114		Ok(Box::new(iter))
115	}
116
117	fn range_rev_batched(
118		&mut self,
119		range: EncodedKeyRange,
120		batch_size: u64,
121	) -> Result<BoxedMultiVersionIter, Error> {
122		let iter = self.range_rev_batched(range, batch_size)?.map(|tv| MultiVersionValues {
123			key: tv.key().clone(),
124			values: tv.values().clone(),
125			version: tv.version(),
126		});
127
128		Ok(Box::new(iter))
129	}
130
131	fn prefix(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter, Error> {
132		let iter = self.prefix(prefix)?.map(|tv| MultiVersionValues {
133			key: tv.key().clone(),
134			values: tv.values().clone(),
135			version: tv.version(),
136		});
137
138		Ok(Box::new(iter))
139	}
140
141	fn prefix_rev(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter, Error> {
142		let iter = self.prefix_rev(prefix)?.map(|tv| MultiVersionValues {
143			key: tv.key().clone(),
144			values: tv.values().clone(),
145			version: tv.version(),
146		});
147
148		Ok(Box::new(iter))
149	}
150
151	fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> Result<(), Error> {
152		CommandTransaction::read_as_of_version_exclusive(self, version);
153		Ok(())
154	}
155}
156
157impl MultiVersionCommandTransaction for CommandTransaction {
158	fn set(&mut self, key: &EncodedKey, values: EncodedValues) -> Result<(), Error> {
159		CommandTransaction::set(self, key, values)?;
160		Ok(())
161	}
162
163	fn remove(&mut self, key: &EncodedKey) -> Result<(), Error> {
164		CommandTransaction::remove(self, key)?;
165		Ok(())
166	}
167
168	fn commit(mut self) -> Result<CommitVersion, Error> {
169		let version = CommandTransaction::commit(&mut self)?;
170		Ok(version)
171	}
172
173	fn rollback(mut self) -> Result<(), Error> {
174		CommandTransaction::rollback(&mut self)?;
175		Ok(())
176	}
177}