Optimizes the logical plan by applying optimizer rules.
(&self, plan: &LogicalPlan)
| 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 |