Enum mz_sql::plan::expr::HirRelationExpr
source · pub enum HirRelationExpr {
Show 15 variants
Constant {
rows: Vec<Row>,
typ: RelationType,
},
Get {
id: Id,
typ: RelationType,
},
LetRec {
bindings: Vec<(String, LocalId, HirRelationExpr, RelationType)>,
body: Box<HirRelationExpr>,
},
Let {
name: String,
id: LocalId,
value: Box<HirRelationExpr>,
body: Box<HirRelationExpr>,
},
Project {
input: Box<HirRelationExpr>,
outputs: Vec<usize>,
},
Map {
input: Box<HirRelationExpr>,
scalars: Vec<HirScalarExpr>,
},
CallTable {
func: TableFunc,
exprs: Vec<HirScalarExpr>,
},
Filter {
input: Box<HirRelationExpr>,
predicates: Vec<HirScalarExpr>,
},
Join {
left: Box<HirRelationExpr>,
right: Box<HirRelationExpr>,
on: HirScalarExpr,
kind: JoinKind,
},
Reduce {
input: Box<HirRelationExpr>,
group_key: Vec<usize>,
aggregates: Vec<AggregateExpr>,
expected_group_size: Option<usize>,
},
Distinct {
input: Box<HirRelationExpr>,
},
TopK {
input: Box<HirRelationExpr>,
group_key: Vec<usize>,
order_key: Vec<ColumnOrder>,
limit: Option<usize>,
offset: usize,
},
Negate {
input: Box<HirRelationExpr>,
},
Threshold {
input: Box<HirRelationExpr>,
},
Union {
base: Box<HirRelationExpr>,
inputs: Vec<HirRelationExpr>,
},
}
Expand description
Just like MirRelationExpr, except where otherwise noted below.
Variants§
Constant
Get
LetRec
Fields
bindings: Vec<(String, LocalId, HirRelationExpr, RelationType)>
List of bindings all of which are in scope of each other.
body: Box<HirRelationExpr>
Result of the AST node.
Mutually recursive CTE
Let
Fields
value: Box<HirRelationExpr>
The collection to be bound to name
.
body: Box<HirRelationExpr>
The result of the Let
, evaluated with name
bound to value
.
CTE
Project
Map
CallTable
Filter
Join
Unlike MirRelationExpr, we haven’t yet compiled LeftOuter/RightOuter/FullOuter joins away into more primitive exprs
Reduce
Unlike MirRelationExpr, when key
is empty AND input
is empty this returns
a single row with the aggregates evaluated over empty groups, rather than returning zero
rows
Distinct
Fields
input: Box<HirRelationExpr>
TopK
Fields
input: Box<HirRelationExpr>
The source collection.
order_key: Vec<ColumnOrder>
Column indices used to order rows within groups.
Groups and orders within each group, limiting output.
Negate
Fields
input: Box<HirRelationExpr>
Threshold
Fields
input: Box<HirRelationExpr>
Keep rows from a dataflow where the row counts are positive.
Union
Implementations§
source§impl HirRelationExpr
impl HirRelationExpr
fn fmt_virtual_syntax(
&self,
f: &mut Formatter<'_>,
ctx: &mut PlanRenderingContext<'_, HirRelationExpr>
) -> Result
fn fmt_raw_syntax(
&self,
f: &mut Formatter<'_>,
ctx: &mut PlanRenderingContext<'_, HirRelationExpr>
) -> Result
source§impl<'a> HirRelationExpr
impl<'a> HirRelationExpr
fn as_explain_single_plan(
&'a mut self,
context: &'a ExplainContext<'a>
) -> Result<ExplainSinglePlan<'a, HirRelationExpr>, ExplainError>
source§impl HirRelationExpr
impl HirRelationExpr
pub fn typ(
&self,
outers: &[RelationType],
params: &BTreeMap<usize, ScalarType>
) -> RelationType
pub fn arity(&self) -> usize
Reports whether this expression contains a column reference to its direct parent scope.
pub fn is_join_identity(&self) -> bool
pub fn project(self, outputs: Vec<usize>) -> Self
pub fn map(self, scalars: Vec<HirScalarExpr>) -> Self
pub fn filter(self, predicates: Vec<HirScalarExpr>) -> Self
pub fn reduce(
self,
group_key: Vec<usize>,
aggregates: Vec<AggregateExpr>,
expected_group_size: Option<usize>
) -> Self
pub fn top_k(
self,
group_key: Vec<usize>,
order_key: Vec<ColumnOrder>,
limit: Option<usize>,
offset: usize
) -> Self
pub fn negate(self) -> Self
pub fn distinct(self) -> Self
pub fn threshold(self) -> Self
pub fn union(self, other: Self) -> Self
pub fn exists(self) -> HirScalarExpr
pub fn select(self) -> HirScalarExpr
pub fn join(
self,
right: HirRelationExpr,
on: HirScalarExpr,
kind: JoinKind
) -> HirRelationExpr
pub fn take(&mut self) -> HirRelationExpr
pub fn visit<'a, F>(&'a self, depth: usize, f: &mut F)where
F: FnMut(&'a Self, usize),
Visit::visit_post
.pub fn visit_fallible<'a, F, E>(
&'a self,
depth: usize,
f: &mut F
) -> Result<(), E>where
F: FnMut(&'a Self, usize) -> Result<(), E>,
Visit::try_visit_post
.pub fn visit1<'a, F, E>(&'a self, depth: usize, f: F) -> Result<(), E>where
F: FnMut(&'a Self, usize) -> Result<(), E>,
VisitChildren<HirRelationExpr>::try_visit_children
instead.pub fn visit_mut<F>(&mut self, depth: usize, f: &mut F)where
F: FnMut(&mut Self, usize),
Visit::visit_mut_post
instead.pub fn visit_mut_fallible<F, E>(
&mut self,
depth: usize,
f: &mut F
) -> Result<(), E>where
F: FnMut(&mut Self, usize) -> Result<(), E>,
Visit::try_visit_mut_post
instead.pub fn visit1_mut<'a, F, E>(&'a mut self, depth: usize, f: F) -> Result<(), E>where
F: FnMut(&'a mut Self, usize) -> Result<(), E>,
VisitChildren<HirRelationExpr>::try_visit_mut_children
instead.sourcepub fn visit_scalar_expressions<F, E>(
&self,
depth: usize,
f: &mut F
) -> Result<(), E>where
F: FnMut(&HirScalarExpr, usize) -> Result<(), E>,
👎Deprecated: Use a combination of Visit
and VisitChildren
methods.
pub fn visit_scalar_expressions<F, E>(
&self,
depth: usize,
f: &mut F
) -> Result<(), E>where
F: FnMut(&HirScalarExpr, usize) -> Result<(), E>,
Visit
and VisitChildren
methods.Visits all scalar expressions within the sub-tree of the given relation.
The depth
argument should indicate the subquery nesting depth of the expression,
which will be incremented when entering the RHS of a join or a subquery and
presented to the supplied function f
.
sourcepub fn visit_scalar_expressions_mut<F, E>(
&mut self,
depth: usize,
f: &mut F
) -> Result<(), E>where
F: FnMut(&mut HirScalarExpr, usize) -> Result<(), E>,
👎Deprecated: Use a combination of Visit
and VisitChildren
methods.
pub fn visit_scalar_expressions_mut<F, E>(
&mut self,
depth: usize,
f: &mut F
) -> Result<(), E>where
F: FnMut(&mut HirScalarExpr, usize) -> Result<(), E>,
Visit
and VisitChildren
methods.Like visit_scalar_expressions
, but permits mutating the expressions.
sourcepub fn visit_columns<F>(&self, depth: usize, f: &mut F)where
F: FnMut(usize, &ColumnRef),
👎Deprecated: Redefine this based on the Visit
and VisitChildren
methods.
pub fn visit_columns<F>(&self, depth: usize, f: &mut F)where
F: FnMut(usize, &ColumnRef),
Visit
and VisitChildren
methods.Visits the column references in this relation expression.
The depth
argument should indicate the subquery nesting depth of the expression,
which will be incremented when entering the RHS of a join or a subquery and
presented to the supplied function f
.
sourcepub fn visit_columns_mut<F>(&mut self, depth: usize, f: &mut F)where
F: FnMut(usize, &mut ColumnRef),
👎Deprecated: Redefine this based on the Visit
and VisitChildren
methods.
pub fn visit_columns_mut<F>(&mut self, depth: usize, f: &mut F)where
F: FnMut(usize, &mut ColumnRef),
Visit
and VisitChildren
methods.Like visit_columns
, but permits mutating the column references.
sourcepub fn bind_parameters(&mut self, params: &Params) -> Result<(), PlanError>
pub fn bind_parameters(&mut self, params: &Params) -> Result<(), PlanError>
Replaces any parameter references in the expression with the
corresponding datum from params
.
sourcepub fn splice_parameters(&mut self, params: &[HirScalarExpr], depth: usize)
pub fn splice_parameters(&mut self, params: &[HirScalarExpr], depth: usize)
See the documentation for HirScalarExpr::splice_parameters
.
sourcepub fn constant(rows: Vec<Vec<Datum<'_>>>, typ: RelationType) -> Self
pub fn constant(rows: Vec<Vec<Datum<'_>>>, typ: RelationType) -> Self
Constructs a constant collection from specific rows and schema.
pub fn finish(&mut self, finishing: RowSetFinishing)
source§impl HirRelationExpr
impl HirRelationExpr
sourcepub fn lower(self) -> Result<MirRelationExpr, PlanError>
pub fn lower(self) -> Result<MirRelationExpr, PlanError>
Rewrite self
into a mz_expr::MirRelationExpr
.
This requires rewriting all correlated subqueries (nested HirRelationExpr
s) into flat queries
sourcefn applied_to(
self,
id_gen: &mut IdGen,
get_outer: MirRelationExpr,
col_map: &ColumnMap,
cte_map: &mut BTreeMap<LocalId, CteDesc>
) -> Result<MirRelationExpr, PlanError>
fn applied_to(
self,
id_gen: &mut IdGen,
get_outer: MirRelationExpr,
col_map: &ColumnMap,
cte_map: &mut BTreeMap<LocalId, CteDesc>
) -> Result<MirRelationExpr, PlanError>
Return a mz_expr::MirRelationExpr
which evaluates self
once for each row of get_outer
.
For uncorrelated self
, this should be the cross-product between get_outer
and self
.
When self
references columns of get_outer
, much more work needs to occur.
The col_map
argument contains mappings to some of the columns of get_outer
, though
perhaps not all of them. It should be used as the basis of resolving column references,
but care must be taken when adding new columns that get_outer.arity()
is where they
will start, rather than any function of col_map
.
The get_outer
expression should be a Get
with no duplicate rows, describing the distinct
assignment of values to outer rows.
source§impl HirRelationExpr
impl HirRelationExpr
sourcepub fn optimize_and_lower(
self,
_config: &OptimizerConfig
) -> Result<MirRelationExpr, PlanError>
pub fn optimize_and_lower(
self,
_config: &OptimizerConfig
) -> Result<MirRelationExpr, PlanError>
Perform optimizing algebraic rewrites on this HirRelationExpr
and lower it to a mz_expr::MirRelationExpr
.
The optimization path is fully-determined by the values of the feature flag defined in the OptimizerConfig
.
Trait Implementations§
source§impl Clone for HirRelationExpr
impl Clone for HirRelationExpr
source§fn clone(&self) -> HirRelationExpr
fn clone(&self) -> HirRelationExpr
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for HirRelationExpr
impl Debug for HirRelationExpr
source§impl<'de> Deserialize<'de> for HirRelationExpr
impl<'de> Deserialize<'de> for HirRelationExpr
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 DisplayText<PlanRenderingContext<'_, HirRelationExpr>> for HirRelationExpr
impl DisplayText<PlanRenderingContext<'_, HirRelationExpr>> for HirRelationExpr
fn fmt_text(
&self,
f: &mut Formatter<'_>,
ctx: &mut PlanRenderingContext<'_, HirRelationExpr>
) -> Result
source§impl<'a> Explain<'a> for HirRelationExpr
impl<'a> Explain<'a> for HirRelationExpr
§type Context = ExplainContext<'a>
type Context = ExplainContext<'a>
§type Text = ExplainSinglePlan<'a, HirRelationExpr>
type Text = ExplainSinglePlan<'a, HirRelationExpr>
Explain::explain_text
call.§type Json = ExplainSinglePlan<'a, HirRelationExpr>
type Json = ExplainSinglePlan<'a, HirRelationExpr>
Explain::explain_json
call.§type Dot = UnsupportedFormat
type Dot = UnsupportedFormat
Explain::explain_json
call.source§fn explain_text(
&'a mut self,
context: &'a Self::Context
) -> Result<Self::Text, ExplainError>
fn explain_text(
&'a mut self,
context: &'a Self::Context
) -> Result<Self::Text, ExplainError>
source§fn explain_json(
&'a mut self,
context: &'a Self::Context
) -> Result<Self::Json, ExplainError>
fn explain_json(
&'a mut self,
context: &'a Self::Context
) -> Result<Self::Json, ExplainError>
source§fn explain(
&'a mut self,
format: &'a ExplainFormat,
context: &'a Self::Context
) -> Result<String, ExplainError>
fn explain(
&'a mut self,
format: &'a ExplainFormat,
context: &'a Self::Context
) -> Result<String, ExplainError>
source§fn explain_dot(
&'a mut self,
context: &'a Self::Context
) -> Result<Self::Dot, ExplainError>
fn explain_dot(
&'a mut self,
context: &'a Self::Context
) -> Result<Self::Dot, ExplainError>
source§impl Hash for HirRelationExpr
impl Hash for HirRelationExpr
source§impl Ord for HirRelationExpr
impl Ord for HirRelationExpr
source§fn cmp(&self, other: &HirRelationExpr) -> Ordering
fn cmp(&self, other: &HirRelationExpr) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl PartialEq<HirRelationExpr> for HirRelationExpr
impl PartialEq<HirRelationExpr> for HirRelationExpr
source§fn eq(&self, other: &HirRelationExpr) -> bool
fn eq(&self, other: &HirRelationExpr) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl PartialOrd<HirRelationExpr> for HirRelationExpr
impl PartialOrd<HirRelationExpr> for HirRelationExpr
source§fn partial_cmp(&self, other: &HirRelationExpr) -> Option<Ordering>
fn partial_cmp(&self, other: &HirRelationExpr) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moresource§impl Serialize for HirRelationExpr
impl Serialize for HirRelationExpr
source§impl VisitChildren<HirRelationExpr> for HirRelationExpr
impl VisitChildren<HirRelationExpr> for HirRelationExpr
source§fn visit_children<F>(&self, f: F)where
F: FnMut(&Self),
fn visit_children<F>(&self, f: F)where
F: FnMut(&Self),
f
to each direct child.source§fn visit_mut_children<F>(&mut self, f: F)where
F: FnMut(&mut Self),
fn visit_mut_children<F>(&mut self, f: F)where
F: FnMut(&mut Self),
f
to each direct child.source§impl VisitChildren<HirScalarExpr> for HirRelationExpr
impl VisitChildren<HirScalarExpr> for HirRelationExpr
source§fn visit_children<F>(&self, f: F)where
F: FnMut(&HirScalarExpr),
fn visit_children<F>(&self, f: F)where
F: FnMut(&HirScalarExpr),
f
to each direct child.source§fn visit_mut_children<F>(&mut self, f: F)where
F: FnMut(&mut HirScalarExpr),
fn visit_mut_children<F>(&mut self, f: F)where
F: FnMut(&mut HirScalarExpr),
f
to each direct child.source§fn try_visit_children<F, E>(&self, f: F) -> Result<(), E>where
F: FnMut(&HirScalarExpr) -> Result<(), E>,
E: From<RecursionLimitError>,
fn try_visit_children<F, E>(&self, f: F) -> Result<(), E>where
F: FnMut(&HirScalarExpr) -> Result<(), E>,
E: From<RecursionLimitError>,
f
to each direct child. Read moresource§fn try_visit_mut_children<F, E>(&mut self, f: F) -> Result<(), E>where
F: FnMut(&mut HirScalarExpr) -> Result<(), E>,
E: From<RecursionLimitError>,
fn try_visit_mut_children<F, E>(&mut self, f: F) -> Result<(), E>where
F: FnMut(&mut HirScalarExpr) -> Result<(), E>,
E: From<RecursionLimitError>,
f
to each direct child. Read moreimpl Eq for HirRelationExpr
impl StructuralEq for HirRelationExpr
impl StructuralPartialEq for HirRelationExpr
Auto Trait Implementations§
impl RefUnwindSafe for HirRelationExpr
impl Send for HirRelationExpr
impl Sync for HirRelationExpr
impl Unpin for HirRelationExpr
impl UnwindSafe for HirRelationExpr
Blanket Implementations§
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
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> Pointable for T
impl<T> Pointable 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<T> Visit for Twhere
T: VisitChildren<T>,
impl<T> Visit for Twhere
T: VisitChildren<T>,
source§fn visit_post<F>(&self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&T),
fn visit_post<F>(&self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&T),
self
.source§fn visit_post_nolimit<F>(&self, f: &mut F)where
F: FnMut(&T),
fn visit_post_nolimit<F>(&self, f: &mut F)where
F: FnMut(&T),
visit_post
instead.self
.
Does not enforce a recursion limit.source§fn visit_mut_post<F>(&mut self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&mut T),
fn visit_mut_post<F>(&mut self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&mut T),
self
.source§fn visit_mut_post_nolimit<F>(&mut self, f: &mut F)where
F: FnMut(&mut T),
fn visit_mut_post_nolimit<F>(&mut self, f: &mut F)where
F: FnMut(&mut T),
visit_mut_post
instead.self
.
Does not enforce a recursion limit.source§fn try_visit_post<F, E>(&self, f: &mut F) -> Result<(), E>where
F: FnMut(&T) -> Result<(), E>,
E: From<RecursionLimitError>,
fn try_visit_post<F, E>(&self, f: &mut F) -> Result<(), E>where
F: FnMut(&T) -> Result<(), E>,
E: From<RecursionLimitError>,
self
.source§fn try_visit_mut_post<F, E>(&mut self, f: &mut F) -> Result<(), E>where
F: FnMut(&mut T) -> Result<(), E>,
E: From<RecursionLimitError>,
fn try_visit_mut_post<F, E>(&mut self, f: &mut F) -> Result<(), E>where
F: FnMut(&mut T) -> Result<(), E>,
E: From<RecursionLimitError>,
self
.source§fn visit_pre<F>(&self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&T),
fn visit_pre<F>(&self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&T),
self
.source§fn visit_pre_with_context<Context, AccFun, Visitor>(
&self,
init: Context,
acc_fun: &mut AccFun,
visitor: &mut Visitor
) -> Result<(), RecursionLimitError>where
Context: Clone,
AccFun: FnMut(Context, &T) -> Context,
Visitor: FnMut(&Context, &T),
fn visit_pre_with_context<Context, AccFun, Visitor>(
&self,
init: Context,
acc_fun: &mut AccFun,
visitor: &mut Visitor
) -> Result<(), RecursionLimitError>where
Context: Clone,
AccFun: FnMut(Context, &T) -> Context,
Visitor: FnMut(&Context, &T),
self
, which also accumulates context
information along the path from the root to the current node’s parent.
acc_fun
is a similar closure as in fold
. The accumulated context is passed to the
visitor, along with the current node. Read moresource§fn visit_pre_nolimit<F>(&self, f: &mut F)where
F: FnMut(&T),
fn visit_pre_nolimit<F>(&self, f: &mut F)where
F: FnMut(&T),
visit_pre
instead.self
.
Does not enforce a recursion limit.source§fn visit_mut_pre<F>(&mut self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&mut T),
fn visit_mut_pre<F>(&mut self, f: &mut F) -> Result<(), RecursionLimitError>where
F: FnMut(&mut T),
self
.source§fn visit_mut_pre_nolimit<F>(&mut self, f: &mut F)where
F: FnMut(&mut T),
fn visit_mut_pre_nolimit<F>(&mut self, f: &mut F)where
F: FnMut(&mut T),
visit_mut_pre
instead.self
.
Does not enforce a recursion limit.source§fn try_visit_pre<F, E>(&self, f: &mut F) -> Result<(), E>where
F: FnMut(&T) -> Result<(), E>,
E: From<RecursionLimitError>,
fn try_visit_pre<F, E>(&self, f: &mut F) -> Result<(), E>where
F: FnMut(&T) -> Result<(), E>,
E: From<RecursionLimitError>,
self
.source§fn try_visit_mut_pre<F, E>(&mut self, f: &mut F) -> Result<(), E>where
F: FnMut(&mut T) -> Result<(), E>,
E: From<RecursionLimitError>,
fn try_visit_mut_pre<F, E>(&mut self, f: &mut F) -> Result<(), E>where
F: FnMut(&mut T) -> Result<(), E>,
E: From<RecursionLimitError>,
self
.source§fn visit_pre_post<F1, F2>(
&self,
pre: &mut F1,
post: &mut F2
) -> Result<(), RecursionLimitError>where
F1: FnMut(&T) -> Option<Vec<&T, Global>>,
F2: FnMut(&T),
fn visit_pre_post<F1, F2>(
&self,
pre: &mut F1,
post: &mut F2
) -> Result<(), RecursionLimitError>where
F1: FnMut(&T) -> Option<Vec<&T, Global>>,
F2: FnMut(&T),
source§fn visit_pre_post_nolimit<F1, F2>(&self, pre: &mut F1, post: &mut F2)where
F1: FnMut(&T) -> Option<Vec<&T, Global>>,
F2: FnMut(&T),
fn visit_pre_post_nolimit<F1, F2>(&self, pre: &mut F1, post: &mut F2)where
F1: FnMut(&T) -> Option<Vec<&T, Global>>,
F2: FnMut(&T),
visit
instead.Visit::visit_pre
and Visit::visit_post
.
Does not enforce a recursion limit. Read moresource§fn visit_mut_pre_post<F1, F2>(
&mut self,
pre: &mut F1,
post: &mut F2
) -> Result<(), RecursionLimitError>where
F1: FnMut(&mut T) -> Option<Vec<&mut T, Global>>,
F2: FnMut(&mut T),
fn visit_mut_pre_post<F1, F2>(
&mut self,
pre: &mut F1,
post: &mut F2
) -> Result<(), RecursionLimitError>where
F1: FnMut(&mut T) -> Option<Vec<&mut T, Global>>,
F2: FnMut(&mut T),
visit_mut
instead.source§fn visit_mut_pre_post_nolimit<F1, F2>(&mut self, pre: &mut F1, post: &mut F2)where
F1: FnMut(&mut T) -> Option<Vec<&mut T, Global>>,
F2: FnMut(&mut T),
fn visit_mut_pre_post_nolimit<F1, F2>(&mut self, pre: &mut F1, post: &mut F2)where
F1: FnMut(&mut T) -> Option<Vec<&mut T, Global>>,
F2: FnMut(&mut T),
visit_mut_pre_post
instead.Visit::visit_mut_pre
and Visit::visit_mut_post
.
Does not enforce a recursion limit. Read more