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_count_tree;
77
78pub mod batch_insert_empty_provable_count_tree;
80
81pub mod batch_insert_empty_tree_if_not_exists;
83
84pub mod batch_insert_empty_tree_if_not_exists_check_existing_operations;
86
87pub mod batch_insert;
89
90pub mod batch_replace;
92
93pub mod batch_insert_if_not_exists;
95
96pub mod batch_insert_if_changed_value;
98
99pub mod batch_delete;
101
102pub mod batch_remove_raw;
104
105pub mod batch_delete_up_tree_while_empty;
107
108pub mod batch_refresh_reference;
110
111pub mod grove_apply_operation;
113
114pub mod grove_apply_batch;
116
117pub mod grove_apply_batch_with_add_costs;
119
120pub mod grove_apply_partial_batch;
122
123pub mod grove_apply_partial_batch_with_add_costs;
125
126pub mod grove_batch_operations_costs;
128
129pub mod grove_clear;
131
132pub mod batch_delete_items_in_path_query;
134
135pub mod batch_insert_if_not_exists_return_existing_element;
137
138pub mod batch_insert_sum_item_or_add_to_if_already_exists;
140
141mod grove_get_path_query_serialized_or_sum_results;
143
144pub mod grove_get_proved_path_query_with_conditional;
146
147pub mod grove_insert_if_not_exists_return_existing_element;
149
150pub mod batch_insert_sum_item_if_not_exists;
152pub mod batch_move_items_in_path_query;
154
155pub mod batch_insert_item_with_sum_item_if_not_exists;
157pub mod batch_keep_item_insert_sum_item_or_add_to_if_already_exists;
159mod batch_move;
160pub mod grove_get_big_sum_tree_total_value;
162pub mod grove_get_optional_sum_tree_total_value;
164pub mod grove_get_raw_optional_item;
166
167use grovedb_costs::CostContext;
168
169use grovedb::{EstimatedLayerInformation, MaybeTree, TreeType};
170
171use crate::error::Error;
172use crate::fees::op::LowLevelDriveOperation;
173use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation;
174
175use grovedb::Error as GroveError;
176
177use intmap::IntMap;
178
179fn push_drive_operation_result<T>(
182 cost_context: CostContext<Result<T, GroveError>>,
183 drive_operations: &mut Vec<LowLevelDriveOperation>,
184) -> Result<T, Error> {
185 let CostContext { value, cost } = cost_context;
186 if !cost.is_nothing() {
187 drive_operations.push(CalculatedCostOperation(cost));
188 }
189 value.map_err(Error::from)
190}
191
192fn push_drive_operation_result_optional<T>(
195 cost_context: CostContext<Result<T, GroveError>>,
196 drive_operations: Option<&mut Vec<LowLevelDriveOperation>>,
197) -> Result<T, Error> {
198 let CostContext { value, cost } = cost_context;
199 if let Some(drive_operations) = drive_operations {
200 drive_operations.push(CalculatedCostOperation(cost));
201 }
202 value.map_err(Error::from)
203}
204pub type IsSubTree = bool;
206pub type IsSumSubTree = bool;
208pub type IsSumTree = bool;
210
211#[derive(Debug, Copy, Clone)]
213pub enum BatchDeleteApplyType {
214 StatelessBatchDelete {
216 in_tree_type: TreeType,
218 estimated_key_size: u32,
220 estimated_value_size: u32,
222 },
223 StatefulBatchDelete {
225 is_known_to_be_subtree_with_sum: Option<MaybeTree>,
227 },
228}
229
230#[derive(Debug, Copy, Clone)]
232pub enum BatchMoveApplyType {
233 StatelessBatchMove {
235 in_tree_type: TreeType,
237 tree_type: Option<TreeType>,
239 estimated_key_size: u32,
241 estimated_value_size: u32,
243 flags_len: FlagsLen,
245 },
246 StatefulBatchMove {
248 is_known_to_be_subtree_with_sum: Option<MaybeTree>,
250 },
251}
252
253#[derive(Clone)]
254pub enum BatchDeleteUpTreeApplyType {
256 StatelessBatchDelete {
258 estimated_layer_info: IntMap<u16, EstimatedLayerInformation>,
260 },
261 StatefulBatchDelete {
263 is_known_to_be_subtree_with_sum: Option<MaybeTree>,
265 },
266}
267
268#[derive(Clone, Copy)]
270pub enum BatchInsertTreeApplyType {
272 StatelessBatchInsertTree {
274 in_tree_type: TreeType,
276 tree_type: TreeType,
278 flags_len: FlagsLen,
280 },
281 StatefulBatchInsertTree,
283}
284
285impl BatchInsertTreeApplyType {
287 pub(crate) fn to_direct_query_type(self) -> DirectQueryType {
295 match self {
296 BatchInsertTreeApplyType::StatelessBatchInsertTree {
297 in_tree_type,
298 tree_type,
299 flags_len,
300 } => DirectQueryType::StatelessDirectQuery {
301 in_tree_type,
302 query_target: QueryTarget::QueryTargetTree(flags_len, tree_type),
303 },
304 BatchInsertTreeApplyType::StatefulBatchInsertTree => {
305 DirectQueryType::StatefulDirectQuery
306 }
307 }
308 }
309}
310
311#[derive(Clone, Copy)]
313pub enum BatchInsertApplyType {
314 StatelessBatchInsert {
316 in_tree_type: TreeType,
318 target: QueryTarget,
320 },
321 StatefulBatchInsert,
323}
324
325impl BatchInsertApplyType {
326 #[allow(dead_code)]
335 #[allow(clippy::wrong_self_convention)]
336 pub(crate) fn to_direct_query_type(&self) -> DirectQueryType {
337 match self {
338 BatchInsertApplyType::StatelessBatchInsert {
339 in_tree_type: in_tree_using_sums,
340 target,
341 } => DirectQueryType::StatelessDirectQuery {
342 in_tree_type: *in_tree_using_sums,
343 query_target: *target,
344 },
345 BatchInsertApplyType::StatefulBatchInsert => DirectQueryType::StatefulDirectQuery,
346 }
347 }
348}
349
350pub type FlagsLen = u32;
352
353#[derive(Clone, Copy)]
355pub enum QueryTarget {
357 QueryTargetTree(FlagsLen, TreeType),
359 QueryTargetValue(u32),
361}
362
363impl QueryTarget {
364 pub(crate) fn len(&self) -> u32 {
366 match self {
367 QueryTarget::QueryTargetTree(flags_len, tree_type) => {
368 *flags_len + tree_type.inner_node_type().cost() + 3
369 }
370 QueryTarget::QueryTargetValue(len) => *len,
371 }
372 }
373}
374
375#[derive(Clone, Copy)]
377pub enum DirectQueryType {
379 StatelessDirectQuery {
381 in_tree_type: TreeType,
383 query_target: QueryTarget,
385 },
386 StatefulDirectQuery,
388}
389
390impl From<DirectQueryType> for QueryType {
391 fn from(value: DirectQueryType) -> Self {
392 match value {
393 DirectQueryType::StatelessDirectQuery {
394 in_tree_type,
395 query_target,
396 } => QueryType::StatelessQuery {
397 in_tree_type,
398 query_target,
399 estimated_reference_sizes: vec![],
400 },
401 DirectQueryType::StatefulDirectQuery => QueryType::StatefulQuery,
402 }
403 }
404}
405
406impl DirectQueryType {
407 #[allow(dead_code)]
433 #[deprecated(note = "This function is marked as unused.")]
434 #[allow(deprecated)]
435 pub(crate) fn add_reference_sizes(self, reference_sizes: Vec<u32>) -> QueryType {
436 match self {
437 DirectQueryType::StatelessDirectQuery {
438 in_tree_type: in_tree_using_sums,
439 query_target,
440 } => QueryType::StatelessQuery {
441 in_tree_type: in_tree_using_sums,
442 query_target,
443 estimated_reference_sizes: reference_sizes,
444 },
445 DirectQueryType::StatefulDirectQuery => QueryType::StatefulQuery,
446 }
447 }
448}
449
450#[derive(Clone)]
452pub enum QueryType {
453 StatelessQuery {
455 in_tree_type: TreeType,
457 query_target: QueryTarget,
459 estimated_reference_sizes: Vec<u32>,
461 },
462 StatefulQuery,
464}
465
466impl From<BatchDeleteApplyType> for QueryType {
467 fn from(value: BatchDeleteApplyType) -> Self {
468 match value {
469 BatchDeleteApplyType::StatelessBatchDelete {
470 in_tree_type: is_sum_tree,
471 estimated_value_size,
472 ..
473 } => QueryType::StatelessQuery {
474 in_tree_type: is_sum_tree,
475 query_target: QueryTarget::QueryTargetValue(estimated_value_size),
476 estimated_reference_sizes: vec![],
477 },
478 BatchDeleteApplyType::StatefulBatchDelete { .. } => QueryType::StatefulQuery,
479 }
480 }
481}
482
483impl From<&BatchDeleteApplyType> for QueryType {
484 fn from(value: &BatchDeleteApplyType) -> Self {
485 match value {
486 BatchDeleteApplyType::StatelessBatchDelete {
487 in_tree_type: is_sum_tree,
488 estimated_value_size,
489 ..
490 } => QueryType::StatelessQuery {
491 in_tree_type: *is_sum_tree,
492 query_target: QueryTarget::QueryTargetValue(*estimated_value_size),
493 estimated_reference_sizes: vec![],
494 },
495 BatchDeleteApplyType::StatefulBatchDelete { .. } => QueryType::StatefulQuery,
496 }
497 }
498}
499
500impl From<BatchDeleteApplyType> for DirectQueryType {
501 fn from(value: BatchDeleteApplyType) -> Self {
502 match value {
503 BatchDeleteApplyType::StatelessBatchDelete {
504 in_tree_type: is_sum_tree,
505 estimated_value_size,
506 ..
507 } => DirectQueryType::StatelessDirectQuery {
508 in_tree_type: is_sum_tree,
509 query_target: QueryTarget::QueryTargetValue(estimated_value_size),
510 },
511 BatchDeleteApplyType::StatefulBatchDelete { .. } => {
512 DirectQueryType::StatefulDirectQuery
513 }
514 }
515 }
516}
517
518impl From<&BatchDeleteApplyType> for DirectQueryType {
519 fn from(value: &BatchDeleteApplyType) -> Self {
520 match value {
521 BatchDeleteApplyType::StatelessBatchDelete {
522 in_tree_type: is_sum_tree,
523 estimated_value_size,
524 ..
525 } => DirectQueryType::StatelessDirectQuery {
526 in_tree_type: *is_sum_tree,
527 query_target: QueryTarget::QueryTargetValue(*estimated_value_size),
528 },
529 BatchDeleteApplyType::StatefulBatchDelete { .. } => {
530 DirectQueryType::StatefulDirectQuery
531 }
532 }
533 }
534}
535
536#[derive(Debug, Clone, Copy, PartialEq, Eq)]
538pub enum GroveDBToUse {
539 Current,
541 LatestCheckpoint,
543 Checkpoint(u64),
545}