@@ -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