MCPcopy Create free account
hub / github.com/apache/datafusion / rewrite

Method rewrite

datafusion/optimizer/src/eliminate_cross_join.rs:83–203  ·  view source on GitHub ↗
(
        &self,
        plan: LogicalPlan,
        config: &dyn OptimizerConfig,
    )

Source from the content-addressed store, hash-verified

81
82 #[cfg_attr(feature = "recursive_protection", recursive::recursive)]
83 fn rewrite(
84 &self,
85 plan: LogicalPlan,
86 config: &dyn OptimizerConfig,
87 ) -> Result<Transformed<LogicalPlan>> {
88 let plan_schema = Arc::clone(plan.schema());
89 let mut possible_join_keys = JoinKeySet::new();
90 let mut all_inputs: Vec<LogicalPlan> = vec![];
91 let mut all_filters: Vec<Expr> = vec![];
92 let mut null_equality = NullEquality::NullEqualsNothing;
93
94 let parent_predicate = if let LogicalPlan::Filter(filter) = plan {
95 // if input isn't a join that can potentially be rewritten
96 // avoid unwrapping the input
97 let rewritable = matches!(
98 filter.input.as_ref(),
99 LogicalPlan::Join(Join {
100 join_type: JoinType::Inner,
101 ..
102 })
103 );
104
105 if !rewritable {
106 // recursively try to rewrite children
107 return rewrite_children(self, LogicalPlan::Filter(filter), config);
108 }
109
110 if !can_flatten_join_inputs(&filter.input) {
111 return Ok(Transformed::no(LogicalPlan::Filter(filter)));
112 }
113
114 let Filter {
115 input, predicate, ..
116 } = filter;
117
118 // Extract null_equality setting from the input join
119 if let LogicalPlan::Join(join) = input.as_ref() {
120 null_equality = join.null_equality;
121 }
122
123 flatten_join_inputs(
124 Arc::unwrap_or_clone(input),
125 &mut possible_join_keys,
126 &mut all_inputs,
127 &mut all_filters,
128 )?;
129
130 extract_possible_join_keys(&predicate, &mut possible_join_keys);
131 Some(predicate)
132 } else {
133 match plan {
134 LogicalPlan::Join(Join {
135 join_type: JoinType::Inner,
136 null_equality: original_null_equality,
137 ..
138 }) => {
139 if !can_flatten_join_inputs(&plan) {
140 return Ok(Transformed::no(plan));

Callers 2

rewrite_childrenFunction · 0.45

Calls 15

newFunction · 0.85
rewrite_childrenFunction · 0.85
can_flatten_join_inputsFunction · 0.85
flatten_join_inputsFunction · 0.85
find_inner_joinFunction · 0.85
ProjectionClass · 0.85
remove_join_expressionsFunction · 0.85
FilterClass · 0.50
schemaMethod · 0.45
as_refMethod · 0.45
removeMethod · 0.45

Tested by 1