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 node
  • tnr: 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 node
  • tnr: TreeNodeRecursion specifying how the recursion ended.

See also

§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>

source

pub fn new(data: T, transformed: bool, tnr: TreeNodeRecursion) -> Transformed<T>

Create a new Transformed object with the given information.

source

pub fn new_transformed(data: T, transformed: bool) -> Transformed<T>

Create a Transformed with transformed and [TreeNodeRecursion::Continue`].

source

pub fn yes(data: T) -> Transformed<T>

Wrapper for transformed data with TreeNodeRecursion::Continue statement.

source

pub fn no(data: T) -> Transformed<T>

Wrapper for unchanged data with TreeNodeRecursion::Continue statement.

source

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.

source

pub fn map_data<U, F>(self, f: F) -> Result<Transformed<U>, DataFusionError>
where F: FnOnce(T) -> Result<U, DataFusionError>,

Applies a fallible f (returns Result) to the data of this Transformed object, without modifying the transformed flag.

source

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.

source

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.

source

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.

source

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,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<T> PartialEq for Transformed<T>
where T: PartialEq,

source§

fn eq(&self, other: &Transformed<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,