Struct mz_expr::MapFilterProject
source · pub struct MapFilterProject {
pub expressions: Vec<MirScalarExpr>,
pub predicates: Vec<(usize, MirScalarExpr)>,
pub projection: Vec<usize>,
pub input_arity: usize,
}
Expand description
A compound operator that can be applied row-by-row.
This operator integrates the map, filter, and project operators.
It applies a sequences of map expressions, which are allowed to
refer to previous expressions, interleaved with predicates which
must be satisfied for an output to be produced. If all predicates
evaluate to Datum::True
the data at the identified columns are
collected and produced as output in a packed Row
.
This operator is a “builder” and its contents may contain expressions
that are not yet executable. For example, it may contain temporal
expressions in self.expressions
, even though this is not something
we can directly evaluate. The plan creation methods will defensively
ensure that the right thing happens.
Fields§
§expressions: Vec<MirScalarExpr>
A sequence of expressions that should be appended to the row.
Many of these expressions may not be produced in the output, and may only be present as common subexpressions.
predicates: Vec<(usize, MirScalarExpr)>
Expressions that must evaluate to Datum::True
for the output
row to be produced.
Each entry is prepended with a column identifier indicating the column before which the predicate should first be applied. Most commonly this would be one plus the largest column identifier in the predicate’s support, but it could be larger to implement guarded evaluation of predicates.
This list should be sorted by the first field.
projection: Vec<usize>
A sequence of column identifiers whose data form the output row.
input_arity: usize
The expected number of input columns.
This is needed to ensure correct identification of newly formed columns in the output.
Implementations§
source§impl MapFilterProject
impl MapFilterProject
sourcepub fn new(input_arity: usize) -> Self
pub fn new(input_arity: usize) -> Self
Create a no-op operator for an input of a supplied arity.
sourcepub fn compose(before: Self, after: Self) -> Self
pub fn compose(before: Self, after: Self) -> Self
Given two mfps, return an mfp that applies one followed by the other. Note that the arguments are in the opposite order from how function composition is usually written in mathematics.
sourcepub fn is_identity(&self) -> bool
pub fn is_identity(&self) -> bool
True if the operator describes the identity transformation.
sourcepub fn project<I>(self, columns: I) -> Self
pub fn project<I>(self, columns: I) -> Self
Retain only the indicated columns in the presented order.
sourcepub fn filter<I>(self, predicates: I) -> Selfwhere
I: IntoIterator<Item = MirScalarExpr>,
pub fn filter<I>(self, predicates: I) -> Selfwhere
I: IntoIterator<Item = MirScalarExpr>,
Retain only rows satisfying these predicates.
This method introduces predicates as eagerly as they can be evaluated, which may not be desired for predicates that may cause exceptions. If fine manipulation is required, the predicates can be added manually.
sourcepub fn map<I>(self, expressions: I) -> Selfwhere
I: IntoIterator<Item = MirScalarExpr>,
pub fn map<I>(self, expressions: I) -> Selfwhere
I: IntoIterator<Item = MirScalarExpr>,
Append the result of evaluating expressions to each row.
sourcepub fn into_map_filter_project(
self,
) -> (Vec<MirScalarExpr>, Vec<MirScalarExpr>, Vec<usize>)
pub fn into_map_filter_project( self, ) -> (Vec<MirScalarExpr>, Vec<MirScalarExpr>, Vec<usize>)
Like MapFilterProject::as_map_filter_project
, but consumes self
rather than cloning.
sourcepub fn as_map_filter_project(
&self,
) -> (Vec<MirScalarExpr>, Vec<MirScalarExpr>, Vec<usize>)
pub fn as_map_filter_project( &self, ) -> (Vec<MirScalarExpr>, Vec<MirScalarExpr>, Vec<usize>)
As the arguments to Map
, Filter
, and Project
operators.
In principle, this operator can be implemented as a sequence of more elemental operators, likely less efficiently.
sourcepub fn literal_constraint(&self, expr: &MirScalarExpr) -> Option<Datum<'_>>
pub fn literal_constraint(&self, expr: &MirScalarExpr) -> Option<Datum<'_>>
Determines if a scalar expression must be equal to a literal datum.
sourcepub fn literal_constraints(&self, exprs: &[MirScalarExpr]) -> Option<Row>
pub fn literal_constraints(&self, exprs: &[MirScalarExpr]) -> Option<Row>
Determines if a sequence of scalar expressions must be equal to a literal row.
This method returns None
on an empty exprs
, which might be surprising, but
seems to line up with its callers’ expectations of that being a non-constraint.
The caller knows if exprs
is empty, and can modify their behavior appropriately.
if they would rather have a literal empty row.
sourcepub fn extract_from_expression(
expr: &MirRelationExpr,
) -> (Self, &MirRelationExpr)
pub fn extract_from_expression( expr: &MirRelationExpr, ) -> (Self, &MirRelationExpr)
Extracts any MapFilterProject at the root of the expression.
The expression will be modified to extract any maps, filters, and
projections, which will be returned as Self
. If there are no maps,
filters, or projections the method will return an identity operator.
The extracted expressions may contain temporal predicates, and one should be careful to apply them blindly.
sourcepub fn extract_non_errors_from_expr(
expr: &MirRelationExpr,
) -> (Self, &MirRelationExpr)
pub fn extract_non_errors_from_expr( expr: &MirRelationExpr, ) -> (Self, &MirRelationExpr)
Extracts an error-free MapFilterProject at the root of the expression.
The expression will be modified to extract maps, filters, and projects
from the root of the expression, which will be returned as Self
. The
extraction will halt if a Map or Filter containing a literal error is
reached. Otherwise, the method will return an identity operator.
This method is meant to be used during optimization, where it is necessary to avoid moving around maps and filters with errors.
sourcepub fn extract_non_errors_from_expr_ref_mut(
expr: &mut MirRelationExpr,
) -> (Self, &mut MirRelationExpr)
pub fn extract_non_errors_from_expr_ref_mut( expr: &mut MirRelationExpr, ) -> (Self, &mut MirRelationExpr)
Extracts an error-free MapFilterProject at the root of the expression.
Differs from MapFilterProject::extract_non_errors_from_expr by taking and returning a mutable reference.
sourcepub fn extract_non_errors_from_expr_mut(expr: &mut MirRelationExpr) -> Self
pub fn extract_non_errors_from_expr_mut(expr: &mut MirRelationExpr) -> Self
Removes an error-free MapFilterProject from the root of the expression.
The expression will be modified to extract maps, filters, and projects
from the root of the expression, which will be returned as Self
. The
extraction will halt if a Map or Filter containing a literal error is
reached. Otherwise, the method will return an
identity operator, and the expression will remain unchanged.
This method is meant to be used during optimization, where it is necessary to avoid moving around maps and filters with errors.
sourcepub fn extract_temporal(&mut self) -> Self
pub fn extract_temporal(&mut self) -> Self
Extracts temporal predicates into their own Self
.
Expressions that are used by the temporal predicates are exposed by self.projection
,
though there could be justification for extracting them as well if they are otherwise
unused.
This separation is valuable when the execution cannot be fused into one operator.
sourcepub fn extract_common(mfps: &mut [&mut Self]) -> Self
pub fn extract_common(mfps: &mut [&mut Self]) -> Self
Extracts common expressions from multiple Self
into a result Self
.
The argument mfps
are mutated so that each are functionaly equivalent to their
corresponding input, when composed atop the resulting Self
.
source§impl MapFilterProject
impl MapFilterProject
sourcepub fn partition(
self,
available: BTreeMap<usize, usize>,
input_arity: usize,
) -> (Self, Self)
pub fn partition( self, available: BTreeMap<usize, usize>, input_arity: usize, ) -> (Self, Self)
Partitions self
into two instances, one of which can be eagerly applied.
The available
argument indicates which input columns are available (keys)
and in which positions (values). This information may allow some maps and
filters to execute. The input_arity
argument reports the total number of
input columns (which may include some not present in available
)
This method partitions self
in two parts, (before, after)
, where before
can be applied on columns present as keys in available
, and after
must
await the introduction of the other input columns.
The before
instance will append any columns that can be determined from
available
but will project away any of these columns that are not needed by
after
. Importantly, this means that before
will leave intact all input
columns including those not referenced in available
.
The after
instance will presume all input columns are available, followed
by the appended columns of the before
instance. It may be that some input
columns can be projected away in before
if after
does not need them, but
we leave that as something the caller can apply if needed (it is otherwise
complicated to negotiate which input columns before
should retain).
To correctly reconstruct self
from before
and after
, one must introduce
additional input columns, permute all input columns to their locations as
expected by self
, follow this by new columns appended by before
, and
remove all other columns that may be present.
§Example
use mz_expr::{BinaryFunc, MapFilterProject, MirScalarExpr};
// imagine an action on columns (a, b, c, d).
let original = MapFilterProject::new(4).map(vec![
MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::AddInt64),
MirScalarExpr::column(2).call_binary(MirScalarExpr::column(4), BinaryFunc::AddInt64),
MirScalarExpr::column(3).call_binary(MirScalarExpr::column(5), BinaryFunc::AddInt64),
]).project(vec![6]);
// Imagine we start with columns (b, x, a, y, c).
//
// The `partition` method requires a map from *expected* input columns to *actual*
// input columns. In the example above, the columns a, b, and c exist, and are at
// locations 2, 0, and 4 respectively. We must construct a map to this effect.
let mut available_columns = std::collections::BTreeMap::new();
available_columns.insert(0, 2);
available_columns.insert(1, 0);
available_columns.insert(2, 4);
// Partition `original` using the available columns and current input arity.
// This informs `partition` which columns are available, where they can be found,
// and how many columns are not relevant but should be preserved.
let (before, after) = original.partition(available_columns, 5);
// `before` sees all five input columns, and should append `a + b + c`.
assert_eq!(before, MapFilterProject::new(5).map(vec![
MirScalarExpr::column(2).call_binary(MirScalarExpr::column(0), BinaryFunc::AddInt64),
MirScalarExpr::column(4).call_binary(MirScalarExpr::column(5), BinaryFunc::AddInt64),
]).project(vec![0, 1, 2, 3, 4, 6]));
// `after` expects to see `(a, b, c, d, a + b + c)`.
assert_eq!(after, MapFilterProject::new(5).map(vec![
MirScalarExpr::column(3).call_binary(MirScalarExpr::column(4), BinaryFunc::AddInt64)
]).project(vec![5]));
// To reconstruct `self`, we must introduce the columns that are not present,
// and present them in the order intended by `self`. In this example, we must
// introduce column d and permute the columns so that they begin (a, b, c, d).
// The columns x and y must be projected away, and any columns introduced by
// `begin` must be retained in their current order.
// The `after` instance expects to be provided with all inputs, but it
// may not need all inputs. The `demand()` and `permute()` methods can
// optimize the representation.
sourcepub fn demand(&self) -> BTreeSet<usize>
pub fn demand(&self) -> BTreeSet<usize>
Lists input columns whose values are used in outputs.
It is entirely appropriate to determine the demand of an instance
and then both apply a projection to the subject of the instance and
self.permute
this instance.
sourcepub fn permute(
&mut self,
shuffle: BTreeMap<usize, usize>,
new_input_arity: usize,
)
pub fn permute( &mut self, shuffle: BTreeMap<usize, usize>, new_input_arity: usize, )
Update input column references, due to an input projection or permutation.
The shuffle
argument remaps expected column identifiers to new locations,
with the expectation that shuffle
describes all input columns, and so the
intermediate results will be able to start at position shuffle.len()
.
The supplied shuffle
might not list columns that are not “demanded” by the
instance, and so we should ensure that self
is optimized to not reference
columns that are not demanded.
source§impl MapFilterProject
impl MapFilterProject
sourcepub fn optimize(&mut self)
pub fn optimize(&mut self)
Optimize the internal expression evaluation order.
This method performs several optimizations that are meant to streamline
the execution of the MapFilterProject
instance, but not to alter its
semantics. This includes extracting expressions that are used multiple
times, inlining those that are not, and removing expressions that are
unreferenced.
This method will inline all temporal expressions, and remove any columns that are not demanded by the output, which should transform any temporal filters to a state where the temporal expressions exist only in the list of predicates.
§Example
This example demonstrates how the re-use of one expression, converting column 1 from a string to an integer, can be extracted and the results shared among the two uses. This example is used for each of the steps along the optimization path.
use mz_expr::{func, MapFilterProject, MirScalarExpr, UnaryFunc, BinaryFunc};
// Demonstrate extraction of common expressions (here: parsing strings).
let mut map_filter_project = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
])
.project(vec![3,4,5,6]);
let mut expected_optimized = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(5), BinaryFunc::AddInt64),
MirScalarExpr::column(5).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
])
.project(vec![3,4,6,7]);
// Optimize the expression.
map_filter_project.optimize();
assert_eq!(
map_filter_project,
expected_optimized,
);
sourcepub fn memoize_expressions(&mut self)
pub fn memoize_expressions(&mut self)
Place each certainly evaluated expression in its own column.
This method places each non-trivial, certainly evaluated expression in its own column, and deduplicates them so that all references to the same expression reference the same column.
This transformation is restricted to expressions we are certain will
be evaluated, which does not include expressions in if
statements.
§Example
This example demonstrates how memoization notices MirScalarExpr
s
that are used multiple times, and ensures that each are extracted
into columns and then referenced by column. This pass does not try
to minimize the occurrences of column references, which will happen
in inlining.
use mz_expr::{func, MapFilterProject, MirScalarExpr, UnaryFunc, BinaryFunc};
// Demonstrate extraction of common expressions (here: parsing strings).
let mut map_filter_project = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
])
.project(vec![3,4,5,6]);
let mut expected_optimized = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(5).call_binary(MirScalarExpr::column(6), BinaryFunc::AddInt64),
MirScalarExpr::column(7),
MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(6).call_binary(MirScalarExpr::column(9), BinaryFunc::AddInt64),
MirScalarExpr::column(10),
])
.project(vec![3,4,8,11]);
// Memoize expressions, ensuring uniqueness of each `MirScalarExpr`.
map_filter_project.memoize_expressions();
assert_eq!(
map_filter_project,
expected_optimized,
);
Expressions may not be memoized if they are not certain to be evaluated,
for example if they occur in conditional branches of a MirScalarExpr::If
.
use mz_expr::{MapFilterProject, MirScalarExpr, UnaryFunc, BinaryFunc};
// Demonstrate extraction of unconditionally evaluated expressions, as well as
// the non-extraction of common expressions guarded by conditions.
let mut map_filter_project = MapFilterProject::new(2)
.map(vec![
MirScalarExpr::If {
cond: Box::new(MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::Lt)),
then: Box::new(MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::DivInt64)),
els: Box::new(MirScalarExpr::column(1).call_binary(MirScalarExpr::column(0), BinaryFunc::DivInt64)),
},
MirScalarExpr::If {
cond: Box::new(MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::Lt)),
then: Box::new(MirScalarExpr::column(1).call_binary(MirScalarExpr::column(0), BinaryFunc::DivInt64)),
els: Box::new(MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::DivInt64)),
},
]);
let mut expected_optimized = MapFilterProject::new(2)
.map(vec![
MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::Lt),
MirScalarExpr::If {
cond: Box::new(MirScalarExpr::column(2)),
then: Box::new(MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::DivInt64)),
els: Box::new(MirScalarExpr::column(1).call_binary(MirScalarExpr::column(0), BinaryFunc::DivInt64)),
},
MirScalarExpr::column(3),
MirScalarExpr::If {
cond: Box::new(MirScalarExpr::column(2)),
then: Box::new(MirScalarExpr::column(1).call_binary(MirScalarExpr::column(0), BinaryFunc::DivInt64)),
els: Box::new(MirScalarExpr::column(0).call_binary(MirScalarExpr::column(1), BinaryFunc::DivInt64)),
},
MirScalarExpr::column(5),
])
.project(vec![0,1,4,6]);
// Memoize expressions, ensuring uniqueness of each `MirScalarExpr`.
map_filter_project.memoize_expressions();
assert_eq!(
map_filter_project,
expected_optimized,
);
sourcepub fn inline_expressions(&mut self)
pub fn inline_expressions(&mut self)
This method inlines expressions with a single use.
This method only inlines expressions; it does not delete expressions
that are no longer referenced. The remove_undemanded()
method does
that, and should likely be used after this method.
Inlining replaces column references when the referred-to item is either another column reference, or the only referrer of its referent. This is most common after memoization has atomized all expressions to seek out re-use: inlining re-assembles expressions that were not helpfully shared with other expressions.
§Example
In this example, we see that with only a single reference to columns 0 and 2, their parsing can each be inlined. Similarly, column references can be cleaned up among expressions, and in the final projection.
Also notice the remaining expressions, which can be cleaned up in a later
pass (the remove_undemanded
method).
use mz_expr::{func, MapFilterProject, MirScalarExpr, UnaryFunc, BinaryFunc};
// Use the output from first `memoize_expression` example.
let mut map_filter_project = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(5).call_binary(MirScalarExpr::column(6), BinaryFunc::AddInt64),
MirScalarExpr::column(7),
MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(6).call_binary(MirScalarExpr::column(9), BinaryFunc::AddInt64),
MirScalarExpr::column(10),
])
.project(vec![3,4,8,11]);
let mut expected_optimized = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(6), BinaryFunc::AddInt64),
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(6), BinaryFunc::AddInt64),
MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(6).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
MirScalarExpr::column(6).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
])
.project(vec![3,4,8,11]);
// Inline expressions that are referenced only once.
map_filter_project.inline_expressions();
assert_eq!(
map_filter_project,
expected_optimized,
);
sourcepub fn perform_inlining(&mut self, should_inline: Vec<bool>)
pub fn perform_inlining(&mut self, should_inline: Vec<bool>)
Inlines those expressions that are indicated by should_inline.
See inline_expressions
for usage.
sourcepub fn remove_undemanded(&mut self)
pub fn remove_undemanded(&mut self)
Removes unused expressions from self.expressions
.
Expressions are “used” if they are relied upon by any output columns or any predicates, even transitively. Any expressions that are not relied upon in this way can be discarded.
§Example
use mz_expr::{func, MapFilterProject, MirScalarExpr, UnaryFunc, BinaryFunc};
// Use the output from `inline_expression` example.
let mut map_filter_project = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(6), BinaryFunc::AddInt64),
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(6), BinaryFunc::AddInt64),
MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(6).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
MirScalarExpr::column(6).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
])
.project(vec![3,4,8,11]);
let mut expected_optimized = MapFilterProject::new(5)
.map(vec![
MirScalarExpr::column(1).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)),
MirScalarExpr::column(0).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)).call_binary(MirScalarExpr::column(5), BinaryFunc::AddInt64),
MirScalarExpr::column(5).call_binary(MirScalarExpr::column(2).call_unary(UnaryFunc::CastStringToInt64(func::CastStringToInt64)), BinaryFunc::AddInt64),
])
.project(vec![3,4,6,7]);
// Remove undemanded expressions, streamlining the work done..
map_filter_project.remove_undemanded();
assert_eq!(
map_filter_project,
expected_optimized,
);
Trait Implementations§
source§impl Arbitrary for MapFilterProject
impl Arbitrary for MapFilterProject
Use a custom Arbitrary
implementation to cap the number of internal
MirScalarExpr
referenced by the generated MapFilterProject
instances.
§type Parameters = ()
type Parameters = ()
arbitrary_with
accepts for configuration
of the generated Strategy
. Parameters must implement Default
.§type Strategy = BoxedStrategy<MapFilterProject>
type Strategy = BoxedStrategy<MapFilterProject>
Strategy
used to generate values of type Self
.source§fn arbitrary_with(_: Self::Parameters) -> Self::Strategy
fn arbitrary_with(_: Self::Parameters) -> Self::Strategy
source§impl Clone for MapFilterProject
impl Clone for MapFilterProject
source§fn clone(&self) -> MapFilterProject
fn clone(&self) -> MapFilterProject
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for MapFilterProject
impl Debug for MapFilterProject
source§impl<'de> Deserialize<'de> for MapFilterProject
impl<'de> Deserialize<'de> for MapFilterProject
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl Display for MapFilterProject
impl Display for MapFilterProject
source§impl Hash for MapFilterProject
impl Hash for MapFilterProject
source§impl Ord for MapFilterProject
impl Ord for MapFilterProject
source§fn cmp(&self, other: &MapFilterProject) -> Ordering
fn cmp(&self, other: &MapFilterProject) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl PartialEq for MapFilterProject
impl PartialEq for MapFilterProject
source§impl PartialOrd for MapFilterProject
impl PartialOrd for MapFilterProject
source§impl RustType<ProtoMapFilterProject> for MapFilterProject
impl RustType<ProtoMapFilterProject> for MapFilterProject
source§fn into_proto(&self) -> ProtoMapFilterProject
fn into_proto(&self) -> ProtoMapFilterProject
Self
into a Proto
value.source§fn from_proto(proto: ProtoMapFilterProject) -> Result<Self, TryFromProtoError>
fn from_proto(proto: ProtoMapFilterProject) -> Result<Self, TryFromProtoError>
source§fn into_proto_owned(self) -> Proto
fn into_proto_owned(self) -> Proto
Self::into_proto
that types can
optionally implement, otherwise, the default implementation
delegates to Self::into_proto
.source§impl Serialize for MapFilterProject
impl Serialize for MapFilterProject
impl Eq for MapFilterProject
impl StructuralPartialEq for MapFilterProject
Auto Trait Implementations§
impl Freeze for MapFilterProject
impl RefUnwindSafe for MapFilterProject
impl Send for MapFilterProject
impl Sync for MapFilterProject
impl Unpin for MapFilterProject
impl UnwindSafe for MapFilterProject
Blanket Implementations§
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,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> PreferredContainer for T
impl<T> PreferredContainer for T
source§impl<T> ProgressEventTimestamp for T
impl<T> ProgressEventTimestamp for T
source§impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
source§fn into_rust(self) -> Result<R, TryFromProtoError>
fn into_rust(self) -> Result<R, TryFromProtoError>
RustType::from_proto
.source§fn from_rust(rust: &R) -> P
fn from_rust(rust: &R) -> P
RustType::into_proto
.source§impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
source§fn plus_equals(&mut self, rhs: &&'a S)
fn plus_equals(&mut self, rhs: &&'a S)
std::ops::AddAssign
, for types that do not implement AddAssign
.