@@ -8,13 +8,24 @@ use crate::expr::Expression;
88use crate :: expr:: exprs:: get_item:: col;
99use crate :: expr:: exprs:: pack:: pack;
1010use crate :: expr:: exprs:: root:: root;
11- use crate :: expr:: traversal:: { NodeExt , Transformed } ;
11+ use crate :: expr:: traversal:: { NodeExt , Transformed , TraversalOrder } ;
1212
1313/// Replaces all occurrences of `needle` in the expression `expr` with `replacement`.
1414pub fn replace ( expr : Expression , needle : & Expression , replacement : Expression ) -> Expression {
15- expr. transform_up ( |node| replace_transformer ( node, needle, & replacement) )
16- . vortex_expect ( "ReplaceVisitor should not fail" )
17- . into_inner ( )
15+ expr. transform_down ( |node| {
16+ if & node == needle {
17+ Ok ( Transformed {
18+ value : replacement. clone ( ) ,
19+
20+ order : TraversalOrder :: Skip ,
21+ changed : true ,
22+ } )
23+ } else {
24+ Ok ( Transformed :: no ( node) )
25+ }
26+ } )
27+ . vortex_expect ( "ReplaceVisitor should not fail" )
28+ . into_inner ( )
1829}
1930
2031/// Expand the `root` expression with a pack of the given struct fields.
@@ -32,18 +43,6 @@ pub fn replace_root_fields(expr: Expression, fields: &StructFields) -> Expressio
3243 )
3344}
3445
35- fn replace_transformer (
36- node : Expression ,
37- needle : & Expression ,
38- replacement : & Expression ,
39- ) -> VortexResult < Transformed < Expression > > {
40- if & node == needle {
41- Ok ( Transformed :: yes ( replacement. clone ( ) ) )
42- } else {
43- Ok ( Transformed :: no ( node) )
44- }
45- }
46-
4746#[ cfg( test) ]
4847mod test {
4948 use vortex_dtype:: Nullability :: NonNullable ;
0 commit comments