@@ -59,7 +59,7 @@ use crate::logical_expr::{
59
59
CreateView , DropTable , DropView , Explain , LogicalPlan , LogicalPlanBuilder ,
60
60
SetVariable , TableSource , TableType , UNNAMED_TABLE ,
61
61
} ;
62
- use crate :: optimizer:: { OptimizerContext , OptimizerRule } ;
62
+ use crate :: optimizer:: OptimizerRule ;
63
63
use datafusion_sql:: { ResolvedTableReference , TableReference } ;
64
64
65
65
use crate :: physical_optimizer:: coalesce_batches:: CoalesceBatches ;
@@ -93,6 +93,7 @@ use crate::physical_optimizer::global_sort_selection::GlobalSortSelection;
93
93
use crate :: physical_optimizer:: optimize_sorts:: OptimizeSorts ;
94
94
use crate :: physical_optimizer:: pipeline_checker:: PipelineChecker ;
95
95
use crate :: physical_optimizer:: pipeline_fixer:: PipelineFixer ;
96
+ use datafusion_optimizer:: OptimizerConfig ;
96
97
use uuid:: Uuid ;
97
98
98
99
use super :: options:: {
@@ -1644,25 +1645,13 @@ impl SessionState {
1644
1645
1645
1646
/// Optimizes the logical plan by applying optimizer rules.
1646
1647
pub fn optimize ( & self , plan : & LogicalPlan ) -> Result < LogicalPlan > {
1647
- // TODO: Implement OptimizerContext directly on DataFrame (#4631) (#4626)
1648
- let config = {
1649
- let config = & self . config_options ( ) . optimizer ;
1650
- OptimizerContext :: new ( )
1651
- . with_skip_failing_rules ( config. skip_failed_rules )
1652
- . with_max_passes ( config. max_passes as u8 )
1653
- . with_query_execution_start_time (
1654
- self . execution_props . query_execution_start_time ,
1655
- )
1656
- . filter_null_keys ( config. filter_null_join_keys )
1657
- } ;
1658
-
1659
1648
if let LogicalPlan :: Explain ( e) = plan {
1660
1649
let mut stringified_plans = e. stringified_plans . clone ( ) ;
1661
1650
1662
1651
// optimize the child plan, capturing the output of each optimizer
1663
1652
let plan = self . optimizer . optimize (
1664
1653
e. plan . as_ref ( ) ,
1665
- & config ,
1654
+ self ,
1666
1655
|optimized_plan, optimizer| {
1667
1656
let optimizer_name = optimizer. name ( ) . to_string ( ) ;
1668
1657
let plan_type = PlanType :: OptimizedLogicalPlan { optimizer_name } ;
@@ -1677,7 +1666,7 @@ impl SessionState {
1677
1666
schema : e. schema . clone ( ) ,
1678
1667
} ) )
1679
1668
} else {
1680
- self . optimizer . optimize ( plan, & config , |_, _| { } )
1669
+ self . optimizer . optimize ( plan, self , |_, _| { } )
1681
1670
}
1682
1671
}
1683
1672
@@ -1811,6 +1800,30 @@ impl FunctionRegistry for SessionState {
1811
1800
}
1812
1801
}
1813
1802
1803
+ impl OptimizerConfig for SessionState {
1804
+ fn query_execution_start_time ( & self ) -> DateTime < Utc > {
1805
+ self . execution_props . query_execution_start_time
1806
+ }
1807
+
1808
+ fn rule_enabled ( & self , name : & str ) -> bool {
1809
+ use datafusion_optimizer:: filter_null_join_keys:: FilterNullJoinKeys ;
1810
+ match name {
1811
+ FilterNullJoinKeys :: NAME => {
1812
+ self . config_options ( ) . optimizer . filter_null_join_keys
1813
+ }
1814
+ _ => true ,
1815
+ }
1816
+ }
1817
+
1818
+ fn skip_failing_rules ( & self ) -> bool {
1819
+ self . config_options ( ) . optimizer . skip_failed_rules
1820
+ }
1821
+
1822
+ fn max_passes ( & self ) -> u8 {
1823
+ self . config_options ( ) . optimizer . max_passes as _
1824
+ }
1825
+ }
1826
+
1814
1827
/// Task Execution Context
1815
1828
pub struct TaskContext {
1816
1829
/// Session Id
0 commit comments