risingwave_frontend/optimizer/rule/batch/
batch_project_merge_rule.rs1use super::prelude::*;
16use crate::optimizer::plan_node::{BatchProject, PlanTreeNodeUnary};
17use crate::optimizer::rule::ProjectMergeRule;
18
19pub struct BatchProjectMergeRule {}
21impl Rule<Batch> for BatchProjectMergeRule {
22 fn apply(&self, plan: PlanRef) -> Option<PlanRef> {
23 let outer_project = plan.as_batch_project()?;
24 let input = outer_project.input();
25 let inner_project = input.as_batch_project()?;
26
27 let mut core = outer_project.core().clone();
28 core.exprs = ProjectMergeRule::merge_project_exprs(
29 outer_project.exprs(),
30 inner_project.exprs(),
31 true,
32 )?;
33 core.input = inner_project.input();
34
35 Some(BatchProject::new(core).into())
36 }
37}
38
39impl BatchProjectMergeRule {
40 pub fn create() -> BoxedRule {
41 Box::new(BatchProjectMergeRule {})
42 }
43}