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(
57		&mut self,
58		range: EncodedKeyRange,
59		batch_size: u64,
60	) -> Result<BoxedMultiVersionIter<'_>, Error> {
61		let iter = QueryTransaction::range_batched(self, range, batch_size)?;
62		Ok(Box::new(iter.into_iter()))
63	}
64
65	fn range_rev_batched(
66		&mut self,
67		range: EncodedKeyRange,
68		batch_size: u64,
69	) -> Result<BoxedMultiVersionIter<'_>, Error> {
70		let iter = QueryTransaction::range_rev_batched(self, range, batch_size)?;
71		Ok(Box::new(iter.into_iter()))
72	}
73
74	fn prefix(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter<'_>, Error> {
75		let iter = QueryTransaction::prefix(self, prefix)?;
76		Ok(Box::new(iter.into_iter()))
77	}
78
79	fn prefix_rev(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter<'_>, Error> {
80		let iter = QueryTransaction::prefix_rev(self, prefix)?;
81		Ok(Box::new(iter.into_iter()))
82	}
83
84	fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> Result<(), Error> {
85		QueryTransaction::read_as_of_version_exclusive(self, version);
86		Ok(())
87	}
88}
89
90impl MultiVersionQueryTransaction for CommandTransaction {
91	fn version(&self) -> CommitVersion {
92		self.tm.version()
93	}
94
95	fn id(&self) -> TransactionId {
96		self.tm.id()
97	}
98
99	fn get(&mut self, key: &EncodedKey) -> Result<Option<MultiVersionValues>, Error> {
100		Ok(CommandTransaction::get(self, key)?.map(|tv| MultiVersionValues {
101			key: tv.key().clone(),
102			values: tv.values().clone(),
103			version: tv.version(),
104		}))
105	}
106
107	fn contains_key(&mut self, key: &EncodedKey) -> Result<bool, Error> {
108		Ok(CommandTransaction::contains_key(self, key)?)
109	}
110
111	fn range_batched(
112		&mut self,
113		range: EncodedKeyRange,
114		batch_size: u64,
115	) -> Result<BoxedMultiVersionIter<'_>, Error> {
116		let iter = self.range_batched(range, batch_size)?.map(|tv| MultiVersionValues {
117			key: tv.key().clone(),
118			values: tv.values().clone(),
119			version: tv.version(),
120		});
121
122		Ok(Box::new(iter))
123	}
124
125	fn range_rev_batched(
126		&mut self,
127		range: EncodedKeyRange,
128		batch_size: u64,
129	) -> Result<BoxedMultiVersionIter<'_>, Error> {
130		let iter = self.range_rev_batched(range, batch_size)?.map(|tv| MultiVersionValues {
131			key: tv.key().clone(),
132			values: tv.values().clone(),
133			version: tv.version(),
134		});
135
136		Ok(Box::new(iter))
137	}
138
139	fn prefix(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter<'_>, Error> {
140		let iter = self.prefix(prefix)?.map(|tv| MultiVersionValues {
141			key: tv.key().clone(),
142			values: tv.values().clone(),
143			version: tv.version(),
144		});
145
146		Ok(Box::new(iter))
147	}
148
149	fn prefix_rev(&mut self, prefix: &EncodedKey) -> Result<BoxedMultiVersionIter<'_>, Error> {
150		let iter = self.prefix_rev(prefix)?.map(|tv| MultiVersionValues {
151			key: tv.key().clone(),
152			values: tv.values().clone(),
153			version: tv.version(),
154		});
155
156		Ok(Box::new(iter))
157	}
158
159	fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> Result<(), Error> {
160		CommandTransaction::read_as_of_version_exclusive(self, version);
161		Ok(())
162	}
163}
164
165impl MultiVersionCommandTransaction for CommandTransaction {
166	fn set(&mut self, key: &EncodedKey, values: EncodedValues) -> Result<(), Error> {
167		CommandTransaction::set(self, key, values)?;
168		Ok(())
169	}
170
171	fn remove(&mut self, key: &EncodedKey) -> Result<(), Error> {
172		CommandTransaction::remove(self, key)?;
173		Ok(())
174	}
175
176	fn commit(mut self) -> Result<CommitVersion, Error> {
177		let version = CommandTransaction::commit(&mut self)?;
178		Ok(version)
179	}
180
181	fn rollback(mut self) -> Result<(), Error> {
182		CommandTransaction::rollback(&mut self)?;
183		Ok(())
184	}
185}