Struct datafusion::common::tree_node::Transformed
source · pub struct Transformed<T> {
pub data: T,
pub transformed: bool,
pub tnr: TreeNodeRecursion,
}
Expand description
Result of tree walk / transformation APIs
Transformed
is a wrapper around the tree node data (e.g. Expr
or
LogicalPlan
). It is used to indicate whether the node was transformed
and how the recursion should proceed.
TreeNode
API users control the transformation by returning:
- The resulting (possibly transformed) node,
transformed
: flag indicating whether any change was made to the nodetnr
:TreeNodeRecursion
specifying how to proceed with the recursion.
At the end of the transformation, the return value will contain:
- The final (possibly transformed) tree,
transformed
: flag indicating whether any change was made to the nodetnr
:TreeNodeRecursion
specifying how the recursion ended.
See also
Transformed::update_data
to modify the node without changing thetransformed
flagTransformed::map_data
for fallable operation that return the same typeTransformed::transform_data
to chain fallable transformationsTransformedResult
for working withResult<Transformed<U>>
§Examples
Use Transformed::yes
and Transformed::no
to signal that a node was
rewritten and the recursion should continue:
let expr = orig_expr();
// Create a new `Transformed` object signaling the node was not rewritten
let ret = Transformed::no(expr.clone());
assert!(!ret.transformed);
// Create a new `Transformed` object signaling the node was rewritten
let ret = Transformed::yes(expr);
assert!(ret.transformed)
Access the node within the Transformed
object:
let expr = orig_expr();
// `Transformed` object signaling the node was not rewritten
let ret = Transformed::no(expr.clone());
// Access the inner object using .data
assert_eq!(expr, ret.data);
Transform the node within the Transformed
object.
let expr = orig_expr();
let ret = Transformed::no(expr.clone())
.transform_data(|expr| {
// closure returns a result and potentially transforms the node
// in this example, it does transform the node
let new_expr = make_new_expr(expr);
Ok(Transformed::yes(new_expr))
}).unwrap();
// transformed flag is the union of the original ans closure's transformed flag
assert!(ret.transformed);
§Example APIs that use TreeNode
Fields§
§data: T
§transformed: bool
§tnr: TreeNodeRecursion
Implementations§
source§impl<T> Transformed<T>
impl<T> Transformed<T>
sourcepub fn new(data: T, transformed: bool, tnr: TreeNodeRecursion) -> Transformed<T>
pub fn new(data: T, transformed: bool, tnr: TreeNodeRecursion) -> Transformed<T>
Create a new Transformed
object with the given information.
sourcepub fn new_transformed(data: T, transformed: bool) -> Transformed<T>
pub fn new_transformed(data: T, transformed: bool) -> Transformed<T>
Create a Transformed
with transformed and [
TreeNodeRecursion::Continue`].
sourcepub fn yes(data: T) -> Transformed<T>
pub fn yes(data: T) -> Transformed<T>
Wrapper for transformed data with TreeNodeRecursion::Continue
statement.
sourcepub fn no(data: T) -> Transformed<T>
pub fn no(data: T) -> Transformed<T>
Wrapper for unchanged data with TreeNodeRecursion::Continue
statement.
sourcepub fn update_data<U, F>(self, f: F) -> Transformed<U>where
F: FnOnce(T) -> U,
pub fn update_data<U, F>(self, f: F) -> Transformed<U>where
F: FnOnce(T) -> U,
Applies an infallible f
to the data of this Transformed
object,
without modifying the transformed
flag.
sourcepub fn map_data<U, F>(self, f: F) -> Result<Transformed<U>, DataFusionError>
pub fn map_data<U, F>(self, f: F) -> Result<Transformed<U>, DataFusionError>
Applies a fallible f
(returns Result
) to the data of this
Transformed
object, without modifying the transformed
flag.
sourcepub fn transform_data<U, F>(
self,
f: F,
) -> Result<Transformed<U>, DataFusionError>
pub fn transform_data<U, F>( self, f: F, ) -> Result<Transformed<U>, DataFusionError>
Applies a fallible transforming f
to the data of this Transformed
object.
The returned Transformed
object has the transformed
flag set if either
self
or the return value of f
have the transformed
flag set.
sourcepub fn transform_children<F>(
self,
f: F,
) -> Result<Transformed<T>, DataFusionError>
pub fn transform_children<F>( self, f: F, ) -> Result<Transformed<T>, DataFusionError>
Maps the Transformed
object to the result of the given f
depending on the
current TreeNodeRecursion
value and the fact that f
is changing the current
node’s children.
sourcepub fn transform_sibling<F>(
self,
f: F,
) -> Result<Transformed<T>, DataFusionError>
pub fn transform_sibling<F>( self, f: F, ) -> Result<Transformed<T>, DataFusionError>
Maps the Transformed
object to the result of the given f
depending on the
current TreeNodeRecursion
value and the fact that f
is changing the current
node’s sibling.
sourcepub fn transform_parent<F>(
self,
f: F,
) -> Result<Transformed<T>, DataFusionError>
pub fn transform_parent<F>( self, f: F, ) -> Result<Transformed<T>, DataFusionError>
Maps the Transformed
object to the result of the given f
depending on the
current TreeNodeRecursion
value and the fact that f
is changing the current
node’s parent.
Trait Implementations§
source§impl<T> Debug for Transformed<T>where
T: Debug,
impl<T> Debug for Transformed<T>where
T: Debug,
source§impl<T> PartialEq for Transformed<T>where
T: PartialEq,
impl<T> PartialEq for Transformed<T>where
T: PartialEq,
impl<T> StructuralPartialEq for Transformed<T>
Auto Trait Implementations§
impl<T> Freeze for Transformed<T>where
T: Freeze,
impl<T> RefUnwindSafe for Transformed<T>where
T: RefUnwindSafe,
impl<T> Send for Transformed<T>where
T: Send,
impl<T> Sync for Transformed<T>where
T: Sync,
impl<T> Unpin for Transformed<T>where
T: Unpin,
impl<T> UnwindSafe for Transformed<T>where
T: UnwindSafe,
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> 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