drive/util/grove_operations/
mod.rs1pub mod grove_insert;
8
9pub mod grove_insert_empty_tree;
11
12pub mod grove_insert_if_not_exists;
14
15pub mod grove_delete;
17
18pub mod grove_get_raw;
20
21pub mod grove_get_raw_item;
23
24pub mod grove_get_raw_optional;
26
27pub mod grove_get_raw_value_u64_from_encoded_var_vec;
29
30pub mod grove_get;
32
33pub mod grove_get_path_query_serialized_results;
35
36pub mod grove_get_path_query;
38
39pub mod grove_get_path_query_with_optional;
41
42pub mod grove_get_raw_path_query_with_optional;
44
45pub mod grove_get_raw_path_query;
47
48pub mod grove_get_proved_path_query;
50
51pub mod grove_get_proved_path_query_v1;
53
54pub mod grove_commitment_tree_count;
56
57pub mod grove_get_proved_branch_chunk_query;
59
60pub mod grove_get_proved_trunk_chunk_query;
62
63pub mod grove_get_sum_tree_total_value;
65
66pub mod grove_has_raw;
68
69pub mod batch_insert_empty_tree;
71
72pub mod batch_insert_empty_sum_tree;
74
75pub mod batch_insert_empty_tree_if_not_exists;
77
78pub mod batch_insert_empty_tree_if_not_exists_check_existing_operations;
80
81pub mod batch_insert;
83
84pub mod batch_replace;
86
87pub mod batch_insert_if_not_exists;
89
90pub mod batch_insert_if_changed_value;
92
93pub mod batch_delete;
95
96pub mod batch_remove_raw;
98
99pub mod batch_delete_up_tree_while_empty;
101
102pub mod batch_refresh_reference;
104
105pub mod grove_apply_operation;
107
108pub mod grove_apply_batch;
110
111pub mod grove_apply_batch_with_add_costs;
113
114pub mod grove_apply_partial_batch;
116
117pub mod grove_apply_partial_batch_with_add_costs;
119
120pub mod grove_batch_operations_costs;
122
123pub mod grove_clear;
125
126pub mod batch_delete_items_in_path_query;
128
129pub mod batch_insert_if_not_exists_return_existing_element;
131
132pub mod batch_insert_sum_item_or_add_to_if_already_exists;
134
135mod grove_get_path_query_serialized_or_sum_results;
137
138pub mod grove_get_proved_path_query_with_conditional;
140
141pub mod grove_insert_if_not_exists_return_existing_element;
143
144pub mod batch_insert_sum_item_if_not_exists;
146pub mod batch_move_items_in_path_query;
148
149pub mod batch_insert_item_with_sum_item_if_not_exists;
151pub mod batch_keep_item_insert_sum_item_or_add_to_if_already_exists;
153mod batch_move;
154pub mod grove_get_big_sum_tree_total_value;
156pub mod grove_get_optional_sum_tree_total_value;
158pub mod grove_get_raw_optional_item;
160
161use grovedb_costs::CostContext;
162
163use grovedb::{EstimatedLayerInformation, MaybeTree, TreeType};
164
165use crate::error::Error;
166use crate::fees::op::LowLevelDriveOperation;
167use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation;
168
169use grovedb::Error as GroveError;
170
171use intmap::IntMap;
172
173fn push_drive_operation_result<T>(
176 cost_context: CostContext<Result<T, GroveError>>,
177 drive_operations: &mut Vec<LowLevelDriveOperation>,
178) -> Result<T, Error> {
179 let CostContext { value, cost } = cost_context;
180 if !cost.is_nothing() {
181 drive_operations.push(CalculatedCostOperation(cost));
182 }
183 value.map_err(Error::from)
184}
185
186fn push_drive_operation_result_optional<T>(
189 cost_context: CostContext<Result<T, GroveError>>,
190 drive_operations: Option<&mut Vec<LowLevelDriveOperation>>,
191) -> Result<T, Error> {
192 let CostContext { value, cost } = cost_context;
193 if let Some(drive_operations) = drive_operations {
194 drive_operations.push(CalculatedCostOperation(cost));
195 }
196 value.map_err(Error::from)
197}
198pub type IsSubTree = bool;
200pub type IsSumSubTree = bool;
202pub type IsSumTree = bool;
204
205#[derive(Debug, Copy, Clone)]
207pub enum BatchDeleteApplyType {
208 StatelessBatchDelete {
210 in_tree_type: TreeType,
212 estimated_key_size: u32,
214 estimated_value_size: u32,
216 },
217 StatefulBatchDelete {
219 is_known_to_be_subtree_with_sum: Option<MaybeTree>,
221 },
222}
223
224#[derive(Debug, Copy, Clone)]
226pub enum BatchMoveApplyType {
227 StatelessBatchMove {
229 in_tree_type: TreeType,
231 tree_type: Option<TreeType>,
233 estimated_key_size: u32,
235 estimated_value_size: u32,
237 flags_len: FlagsLen,
239 },
240 StatefulBatchMove {
242 is_known_to_be_subtree_with_sum: Option<MaybeTree>,
244 },
245}
246
247#[derive(Clone)]
248pub enum BatchDeleteUpTreeApplyType {
250 StatelessBatchDelete {
252 estimated_layer_info: IntMap<u16, EstimatedLayerInformation>,
254 },
255 StatefulBatchDelete {
257 is_known_to_be_subtree_with_sum: Option<MaybeTree>,
259 },
260}
261
262#[derive(Clone, Copy)]
264pub enum BatchInsertTreeApplyType {
266 StatelessBatchInsertTree {
268 in_tree_type: TreeType,
270 tree_type: TreeType,
272 flags_len: FlagsLen,
274 },
275 StatefulBatchInsertTree,
277}
278
279impl BatchInsertTreeApplyType {
281 pub(crate) fn to_direct_query_type(self) -> DirectQueryType {
289 match self {
290 BatchInsertTreeApplyType::StatelessBatchInsertTree {
291 in_tree_type,
292 tree_type,
293 flags_len,
294 } => DirectQueryType::StatelessDirectQuery {
295 in_tree_type,
296 query_target: QueryTarget::QueryTargetTree(flags_len, tree_type),
297 },
298 BatchInsertTreeApplyType::StatefulBatchInsertTree => {
299 DirectQueryType::StatefulDirectQuery
300 }
301 }
302 }
303}
304
305#[derive(Clone, Copy)]
307pub enum BatchInsertApplyType {
308 StatelessBatchInsert {
310 in_tree_type: TreeType,
312 target: QueryTarget,
314 },
315 StatefulBatchInsert,
317}
318
319impl BatchInsertApplyType {
320 #[allow(dead_code)]
329 #[allow(clippy::wrong_self_convention)]
330 pub(crate) fn to_direct_query_type(&self) -> DirectQueryType {
331 match self {
332 BatchInsertApplyType::StatelessBatchInsert {
333 in_tree_type: in_tree_using_sums,
334 target,
335 } => DirectQueryType::StatelessDirectQuery {
336 in_tree_type: *in_tree_using_sums,
337 query_target: *target,
338 },
339 BatchInsertApplyType::StatefulBatchInsert => DirectQueryType::StatefulDirectQuery,
340 }
341 }
342}
343
344pub type FlagsLen = u32;
346
347#[derive(Clone, Copy)]
349pub enum QueryTarget {
351 QueryTargetTree(FlagsLen, TreeType),
353 QueryTargetValue(u32),
355}
356
357impl QueryTarget {
358 pub(crate) fn len(&self) -> u32 {
360 match self {
361 QueryTarget::QueryTargetTree(flags_len, tree_type) => {
362 *flags_len + tree_type.inner_node_type().cost() + 3
363 }
364 QueryTarget::QueryTargetValue(len) => *len,
365 }
366 }
367}
368
369#[derive(Clone, Copy)]
371pub enum DirectQueryType {
373 StatelessDirectQuery {
375 in_tree_type: TreeType,
377 query_target: QueryTarget,
379 },
380 StatefulDirectQuery,
382}
383
384impl From<DirectQueryType> for QueryType {
385 fn from(value: DirectQueryType) -> Self {
386 match value {
387 DirectQueryType::StatelessDirectQuery {
388 in_tree_type,
389 query_target,
390 } => QueryType::StatelessQuery {
391 in_tree_type,
392 query_target,
393 estimated_reference_sizes: vec![],
394 },
395 DirectQueryType::StatefulDirectQuery => QueryType::StatefulQuery,
396 }
397 }
398}
399
400impl DirectQueryType {
401 #[allow(dead_code)]
427 #[deprecated(note = "This function is marked as unused.")]
428 #[allow(deprecated)]
429 pub(crate) fn add_reference_sizes(self, reference_sizes: Vec<u32>) -> QueryType {
430 match self {
431 DirectQueryType::StatelessDirectQuery {
432 in_tree_type: in_tree_using_sums,
433 query_target,
434 } => QueryType::StatelessQuery {
435 in_tree_type: in_tree_using_sums,
436 query_target,
437 estimated_reference_sizes: reference_sizes,
438 },
439 DirectQueryType::StatefulDirectQuery => QueryType::StatefulQuery,
440 }
441 }
442}
443
444#[derive(Clone)]
446pub enum QueryType {
447 StatelessQuery {
449 in_tree_type: TreeType,
451 query_target: QueryTarget,
453 estimated_reference_sizes: Vec<u32>,
455 },
456 StatefulQuery,
458}
459
460impl From<BatchDeleteApplyType> for QueryType {
461 fn from(value: BatchDeleteApplyType) -> Self {
462 match value {
463 BatchDeleteApplyType::StatelessBatchDelete {
464 in_tree_type: is_sum_tree,
465 estimated_value_size,
466 ..
467 } => QueryType::StatelessQuery {
468 in_tree_type: is_sum_tree,
469 query_target: QueryTarget::QueryTargetValue(estimated_value_size),
470 estimated_reference_sizes: vec![],
471 },
472 BatchDeleteApplyType::StatefulBatchDelete { .. } => QueryType::StatefulQuery,
473 }
474 }
475}
476
477impl From<&BatchDeleteApplyType> for QueryType {
478 fn from(value: &BatchDeleteApplyType) -> Self {
479 match value {
480 BatchDeleteApplyType::StatelessBatchDelete {
481 in_tree_type: is_sum_tree,
482 estimated_value_size,
483 ..
484 } => QueryType::StatelessQuery {
485 in_tree_type: *is_sum_tree,
486 query_target: QueryTarget::QueryTargetValue(*estimated_value_size),
487 estimated_reference_sizes: vec![],
488 },
489 BatchDeleteApplyType::StatefulBatchDelete { .. } => QueryType::StatefulQuery,
490 }
491 }
492}
493
494impl From<BatchDeleteApplyType> for DirectQueryType {
495 fn from(value: BatchDeleteApplyType) -> Self {
496 match value {
497 BatchDeleteApplyType::StatelessBatchDelete {
498 in_tree_type: is_sum_tree,
499 estimated_value_size,
500 ..
501 } => DirectQueryType::StatelessDirectQuery {
502 in_tree_type: is_sum_tree,
503 query_target: QueryTarget::QueryTargetValue(estimated_value_size),
504 },
505 BatchDeleteApplyType::StatefulBatchDelete { .. } => {
506 DirectQueryType::StatefulDirectQuery
507 }
508 }
509 }
510}
511
512impl From<&BatchDeleteApplyType> for DirectQueryType {
513 fn from(value: &BatchDeleteApplyType) -> Self {
514 match value {
515 BatchDeleteApplyType::StatelessBatchDelete {
516 in_tree_type: is_sum_tree,
517 estimated_value_size,
518 ..
519 } => DirectQueryType::StatelessDirectQuery {
520 in_tree_type: *is_sum_tree,
521 query_target: QueryTarget::QueryTargetValue(*estimated_value_size),
522 },
523 BatchDeleteApplyType::StatefulBatchDelete { .. } => {
524 DirectQueryType::StatefulDirectQuery
525 }
526 }
527 }
528}
529
530#[derive(Debug, Clone, Copy, PartialEq, Eq)]
532pub enum GroveDBToUse {
533 Current,
535 LatestCheckpoint,
537 Checkpoint(u64),
539}