Skip to content

Commit 9918991

Browse files
andygrovegandronchik
authored andcommitted
Remove ExecutionProps dependency from OptimizerRule (apache#2666)
1 parent 3c31339 commit 9918991

File tree

13 files changed

+253
-144
lines changed

13 files changed

+253
-144
lines changed

datafusion/core/src/execution/context.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ use crate::logical_plan::{
6868
use crate::optimizer::common_subexpr_eliminate::CommonSubexprEliminate;
6969
use crate::optimizer::filter_push_down::FilterPushDown;
7070
use crate::optimizer::limit_push_down::LimitPushDown;
71-
use crate::optimizer::optimizer::OptimizerRule;
71+
use crate::optimizer::optimizer::{OptimizerConfig, OptimizerRule};
7272
use crate::optimizer::projection_push_down::ProjectionPushDown;
7373
use crate::optimizer::simplify_expressions::SimplifyExpressions;
7474
use crate::optimizer::single_distinct_to_groupby::SingleDistinctToGroupBy;
@@ -1258,15 +1258,17 @@ impl SessionState {
12581258

12591259
/// Optimizes the logical plan by applying optimizer rules.
12601260
pub fn optimize(&self, plan: &LogicalPlan) -> Result<LogicalPlan> {
1261-
let execution_props = &mut self.execution_props.clone();
1261+
let mut optimizer_config = OptimizerConfig::new();
1262+
optimizer_config.query_execution_start_time =
1263+
self.execution_props.query_execution_start_time;
12621264

12631265
if let LogicalPlan::Explain(e) = plan {
12641266
let mut stringified_plans = e.stringified_plans.clone();
12651267

12661268
// optimize the child plan, capturing the output of each optimizer
12671269
let plan = self.optimizer.optimize(
12681270
e.plan.as_ref(),
1269-
execution_props,
1271+
&optimizer_config,
12701272
|optimized_plan, optimizer| {
12711273
let optimizer_name = optimizer.name().to_string();
12721274
let plan_type = PlanType::OptimizedLogicalPlan { optimizer_name };
@@ -1281,7 +1283,7 @@ impl SessionState {
12811283
schema: e.schema.clone(),
12821284
}))
12831285
} else {
1284-
self.optimizer.optimize(plan, execution_props, |_, _| {})
1286+
self.optimizer.optimize(plan, &optimizer_config, |_, _| {})
12851287
}
12861288
}
12871289

datafusion/core/src/optimizer/common_subexpr_eliminate.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
//! Eliminate common sub-expression.
1919
2020
use crate::error::Result;
21-
use crate::execution::context::ExecutionProps;
2221
use crate::logical_plan::plan::{Filter, Projection, TableUDFs, Window};
2322
use crate::logical_plan::{
2423
col,
2524
plan::{Aggregate, Sort},
2625
DFField, DFSchema, Expr, ExprRewritable, ExprRewriter, ExprSchemable, ExprVisitable,
2726
ExpressionVisitor, LogicalPlan, Recursion, RewriteRecursion,
2827
};
28+
use crate::optimizer::optimizer::OptimizerConfig;
2929
use crate::optimizer::optimizer::OptimizerRule;
3030
use crate::optimizer::utils;
3131
use arrow::datatypes::DataType;
@@ -59,9 +59,9 @@ impl OptimizerRule for CommonSubexprEliminate {
5959
fn optimize(
6060
&self,
6161
plan: &LogicalPlan,
62-
execution_props: &ExecutionProps,
62+
optimizer_config: &OptimizerConfig,
6363
) -> Result<LogicalPlan> {
64-
optimize(plan, execution_props)
64+
optimize(plan, optimizer_config)
6565
}
6666

6767
fn name(&self) -> &str {
@@ -82,7 +82,10 @@ impl CommonSubexprEliminate {
8282
}
8383
}
8484

85-
fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<LogicalPlan> {
85+
fn optimize(
86+
plan: &LogicalPlan,
87+
optimizer_config: &OptimizerConfig,
88+
) -> Result<LogicalPlan> {
8689
let mut expr_set = ExprSet::new();
8790

8891
match plan {
@@ -100,7 +103,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
100103
input,
101104
&mut expr_set,
102105
schema,
103-
execution_props,
106+
optimizer_config,
104107
)?;
105108

106109
Ok(LogicalPlan::Projection(Projection {
@@ -123,7 +126,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
123126
input,
124127
&mut expr_set,
125128
schema,
126-
execution_props,
129+
optimizer_config,
127130
)?;
128131

129132
Ok(LogicalPlan::TableUDFs(TableUDFs {
@@ -156,7 +159,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
156159
input,
157160
&mut expr_set,
158161
input.schema(),
159-
execution_props,
162+
optimizer_config,
160163
)?;
161164

162165
Ok(LogicalPlan::Filter(Filter {
@@ -177,7 +180,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
177180
input,
178181
&mut expr_set,
179182
schema,
180-
execution_props,
183+
optimizer_config,
181184
)?;
182185

183186
Ok(LogicalPlan::Window(Window {
@@ -201,7 +204,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
201204
input,
202205
&mut expr_set,
203206
schema,
204-
execution_props,
207+
optimizer_config,
205208
)?;
206209
// note the reversed pop order.
207210
let new_aggr_expr = new_expr.pop().unwrap();
@@ -223,7 +226,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
223226
input,
224227
&mut expr_set,
225228
input.schema(),
226-
execution_props,
229+
optimizer_config,
227230
)?;
228231

229232
Ok(LogicalPlan::Sort(Sort {
@@ -253,7 +256,7 @@ fn optimize(plan: &LogicalPlan, execution_props: &ExecutionProps) -> Result<Logi
253256
let inputs = plan.inputs();
254257
let new_inputs = inputs
255258
.iter()
256-
.map(|input_plan| optimize(input_plan, execution_props))
259+
.map(|input_plan| optimize(input_plan, optimizer_config))
257260
.collect::<Result<Vec<_>>>()?;
258261

259262
utils::from_plan(plan, &expr, &new_inputs)
@@ -320,7 +323,7 @@ fn rewrite_expr(
320323
input: &LogicalPlan,
321324
expr_set: &mut ExprSet,
322325
schema: &DFSchema,
323-
execution_props: &ExecutionProps,
326+
optimizer_config: &OptimizerConfig,
324327
) -> Result<(Vec<Vec<Expr>>, LogicalPlan)> {
325328
let mut affected_id = HashSet::<Identifier>::new();
326329

@@ -345,7 +348,7 @@ fn rewrite_expr(
345348
})
346349
.collect::<Result<Vec<_>>>()?;
347350

348-
let mut new_input = optimize(input, execution_props)?;
351+
let mut new_input = optimize(input, optimizer_config)?;
349352
if !affected_id.is_empty() {
350353
new_input = build_project_plan(new_input, affected_id, expr_set)?;
351354
}
@@ -694,7 +697,7 @@ mod test {
694697
fn assert_optimized_plan_eq(plan: &LogicalPlan, expected: &str) {
695698
let optimizer = CommonSubexprEliminate {};
696699
let optimized_plan = optimizer
697-
.optimize(plan, &ExecutionProps::new())
700+
.optimize(plan, &OptimizerConfig::new())
698701
.expect("failed to optimize plan");
699702
let formatted_plan = format!("{:?}", optimized_plan);
700703
assert_eq!(formatted_plan, expected);

datafusion/core/src/optimizer/eliminate_filter.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::logical_plan::{EmptyRelation, LogicalPlan};
2727
use crate::optimizer::optimizer::OptimizerRule;
2828

2929
use super::utils;
30-
use crate::execution::context::ExecutionProps;
30+
use crate::optimizer::optimizer::OptimizerConfig;
3131

3232
/// Optimization rule that elimanate the scalar value (true/false) filter with an [LogicalPlan::EmptyRelation]
3333
#[derive(Default)]
@@ -44,7 +44,7 @@ impl OptimizerRule for EliminateFilter {
4444
fn optimize(
4545
&self,
4646
plan: &LogicalPlan,
47-
execution_props: &ExecutionProps,
47+
optimizer_config: &OptimizerConfig,
4848
) -> Result<LogicalPlan> {
4949
match plan {
5050
LogicalPlan::Filter(Filter {
@@ -65,7 +65,7 @@ impl OptimizerRule for EliminateFilter {
6565
let inputs = plan.inputs();
6666
let new_inputs = inputs
6767
.iter()
68-
.map(|plan| self.optimize(plan, execution_props))
68+
.map(|plan| self.optimize(plan, optimizer_config))
6969
.collect::<Result<Vec<_>>>()?;
7070

7171
utils::from_plan(plan, &plan.expressions(), &new_inputs)
@@ -88,7 +88,7 @@ mod tests {
8888
fn assert_optimized_plan_eq(plan: &LogicalPlan, expected: &str) {
8989
let rule = EliminateFilter::new();
9090
let optimized_plan = rule
91-
.optimize(plan, &ExecutionProps::new())
91+
.optimize(plan, &OptimizerConfig::new())
9292
.expect("failed to optimize plan");
9393
let formatted_plan = format!("{:?}", optimized_plan);
9494
assert_eq!(formatted_plan, expected);

datafusion/core/src/optimizer/eliminate_limit.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::logical_plan::{EmptyRelation, Limit, LogicalPlan};
2222
use crate::optimizer::optimizer::OptimizerRule;
2323

2424
use super::utils;
25-
use crate::execution::context::ExecutionProps;
25+
use crate::optimizer::optimizer::OptimizerConfig;
2626

2727
/// Optimization rule that replaces LIMIT 0 with an [LogicalPlan::EmptyRelation]
2828
#[derive(Default)]
@@ -39,7 +39,7 @@ impl OptimizerRule for EliminateLimit {
3939
fn optimize(
4040
&self,
4141
plan: &LogicalPlan,
42-
execution_props: &ExecutionProps,
42+
optimizer_config: &OptimizerConfig,
4343
) -> Result<LogicalPlan> {
4444
match plan {
4545
LogicalPlan::Limit(Limit { n, input }) if *n == 0 => {
@@ -56,7 +56,7 @@ impl OptimizerRule for EliminateLimit {
5656
let inputs = plan.inputs();
5757
let new_inputs = inputs
5858
.iter()
59-
.map(|plan| self.optimize(plan, execution_props))
59+
.map(|plan| self.optimize(plan, optimizer_config))
6060
.collect::<Result<Vec<_>>>()?;
6161

6262
utils::from_plan(plan, &expr, &new_inputs)
@@ -79,7 +79,7 @@ mod tests {
7979
fn assert_optimized_plan_eq(plan: &LogicalPlan, expected: &str) {
8080
let rule = EliminateLimit::new();
8181
let optimized_plan = rule
82-
.optimize(plan, &ExecutionProps::new())
82+
.optimize(plan, &OptimizerConfig::new())
8383
.expect("failed to optimize plan");
8484
let formatted_plan = format!("{:?}", optimized_plan);
8585
assert_eq!(formatted_plan, expected);

datafusion/core/src/optimizer/filter_push_down.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
//! Filter Push Down optimizer rule ensures that filters are applied as early as possible in the plan
1616
1717
use crate::datasource::datasource::TableProviderFilterPushDown;
18-
use crate::execution::context::ExecutionProps;
1918
use crate::logical_plan::plan::{Aggregate, Filter, Join, Projection, Union};
2019
use crate::logical_plan::{
2120
and, col, replace_col, Column, CrossJoin, JoinType, Limit, LogicalPlan, TableScan,
2221
};
2322
use crate::logical_plan::{DFSchema, Expr};
24-
use crate::optimizer::optimizer::OptimizerRule;
25-
use crate::optimizer::utils;
23+
use crate::optimizer::optimizer::OptimizerConfig;
24+
use crate::optimizer::{optimizer::OptimizerRule, utils};
2625
use crate::{error::Result, logical_plan::Operator};
2726
use std::{
2827
collections::{HashMap, HashSet},
@@ -560,7 +559,7 @@ impl OptimizerRule for FilterPushDown {
560559
"filter_push_down"
561560
}
562561

563-
fn optimize(&self, plan: &LogicalPlan, _: &ExecutionProps) -> Result<LogicalPlan> {
562+
fn optimize(&self, plan: &LogicalPlan, _: &OptimizerConfig) -> Result<LogicalPlan> {
564563
optimize(plan, State::default())
565564
}
566565
}
@@ -605,7 +604,7 @@ mod tests {
605604

606605
fn optimize_plan(plan: &LogicalPlan) -> LogicalPlan {
607606
let rule = FilterPushDown::new();
608-
rule.optimize(plan, &ExecutionProps::new())
607+
rule.optimize(plan, &OptimizerConfig::new())
609608
.expect("failed to optimize plan")
610609
}
611610

0 commit comments

Comments
 (0)