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

Method optimize

datafusion/core/src/execution/session_state.rs:666–740  ·  view source on GitHub ↗

Optimizes the logical plan by applying optimizer rules.

(&self, plan: &LogicalPlan)

Source from the content-addressed store, hash-verified

664
665 /// Optimizes the logical plan by applying optimizer rules.
666 pub fn optimize(&self, plan: &LogicalPlan) -> datafusion_common::Result<LogicalPlan> {
667 if let LogicalPlan::Explain(e) = plan {
668 let mut stringified_plans = e.stringified_plans.clone();
669
670 // analyze & capture output of each rule
671 let analyzer_result = self.analyzer.execute_and_check(
672 e.plan.as_ref().clone(),
673 &self.options(),
674 |analyzed_plan, analyzer| {
675 let analyzer_name = analyzer.name().to_string();
676 let plan_type = PlanType::AnalyzedLogicalPlan { analyzer_name };
677 stringified_plans.push(analyzed_plan.to_stringified(plan_type));
678 },
679 );
680 let analyzed_plan = match analyzer_result {
681 Ok(plan) => plan,
682 Err(DataFusionError::Context(analyzer_name, err)) => {
683 let plan_type = PlanType::AnalyzedLogicalPlan { analyzer_name };
684 stringified_plans
685 .push(StringifiedPlan::new(plan_type, err.to_string()));
686
687 return Ok(LogicalPlan::Explain(Explain {
688 verbose: e.verbose,
689 plan: Arc::clone(&e.plan),
690 explain_format: e.explain_format.clone(),
691 stringified_plans,
692 schema: Arc::clone(&e.schema),
693 logical_optimization_succeeded: false,
694 }));
695 }
696 Err(e) => return Err(e),
697 };
698
699 // to delineate the analyzer & optimizer phases in explain output
700 stringified_plans
701 .push(analyzed_plan.to_stringified(PlanType::FinalAnalyzedLogicalPlan));
702
703 // optimize the child plan, capturing the output of each optimizer
704 let optimized_plan = self.optimizer.optimize(
705 analyzed_plan,
706 self,
707 |optimized_plan, optimizer| {
708 let optimizer_name = optimizer.name().to_string();
709 let plan_type = PlanType::OptimizedLogicalPlan { optimizer_name };
710 stringified_plans.push(optimized_plan.to_stringified(plan_type));
711 },
712 );
713 let (plan, logical_optimization_succeeded) = match optimized_plan {
714 Ok(plan) => (Arc::new(plan), true),
715 Err(DataFusionError::Context(optimizer_name, err)) => {
716 let plan_type = PlanType::OptimizedLogicalPlan { optimizer_name };
717 stringified_plans
718 .push(StringifiedPlan::new(plan_type, err.to_string()));
719 (Arc::clone(&e.plan), false)
720 }
721 Err(e) => return Err(e),
722 };
723

Callers 15

bench_push_down_filterFunction · 0.45
into_optimized_planMethod · 0.45
create_physical_planMethod · 0.45
execute_logical_planMethod · 0.45
create_memory_tableMethod · 0.45
regression_testFunction · 0.45
custom_source_dataframeFunction · 0.45
newMethod · 0.45
test_count_inexact_statFunction · 0.45

Calls 10

newFunction · 0.85
ExplainClass · 0.85
execute_and_checkMethod · 0.80
cloneMethod · 0.45
as_refMethod · 0.45
optionsMethod · 0.45
to_stringMethod · 0.45
nameMethod · 0.45
pushMethod · 0.45
to_stringifiedMethod · 0.45

Tested by 15

regression_testFunction · 0.36
custom_source_dataframeFunction · 0.36
newMethod · 0.36
test_count_inexact_statFunction · 0.36
runMethod · 0.36
test_commutativityFunction · 0.36
try_to_planMethod · 0.36