Skip to content

Commit 1d96ab0

Browse files
gandronchikMazterQyou
authored andcommitted
feat: ProjectionDropOut optimizer
1 parent 94ddd00 commit 1d96ab0

File tree

4 files changed

+1037
-6
lines changed

4 files changed

+1037
-6
lines changed

datafusion/core/src/logical_plan/expr_rewriter.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,32 @@ pub fn replace_col(e: Expr, replace_map: &HashMap<&Column, &Column>) -> Result<E
465465
e.rewrite(&mut ColumnReplacer { replace_map })
466466
}
467467

468+
/// Recursively replace all Column expressions in a given expression tree with Expressions
469+
/// provided by the hash map argument.
470+
pub fn replace_col_to_expr(
471+
e: Expr,
472+
replace_map: &HashMap<&Column, &Expr>,
473+
) -> Result<Expr> {
474+
struct ColumnReplacer<'a> {
475+
replace_map: &'a HashMap<&'a Column, &'a Expr>,
476+
}
477+
478+
impl<'a> ExprRewriter for ColumnReplacer<'a> {
479+
fn mutate(&mut self, expr: Expr) -> Result<Expr> {
480+
if let Expr::Column(c) = &expr {
481+
match self.replace_map.get(c) {
482+
Some(new_e) => Ok((*new_e).to_owned()),
483+
None => Ok(expr),
484+
}
485+
} else {
486+
Ok(expr)
487+
}
488+
}
489+
}
490+
491+
e.rewrite(&mut ColumnReplacer { replace_map })
492+
}
493+
468494
/// Recursively 'unnormalize' (remove all qualifiers) from an
469495
/// expression tree.
470496
///

datafusion/core/src/logical_plan/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ pub use expr::{
5555
trunc, unalias, upper, when, Column, Expr, ExprSchema, Like, Literal,
5656
};
5757
pub use expr_rewriter::{
58-
normalize_col, normalize_cols, replace_col, rewrite_sort_cols_by_aggs,
59-
rewrite_udtfs_to_columns, unnormalize_col, unnormalize_cols, ExprRewritable,
60-
ExprRewriter, RewriteRecursion,
58+
normalize_col, normalize_cols, replace_col, replace_col_to_expr,
59+
rewrite_sort_cols_by_aggs, rewrite_udtfs_to_columns, unnormalize_col,
60+
unnormalize_cols, ExprRewritable, ExprRewriter, RewriteRecursion,
6161
};
6262
pub use expr_schema::ExprSchemable;
6363
pub use expr_simplier::{ExprSimplifiable, SimplifyInfo};
@@ -66,8 +66,8 @@ pub use extension::UserDefinedLogicalNode;
6666
pub use operators::Operator;
6767
pub use plan::{
6868
CreateCatalogSchema, CreateExternalTable, CreateMemoryTable, CrossJoin, Distinct,
69-
DropTable, EmptyRelation, JoinConstraint, JoinType, Limit, LogicalPlan, Partitioning,
70-
PlanType, PlanVisitor, Repartition, StringifiedPlan, Subquery, TableScan,
71-
ToStringifiedPlan, Union, Values,
69+
DropTable, EmptyRelation, Filter, JoinConstraint, JoinType, Limit, LogicalPlan,
70+
Partitioning, PlanType, PlanVisitor, Repartition, StringifiedPlan, Subquery,
71+
TableScan, ToStringifiedPlan, Union, Values,
7272
};
7373
pub use registry::FunctionRegistry;

datafusion/core/src/optimizer/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub mod eliminate_limit;
2525
pub mod filter_push_down;
2626
pub mod limit_push_down;
2727
pub mod optimizer;
28+
pub mod projection_drop_out;
2829
pub mod projection_push_down;
2930
pub mod simplify_expressions;
3031
pub mod single_distinct_to_groupby;

0 commit comments

Comments
 (0)