pub struct LogicalJoin {
pub base: PlanBase<Logical>,
core: Join<PlanRef>,
}
Expand description
LogicalJoin
combines two relations according to some condition.
Each output row has fields from the left and right inputs. The set of output rows is a subset of the cartesian product of the two inputs; precisely which subset depends on the join condition. In addition, the output columns are a subset of the columns of the left and right columns, dependent on the output indices provided. A repeat output index is illegal.
Fields§
§base: PlanBase<Logical>
§core: Join<PlanRef>
Implementations§
source§impl LogicalJoin
impl LogicalJoin
pub(crate) fn new( left: PlanRef, right: PlanRef, join_type: JoinType, on: Condition, ) -> Self
pub(crate) fn with_output_indices( left: PlanRef, right: PlanRef, join_type: JoinType, on: Condition, output_indices: Vec<usize>, ) -> Self
pub fn with_core(core: Join<PlanRef>) -> Self
pub fn create( left: PlanRef, right: PlanRef, join_type: JoinType, on_clause: ExprImpl, ) -> PlanRef
pub fn internal_column_num(&self) -> usize
pub fn i2l_col_mapping_ignore_join_type(&self) -> ColIndexMapping
pub fn i2r_col_mapping_ignore_join_type(&self) -> ColIndexMapping
sourcepub fn input_idx_on_condition(&self) -> (Vec<usize>, Vec<usize>)
pub fn input_idx_on_condition(&self) -> (Vec<usize>, Vec<usize>)
Collect all input ref in the on condition. And separate them into left and right.
sourcepub fn eq_indexes(&self) -> Vec<(usize, usize)>
pub fn eq_indexes(&self) -> Vec<(usize, usize)>
Get the eq join key of the logical join.
sourcepub fn output_indices(&self) -> &Vec<usize>
pub fn output_indices(&self) -> &Vec<usize>
Get the output indices of the logical join.
sourcepub fn clone_with_output_indices(&self, output_indices: Vec<usize>) -> Self
pub fn clone_with_output_indices(&self, output_indices: Vec<usize>) -> Self
Clone with new output indices
sourcepub fn clone_with_cond(&self, on: Condition) -> Self
pub fn clone_with_cond(&self, on: Condition) -> Self
Clone with new on
condition
pub fn is_left_join(&self) -> bool
pub fn is_right_join(&self) -> bool
pub fn is_full_out(&self) -> bool
pub fn output_indices_are_trivial(&self) -> bool
sourcefn simplify_outer(
predicate: &Condition,
left_col_num: usize,
join_type: JoinType,
) -> JoinType
fn simplify_outer( predicate: &Condition, left_col_num: usize, join_type: JoinType, ) -> JoinType
Try to simplify the outer join with the predicate on the top of the join
now it is just a naive implementation for comparison expression, we can give a more general implementation with constant folding in future
sourcefn to_batch_lookup_join_with_index_selection(
&self,
predicate: EqJoinPredicate,
logical_join: Join<PlanRef>,
) -> Option<BatchLookupJoin>
fn to_batch_lookup_join_with_index_selection( &self, predicate: EqJoinPredicate, logical_join: Join<PlanRef>, ) -> Option<BatchLookupJoin>
Index Join: Try to convert logical join into batch lookup join and meanwhile it will do the index selection for the lookup table so that we can benefit from indexes.
sourcefn to_batch_lookup_join(
&self,
predicate: EqJoinPredicate,
logical_join: Join<PlanRef>,
) -> Option<BatchLookupJoin>
fn to_batch_lookup_join( &self, predicate: EqJoinPredicate, logical_join: Join<PlanRef>, ) -> Option<BatchLookupJoin>
Try to convert logical join into batch lookup join.
pub fn decompose(self) -> (PlanRef, PlanRef, Condition, JoinType, Vec<usize>)
source§impl LogicalJoin
impl LogicalJoin
fn get_stream_input_for_hash_join( &self, predicate: &EqJoinPredicate, ctx: &mut ToStreamContext, ) -> Result<(PlanRef, PlanRef), RwError>
fn to_stream_hash_join( &self, predicate: EqJoinPredicate, ctx: &mut ToStreamContext, ) -> Result<PlanRef, RwError>
fn should_be_temporal_join(&self) -> bool
fn to_stream_temporal_join_with_index_selection( &self, predicate: EqJoinPredicate, ctx: &mut ToStreamContext, ) -> Result<StreamTemporalJoin, RwError>
fn check_temporal_rhs(right: &PlanRef) -> Result<&LogicalScan, RwError>
fn temporal_join_scan_predicate_pull_up( logical_scan: &LogicalScan, predicate: EqJoinPredicate, output_indices: &[usize], left_schema_len: usize, ) -> Result<(StreamTableScan, EqJoinPredicate, Condition, Vec<usize>), RwError>
fn to_stream_temporal_join( &self, predicate: EqJoinPredicate, ctx: &mut ToStreamContext, ) -> Result<StreamTemporalJoin, RwError>
fn to_stream_nested_loop_temporal_join( &self, predicate: EqJoinPredicate, ctx: &mut ToStreamContext, ) -> Result<StreamTemporalJoin, RwError>
fn to_stream_dynamic_filter( &self, predicate: Condition, ctx: &mut ToStreamContext, ) -> Result<Option<PlanRef>, RwError>
pub fn index_lookup_join_to_batch_lookup_join(&self) -> Result<PlanRef, RwError>
fn to_stream_asof_join( &self, predicate: EqJoinPredicate, ctx: &mut ToStreamContext, ) -> Result<StreamAsOfJoin, RwError>
Methods from Deref<Target = PlanBase<Logical>>§
pub fn clone_with_new_plan_id(&self) -> Self
sourcepub fn clone_with_new_distribution(&self, dist: Distribution) -> Self
pub fn clone_with_new_distribution(&self, dist: Distribution) -> Self
Clone the plan node with a new distribution.
Panics if the plan node is not physical.
Trait Implementations§
source§impl Clone for LogicalJoin
impl Clone for LogicalJoin
source§fn clone(&self) -> LogicalJoin
fn clone(&self) -> LogicalJoin
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl ColPrunable for LogicalJoin
impl ColPrunable for LogicalJoin
source§impl Debug for LogicalJoin
impl Debug for LogicalJoin
source§impl Deref for LogicalJoin
impl Deref for LogicalJoin
source§impl Distill for LogicalJoin
impl Distill for LogicalJoin
source§impl ExprRewritable for LogicalJoin
impl ExprRewritable for LogicalJoin
fn has_rewritable_expr(&self) -> bool
fn rewrite_exprs(&self, r: &mut dyn ExprRewriter) -> PlanRef
source§impl ExprVisitable for LogicalJoin
impl ExprVisitable for LogicalJoin
fn visit_exprs(&self, v: &mut dyn ExprVisitor)
source§impl Hash for LogicalJoin
impl Hash for LogicalJoin
source§impl PartialEq for LogicalJoin
impl PartialEq for LogicalJoin
source§impl PlanNodeMeta for LogicalJoin
impl PlanNodeMeta for LogicalJoin
const NODE_TYPE: PlanNodeType = PlanNodeType::LogicalJoin
type Convention = Logical
source§fn plan_base(&self) -> &PlanBase<Logical>
fn plan_base(&self) -> &PlanBase<Logical>
PlanBase
with corresponding convention.source§fn plan_base_ref(&self) -> PlanBaseRef<'_>
fn plan_base_ref(&self) -> PlanBaseRef<'_>
source§impl PlanTreeNode for LogicalJoin
impl PlanTreeNode for LogicalJoin
source§impl PlanTreeNodeBinary for LogicalJoin
impl PlanTreeNodeBinary for LogicalJoin
fn left(&self) -> PlanRef
fn right(&self) -> PlanRef
fn clone_with_left_right(&self, left: PlanRef, right: PlanRef) -> Self
source§fn rewrite_with_left_right(
&self,
left: PlanRef,
left_col_change: ColIndexMapping,
right: PlanRef,
right_col_change: ColIndexMapping,
) -> (Self, ColIndexMapping)
fn rewrite_with_left_right( &self, left: PlanRef, left_col_change: ColIndexMapping, right: PlanRef, right_col_change: ColIndexMapping, ) -> (Self, ColIndexMapping)
source§impl PredicatePushdown for LogicalJoin
impl PredicatePushdown for LogicalJoin
source§fn predicate_pushdown(
&self,
predicate: Condition,
ctx: &mut PredicatePushdownContext,
) -> PlanRef
fn predicate_pushdown( &self, predicate: Condition, ctx: &mut PredicatePushdownContext, ) -> PlanRef
Pushes predicates above and within a join node into the join node and/or its children nodes.
§Which predicates can be pushed
For inner join, we can do all kinds of pushdown.
For left/right semi join, we can push filter to left/right and on-clause, and push on-clause to left/right.
For left/right anti join, we can push filter to left/right, but on-clause can not be pushed
§Outer Join
Preserved Row table : The table in an Outer Join that must return all rows.
Null Supplying table : This is the table that has nulls filled in for its columns in unmatched rows.
Preserved Row table | Null Supplying table | |
---|---|---|
Join predicate (on) | Not Pushed | Pushed |
Where predicate (filter) | Pushed | Not Pushed |
source§impl ToBatch for LogicalJoin
impl ToBatch for LogicalJoin
source§impl ToDistributedBatch for LogicalJoin
impl ToDistributedBatch for LogicalJoin
source§fn to_distributed(&self) -> Result<PlanRef, RwError>
fn to_distributed(&self) -> Result<PlanRef, RwError>
to_distributed
is equivalent to to_distributed_with_required(&Order::any(), &RequiredDist::Any)
source§fn to_distributed_with_required(
&self,
required_order: &Order,
required_dist: &RequiredDist,
) -> Result<PlanRef, RwError>
fn to_distributed_with_required( &self, required_order: &Order, required_dist: &RequiredDist, ) -> Result<PlanRef, RwError>
source§impl ToLocalBatch for LogicalJoin
impl ToLocalBatch for LogicalJoin
source§impl ToStream for LogicalJoin
impl ToStream for LogicalJoin
source§fn to_stream(&self, ctx: &mut ToStreamContext) -> Result<PlanRef, RwError>
fn to_stream(&self, ctx: &mut ToStreamContext) -> Result<PlanRef, RwError>
to_stream
is equivalent to to_stream_with_dist_required(RequiredDist::Any)
source§fn logical_rewrite_for_stream(
&self,
ctx: &mut RewriteStreamContext,
) -> Result<(PlanRef, ColIndexMapping), RwError>
fn logical_rewrite_for_stream( &self, ctx: &mut RewriteStreamContext, ) -> Result<(PlanRef, ColIndexMapping), RwError>
logical_rewrite_for_stream
will rewrite the logical node, and return (new_plan_node
,
col_mapping
), the col_mapping
is for original columns have been changed into some other
position. Read moresource§fn to_stream_with_dist_required(
&self,
required_dist: &RequiredDist,
ctx: &mut ToStreamContext,
) -> Result<PlanRef, RwError>
fn to_stream_with_dist_required( &self, required_dist: &RequiredDist, ctx: &mut ToStreamContext, ) -> Result<PlanRef, RwError>
source§impl TryToBatchPb for LogicalJoin
impl TryToBatchPb for LogicalJoin
fn try_to_batch_prost_body(&self) -> Result<NodeBody, SchedulerError>
source§impl TryToStreamPb for LogicalJoin
impl TryToStreamPb for LogicalJoin
fn try_to_stream_prost_body( &self, _state: &mut BuildFragmentGraphState, ) -> Result<NodeBody, SchedulerError>
impl Eq for LogicalJoin
impl PlanNode for LogicalJoin
impl StructuralPartialEq for LogicalJoin
impl ToPb for LogicalJoin
Auto Trait Implementations§
impl Freeze for LogicalJoin
impl !RefUnwindSafe for LogicalJoin
impl !Send for LogicalJoin
impl !Sync for LogicalJoin
impl Unpin for LogicalJoin
impl !UnwindSafe for LogicalJoin
Blanket Implementations§
source§impl<P> AnyPlanNodeMeta for Pwhere
P: PlanNodeMeta,
impl<P> AnyPlanNodeMeta for Pwhere
P: PlanNodeMeta,
fn node_type(&self) -> PlanNodeType
fn plan_base(&self) -> PlanBaseRef<'_>
fn convention(&self) -> Convention
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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<T> Conv for T
impl<T> Conv for T
§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§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§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§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> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§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> 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> 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 moresource§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
§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
type Err = Infallible
fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>
§impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
source§impl<M> MetricVecRelabelExt for M
impl<M> MetricVecRelabelExt for M
source§fn relabel(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level
.source§fn relabel_n(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
relabel_num: usize,
) -> RelabeledMetricVec<M>
fn relabel_n( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, relabel_num: usize, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
.source§fn relabel_debug_1(
self,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel_debug_1( self, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
with metric_level
set to
MetricLevel::Debug
and relabel_num
set to 1.§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<Source> Sculptor<HNil, HNil> for Source
impl<Source> Sculptor<HNil, HNil> for Source
§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.