Struct Query
pub struct Query {
pub items: Vec<QueryItem>,
pub default_subquery_branch: SubqueryBranch,
pub conditional_subquery_branches: Option<IndexMap<QueryItem, SubqueryBranch>>,
pub left_to_right: bool,
pub add_parent_tree_on_subquery: bool,
}Expand description
Query represents one or more keys or ranges of keys, which can be used to
resolve a proof which will include all the requested values.
Fields§
§items: Vec<QueryItem>Items
default_subquery_branch: SubqueryBranchDefault subquery branch
conditional_subquery_branches: Option<IndexMap<QueryItem, SubqueryBranch>>Conditional subquery branches
left_to_right: boolLeft to right?
add_parent_tree_on_subquery: boolWhen true, the parent tree element (e.g. a CountTree or SumTree)
is included in query results alongside its subquery children.
§Known limitation
Parent tree results added by this flag do not currently count
against SizedQuery::limit. A query with limit = 10 may return
more than 10 results when this flag is active, because the limit
only governs child-level results. This will be resolved in a future
redesign that introduces per-level limits.
§Absence-proof verification
When verifying with verify_query_with_absence_proof or
verify_subset_query_with_absence_proof, results are reconstructed
from terminal_keys() which does not emit parent-tree entries.
Parent tree elements will therefore not appear in the verified
result set in those modes.
Implementations§
§impl Query
impl Query
pub fn insert_key(&mut self, key: Vec<u8>)
pub fn insert_key(&mut self, key: Vec<u8>)
Adds an individual key to the query, so that its value (or its absence) in the tree will be included in the resulting proof.
If the key or a range including the key already exists in the query, this will have no effect. If the query already includes a range that has a non-inclusive bound equal to the key, the bound will be changed to be inclusive.
pub fn insert_keys(&mut self, keys: Vec<Vec<u8>>)
pub fn insert_keys(&mut self, keys: Vec<Vec<u8>>)
Adds multiple individual keys to the query, so that its value (or its absence) in the tree will be included in the resulting proof.
If the key or a range including the key already exists in the query, this will have no effect. If the query already includes a range that has a non-inclusive bound equal to the key, the bound will be changed to be inclusive.
pub fn insert_range(&mut self, range: Range<Vec<u8>>)
pub fn insert_range(&mut self, range: Range<Vec<u8>>)
Adds a range to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_range_inclusive(&mut self, range: RangeInclusive<Vec<u8>>)
pub fn insert_range_inclusive(&mut self, range: RangeInclusive<Vec<u8>>)
Adds an inclusive range to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be merged together.
pub fn insert_range_to_inclusive(&mut self, range: RangeToInclusive<Vec<u8>>)
pub fn insert_range_to_inclusive(&mut self, range: RangeToInclusive<Vec<u8>>)
Adds a range until a certain included value to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_range_from(&mut self, range: RangeFrom<Vec<u8>>)
pub fn insert_range_from(&mut self, range: RangeFrom<Vec<u8>>)
Adds a range from a certain included value to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_range_to(&mut self, range: RangeTo<Vec<u8>>)
pub fn insert_range_to(&mut self, range: RangeTo<Vec<u8>>)
Adds a range until a certain non included value to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_range_after(&mut self, range: RangeFrom<Vec<u8>>)
pub fn insert_range_after(&mut self, range: RangeFrom<Vec<u8>>)
Adds a range after the first value, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_range_after_to(&mut self, range: Range<Vec<u8>>)
pub fn insert_range_after_to(&mut self, range: Range<Vec<u8>>)
Adds a range after the first value, until a certain non included value to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_range_after_to_inclusive(
&mut self,
range: RangeInclusive<Vec<u8>>,
)
pub fn insert_range_after_to_inclusive( &mut self, range: RangeInclusive<Vec<u8>>, )
Adds a range after the first value, until a certain included value to the query, so that all the entries in the tree with keys in the range will be included in the resulting proof.
If a range including the range already exists in the query, this will have no effect. If the query already includes a range that overlaps with the range, the ranges will be joined together.
pub fn insert_all(&mut self)
pub fn insert_all(&mut self)
Adds a range of all potential values to the query, so that the query will return all values
All other items in the query will be discarded as you are now getting back all elements.
pub fn insert_item(&mut self, item: QueryItem)
pub fn insert_item(&mut self, item: QueryItem)
Adds the QueryItem to the query, first checking to see if it collides
with any existing ranges or keys. All colliding items will be removed
then merged together so that the query includes the minimum number of
items (with no items covering any duplicate parts of keyspace) while
still including every key or range that has been added to the query.
pub fn insert_items(&mut self, items: Vec<QueryItem>)
pub fn insert_items(&mut self, items: Vec<QueryItem>)
Performs an insert_item on each item in the vector.
§impl Query
impl Query
pub fn merge_default_subquery_branch(
&mut self,
other_default_subquery_branch: SubqueryBranch,
)
pub fn merge_default_subquery_branch( &mut self, other_default_subquery_branch: SubqueryBranch, )
Merges the subquery for the query with the current subquery. Subqueries causes every element that is returned by the query to be subqueried or subqueried to the subquery_path/subquery if a subquery is present. Merging involves creating conditional subqueries in the subqueries subqueries and paths.
pub fn merge_multiple(queries: Vec<Query>) -> Query
pub fn merge_multiple(queries: Vec<Query>) -> Query
Merges multiple queries into a single query. Items are unioned and conditional subquery branches are merged where they intersect.
pub fn merge_with(&mut self, other: Query)
pub fn merge_with(&mut self, other: Query)
Merges another query into this one, combining items and conditional subquery branches.
pub fn merge_conditional_boxed_subquery(
&mut self,
query_item_merging_in: QueryItem,
subquery_branch_merging_in: SubqueryBranch,
)
pub fn merge_conditional_boxed_subquery( &mut self, query_item_merging_in: QueryItem, subquery_branch_merging_in: SubqueryBranch, )
Adds a conditional subquery. A conditional subquery replaces the default subquery and subquery_path if the item matches for the key. If multiple conditional subquery items match, then the first one that matches is used (in order that they were added).
pub fn merge_conditional_subquery_branches_with_new_at_query_item(
conditional_subquery_branches: Option<IndexMap<QueryItem, SubqueryBranch>>,
query_item_merging_in: QueryItem,
subquery_branch_merging_in: SubqueryBranch,
) -> IndexMap<QueryItem, SubqueryBranch>
pub fn merge_conditional_subquery_branches_with_new_at_query_item( conditional_subquery_branches: Option<IndexMap<QueryItem, SubqueryBranch>>, query_item_merging_in: QueryItem, subquery_branch_merging_in: SubqueryBranch, ) -> IndexMap<QueryItem, SubqueryBranch>
Adds a conditional subquery. A conditional subquery replaces the default subquery and subquery_path if the item matches for the key. If multiple conditional subquery items match, then the first one that matches is used (in order that they were added).
§impl Query
impl Query
pub fn new_range_full() -> Query
pub fn new_range_full() -> Query
Creates a new query which contains all items.
pub fn new_single_key(key: Vec<u8>) -> Query
pub fn new_single_key(key: Vec<u8>) -> Query
Creates a new query which contains only one key.
pub fn new_single_query_item(query_item: QueryItem) -> Query
pub fn new_single_query_item(query_item: QueryItem) -> Query
Creates a new query which contains only one item.
pub fn new_with_direction(left_to_right: bool) -> Query
pub fn new_with_direction(left_to_right: bool) -> Query
Creates a new query with a direction specified
pub fn new_single_query_item_with_direction(
query_item: QueryItem,
left_to_right: bool,
) -> Query
pub fn new_single_query_item_with_direction( query_item: QueryItem, left_to_right: bool, ) -> Query
Creates a new query which contains only one item with the specified direction.
pub fn has_subquery_on_key(&self, key: &[u8], in_path: bool) -> bool
pub fn has_subquery_on_key(&self, key: &[u8], in_path: bool) -> bool
Returns true if the given key would trigger a subquery (either via
the default subquery branch or a matching conditional branch).
pub fn has_subquery_or_subquery_path_on_key(
&self,
key: &[u8],
in_path: bool,
) -> bool
pub fn has_subquery_or_subquery_path_on_key( &self, key: &[u8], in_path: bool, ) -> bool
Returns true if the given key would trigger a subquery or subquery
path (either via the default branch or a matching conditional branch).
pub fn terminal_keys(
&self,
current_path: Vec<Vec<u8>>,
max_results: usize,
result: &mut Vec<(Vec<Vec<u8>>, Vec<u8>)>,
) -> Result<usize, Error>
pub fn terminal_keys( &self, current_path: Vec<Vec<u8>>, max_results: usize, result: &mut Vec<(Vec<Vec<u8>>, Vec<u8>)>, ) -> Result<usize, Error>
Pushes terminal key paths and keys to result, no more than
max_results. Returns the number of terminal keys added.
Terminal keys are the keys of a path query below which there are no more subqueries. In other words they’re the keys of the terminal queries of a path query.
pub fn directional_iter(
&self,
left_to_right: bool,
) -> Box<dyn Iterator<Item = &QueryItem> + '_>
pub fn directional_iter( &self, left_to_right: bool, ) -> Box<dyn Iterator<Item = &QueryItem> + '_>
Iterate with direction specified
pub fn set_subquery_key(&mut self, key: Vec<u8>)
pub fn set_subquery_key(&mut self, key: Vec<u8>)
Sets the subquery_path for the query with one key. This causes every element that is returned by the query to be subqueried one level to the subquery_path.
pub fn set_subquery_path(&mut self, path: Vec<Vec<u8>>)
pub fn set_subquery_path(&mut self, path: Vec<Vec<u8>>)
Sets the subquery_path for the query. This causes every element that is returned by the query to be subqueried to the subquery_path.
pub fn set_subquery(&mut self, subquery: Query)
pub fn set_subquery(&mut self, subquery: Query)
Sets the subquery for the query. This causes every element that is returned by the query to be subqueried or subqueried to the subquery_path/subquery if a subquery is present.
pub fn add_conditional_subquery(
&mut self,
item: QueryItem,
subquery_path: Option<Vec<Vec<u8>>>,
subquery: Option<Query>,
)
pub fn add_conditional_subquery( &mut self, item: QueryItem, subquery_path: Option<Vec<Vec<u8>>>, subquery: Option<Query>, )
Adds a conditional subquery. A conditional subquery replaces the default subquery and subquery_path if the item matches for the key. If multiple conditional subquery items match, then the first one that matches is used (in order that they were added).
pub fn has_subquery(&self) -> bool
pub fn has_subquery(&self) -> bool
Check if there is a subquery
pub fn has_only_keys(&self) -> bool
pub fn has_only_keys(&self) -> bool
Check if there are only keys
Trait Implementations§
§impl<'de, Context> BorrowDecode<'de, Context> for Query
impl<'de, Context> BorrowDecode<'de, Context> for Query
§fn borrow_decode<D>(decoder: &mut D) -> Result<Query, DecodeError>where
D: BorrowDecoder<'de, Context = Context>,
fn borrow_decode<D>(decoder: &mut D) -> Result<Query, DecodeError>where
D: BorrowDecoder<'de, Context = Context>,
§impl IntoIterator for Query
impl IntoIterator for Query
§impl QueryProofVerify for Query
impl QueryProofVerify for Query
§fn execute_proof(
&self,
bytes: &[u8],
limit: Option<u16>,
left_to_right: bool,
proof_version: u16,
) -> CostContext<Result<([u8; 32], ProofVerificationResult), Error>>
fn execute_proof( &self, bytes: &[u8], limit: Option<u16>, left_to_right: bool, proof_version: u16, ) -> CostContext<Result<([u8; 32], ProofVerificationResult), Error>>
Verifies the encoded proof with the given query
Every key in keys is checked to either have a key/value pair in the
proof, or to have its absence in the tree proven.
Returns Err if the proof is invalid, or a list of proven values
associated with keys. For example, if keys contains keys A and
B, the returned list will contain 2 elements, the value of A and
the value of B. Keys proven to be absent in the tree will have an
entry of None, keys that have a proven value will have an entry of
Some(value).
impl StructuralPartialEq for Query
Auto Trait Implementations§
impl Freeze for Query
impl RefUnwindSafe for Query
impl Send for Query
impl Sync for Query
impl Unpin for Query
impl UnwindSafe for Query
Blanket Implementations§
§impl<I> BidiIterator for I
impl<I> BidiIterator for I
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> CostsExt for T
impl<T> CostsExt for T
§fn wrap_with_cost(self, cost: OperationCost) -> CostContext<Self>where
Self: Sized,
fn wrap_with_cost(self, cost: OperationCost) -> CostContext<Self>where
Self: Sized,
CostContext object with provided costs.§fn wrap_fn_cost(
self,
f: impl FnOnce(&Self) -> OperationCost,
) -> CostContext<Self>where
Self: Sized,
fn wrap_fn_cost(
self,
f: impl FnOnce(&Self) -> OperationCost,
) -> CostContext<Self>where
Self: Sized,
CostContext object with costs computed using the
value getting wrapped.Source§impl<'de, T> DefaultBorrowDecode<'de> for Twhere
T: BorrowDecode<'de, ()>,
impl<'de, T> DefaultBorrowDecode<'de> for Twhere
T: BorrowDecode<'de, ()>,
fn borrow_decode<D>(decoder: &mut D) -> Result<Self, DecodeError>
Source§impl<T> DefaultDecode for T
impl<T> DefaultDecode for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T, U> IntoOnNetwork<U> for Twhere
U: FromOnNetwork<T>,
impl<T, U> IntoOnNetwork<U> for Twhere
U: FromOnNetwork<T>,
§fn into_on_network(self, network: Network) -> U
fn into_on_network(self, network: Network) -> U
Calls U::from_on_network(self).
Source§impl<T, U> IntoPlatformVersioned<U> for Twhere
U: FromPlatformVersioned<T>,
impl<T, U> IntoPlatformVersioned<U> for Twhere
U: FromPlatformVersioned<T>,
Source§fn into_platform_versioned(self, platform_version: &PlatformVersion) -> U
fn into_platform_versioned(self, platform_version: &PlatformVersion) -> U
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.