Skip to content

Commit bf744f9

Browse files
committed
refactor: ref column map
Signed-off-by: discord9 <discord9@163.com>
1 parent 34c8a71 commit bf744f9

File tree

2 files changed

+19
-27
lines changed

2 files changed

+19
-27
lines changed

datafusion/physical-plan/src/projection.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,12 +373,11 @@ impl ExecutionPlan for ProjectionExec {
373373
) -> Result<FilterDescription> {
374374
// expand alias column to original expr in parent filters
375375
let invert_alias_map = self.collect_reverse_alias()?;
376-
let mut rewriter = PhysicalColumnRewriter::new(invert_alias_map);
377376

378377
let mut child_parent_filters = Vec::with_capacity(parent_filters.len());
379378

380379
for filter in parent_filters {
381-
rewriter.reset();
380+
let mut rewriter = PhysicalColumnRewriter::new(&invert_alias_map);
382381
let rewritten = Arc::clone(&filter).rewrite(&mut rewriter)?.data;
383382

384383
if rewriter.has_unmapped_columns() {

datafusion/physical-plan/src/util.rs

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ use datafusion_physical_expr::{PhysicalExpr, expressions::Column};
3131
/// If a column is found in the map, it is replaced by the mapped expression.
3232
/// If a column is NOT found in the map, the column is left unchanged and
3333
/// `has_unmapped_columns` is set to true.
34-
pub struct PhysicalColumnRewriter {
34+
pub struct PhysicalColumnRewriter<'a> {
3535
/// Mapping from original column to new column.
36-
pub column_map: HashMap<Column, Arc<dyn PhysicalExpr>>,
36+
pub column_map: &'a HashMap<Column, Arc<dyn PhysicalExpr>>,
3737
/// Whether any columns were not found in the mapping.
3838
has_unmapped_columns: bool,
3939
}
4040

41-
impl PhysicalColumnRewriter {
41+
impl<'a> PhysicalColumnRewriter<'a> {
4242
/// Create a new PhysicalColumnRewriter with the given column mapping.
43-
pub fn new(column_map: HashMap<Column, Arc<dyn PhysicalExpr>>) -> Self {
43+
pub fn new(column_map: &'a HashMap<Column, Arc<dyn PhysicalExpr>>) -> Self {
4444
Self {
4545
column_map,
4646
has_unmapped_columns: false,
@@ -51,15 +51,9 @@ impl PhysicalColumnRewriter {
5151
pub fn has_unmapped_columns(&self) -> bool {
5252
self.has_unmapped_columns
5353
}
54-
55-
/// Reset the `has_unmapped_columns` flag to false.
56-
/// Call this before rewriting a new expression.
57-
pub fn reset(&mut self) {
58-
self.has_unmapped_columns = false;
59-
}
6054
}
6155

62-
impl TreeNodeRewriter for PhysicalColumnRewriter {
56+
impl<'a> TreeNodeRewriter for PhysicalColumnRewriter<'a> {
6357
type Node = Arc<dyn PhysicalExpr>;
6458

6559
fn f_down(
@@ -162,7 +156,7 @@ mod tests {
162156
lit("replaced_b"),
163157
);
164158

165-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
159+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
166160
let expr = create_complex_expression(&schema);
167161

168162
let result = expr.rewrite(&mut rewriter)?;
@@ -200,7 +194,7 @@ mod tests {
200194
replacement_expr,
201195
);
202196

203-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
197+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
204198
let expr = create_deeply_nested_expression(&schema);
205199

206200
let result = expr.rewrite(&mut rewriter)?;
@@ -236,7 +230,7 @@ mod tests {
236230
col("a", &schema).unwrap(),
237231
);
238232

239-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
233+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
240234

241235
// Start with an expression containing col_a
242236
let expr = binary(
@@ -271,7 +265,7 @@ mod tests {
271265
column_map.insert(Column::new_with_schema("c", &schema).unwrap(), lit(20i32));
272266
column_map.insert(Column::new_with_schema("e", &schema).unwrap(), lit(30i32));
273267

274-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
268+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
275269
let expr = create_complex_expression(&schema); // (col_a + col_b) * (col_c - col_d) + col_e
276270

277271
let result = expr.rewrite(&mut rewriter)?;
@@ -321,7 +315,7 @@ mod tests {
321315
complex_replacement,
322316
);
323317

324-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
318+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
325319

326320
// Create expression: col_a + col_b
327321
let expr = binary(
@@ -357,7 +351,7 @@ mod tests {
357351
// Only map col_a, leave col_b unmapped
358352
column_map.insert(Column::new_with_schema("a", &schema).unwrap(), lit(42i32));
359353

360-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
354+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
361355

362356
// Create expression: col_a + col_b
363357
let expr = binary(
@@ -380,14 +374,12 @@ mod tests {
380374
}
381375

382376
#[test]
383-
fn test_reset_unmapped_flag() -> Result<()> {
377+
fn test_multiple_rewrites_with_fresh_rewriter() -> Result<()> {
384378
let schema = create_test_schema();
385379
let mut column_map = HashMap::new();
386380

387381
column_map.insert(Column::new_with_schema("a", &schema).unwrap(), lit(42i32));
388382

389-
let mut rewriter = PhysicalColumnRewriter::new(column_map);
390-
391383
// First expression with unmapped column
392384
let expr1 = binary(
393385
col("a", &schema).unwrap(),
@@ -397,16 +389,17 @@ mod tests {
397389
)
398390
.unwrap();
399391

392+
let mut rewriter = PhysicalColumnRewriter::new(&column_map);
400393
let _result1 = expr1.rewrite(&mut rewriter)?;
401394
assert!(rewriter.has_unmapped_columns());
402395

403-
// Reset and rewrite expression with only mapped columns
404-
rewriter.reset();
396+
// Create a fresh rewriter for the next expression (no reset needed)
405397
let expr2 = col("a", &schema).unwrap();
406-
let _result2 = expr2.rewrite(&mut rewriter)?;
398+
let mut rewriter2 = PhysicalColumnRewriter::new(&column_map);
399+
let _result2 = expr2.rewrite(&mut rewriter2)?;
407400

408-
// Should not detect unmapped columns after reset
409-
assert!(!rewriter.has_unmapped_columns());
401+
// Should not detect unmapped columns with fresh rewriter
402+
assert!(!rewriter2.has_unmapped_columns());
410403

411404
Ok(())
412405
}

0 commit comments

Comments
 (0)