@@ -505,13 +505,13 @@ impl ScalarUDFImpl for GetFieldFunc {
505505 // 1. The base (first arg) is a column or already placeable at leaves
506506 // 2. All field keys (remaining args) are literals
507507 if args. is_empty ( ) {
508- return ExpressionPlacement :: PlaceAtRoot ;
508+ return ExpressionPlacement :: MoveTowardsRootNodes ;
509509 }
510510
511511 let base_placement = args[ 0 ] ;
512512 let base_is_pushable = matches ! (
513513 base_placement,
514- ExpressionPlacement :: Column | ExpressionPlacement :: PlaceAtLeaves
514+ ExpressionPlacement :: Column | ExpressionPlacement :: MoveTowardsLeafNodes
515515 ) ;
516516
517517 let all_keys_are_literals = args
@@ -520,9 +520,9 @@ impl ScalarUDFImpl for GetFieldFunc {
520520 . all ( |p| matches ! ( p, ExpressionPlacement :: Literal ) ) ;
521521
522522 if base_is_pushable && all_keys_are_literals {
523- ExpressionPlacement :: PlaceAtLeaves
523+ ExpressionPlacement :: MoveTowardsLeafNodes
524524 } else {
525- ExpressionPlacement :: PlaceAtRoot
525+ ExpressionPlacement :: MoveTowardsRootNodes
526526 }
527527 }
528528}
@@ -575,22 +575,31 @@ mod tests {
575575
576576 // get_field(col, 'literal') -> leaf-pushable (static field access)
577577 let args = vec ! [ ExpressionPlacement :: Column , ExpressionPlacement :: Literal ] ;
578- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtLeaves ) ;
578+ assert_eq ! (
579+ func. placement( & args) ,
580+ ExpressionPlacement :: MoveTowardsLeafNodes
581+ ) ;
579582
580583 // get_field(col, 'a', 'b') -> leaf-pushable (nested static field access)
581584 let args = vec ! [
582585 ExpressionPlacement :: Column ,
583586 ExpressionPlacement :: Literal ,
584587 ExpressionPlacement :: Literal ,
585588 ] ;
586- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtLeaves ) ;
589+ assert_eq ! (
590+ func. placement( & args) ,
591+ ExpressionPlacement :: MoveTowardsLeafNodes
592+ ) ;
587593
588- // get_field(get_field(col, 'a'), 'b') represented as PlaceAtLeaves for base
594+ // get_field(get_field(col, 'a'), 'b') represented as MoveTowardsLeafNodes for base
589595 let args = vec ! [
590- ExpressionPlacement :: PlaceAtLeaves ,
596+ ExpressionPlacement :: MoveTowardsLeafNodes ,
591597 ExpressionPlacement :: Literal ,
592598 ] ;
593- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtLeaves ) ;
599+ assert_eq ! (
600+ func. placement( & args) ,
601+ ExpressionPlacement :: MoveTowardsLeafNodes
602+ ) ;
594603 }
595604
596605 #[ test]
@@ -599,15 +608,21 @@ mod tests {
599608
600609 // get_field(col, other_col) -> NOT leaf-pushable (dynamic per-row lookup)
601610 let args = vec ! [ ExpressionPlacement :: Column , ExpressionPlacement :: Column ] ;
602- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtRoot ) ;
611+ assert_eq ! (
612+ func. placement( & args) ,
613+ ExpressionPlacement :: MoveTowardsRootNodes
614+ ) ;
603615
604616 // get_field(col, 'a', other_col) -> NOT leaf-pushable (dynamic nested lookup)
605617 let args = vec ! [
606618 ExpressionPlacement :: Column ,
607619 ExpressionPlacement :: Literal ,
608620 ExpressionPlacement :: Column ,
609621 ] ;
610- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtRoot ) ;
622+ assert_eq ! (
623+ func. placement( & args) ,
624+ ExpressionPlacement :: MoveTowardsRootNodes
625+ ) ;
611626 }
612627
613628 #[ test]
@@ -616,32 +631,47 @@ mod tests {
616631
617632 // get_field(root_expr, 'literal') -> NOT leaf-pushable
618633 let args = vec ! [
619- ExpressionPlacement :: PlaceAtRoot ,
634+ ExpressionPlacement :: MoveTowardsRootNodes ,
620635 ExpressionPlacement :: Literal ,
621636 ] ;
622- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtRoot ) ;
637+ assert_eq ! (
638+ func. placement( & args) ,
639+ ExpressionPlacement :: MoveTowardsRootNodes
640+ ) ;
623641
624642 // get_field(col, root_expr) -> NOT leaf-pushable
625643 let args = vec ! [
626644 ExpressionPlacement :: Column ,
627- ExpressionPlacement :: PlaceAtRoot ,
645+ ExpressionPlacement :: MoveTowardsRootNodes ,
628646 ] ;
629- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtRoot ) ;
647+ assert_eq ! (
648+ func. placement( & args) ,
649+ ExpressionPlacement :: MoveTowardsRootNodes
650+ ) ;
630651 }
631652
632653 #[ test]
633654 fn test_placement_edge_cases ( ) {
634655 let func = GetFieldFunc :: new ( ) ;
635656
636657 // Empty args -> NOT leaf-pushable
637- assert_eq ! ( func. placement( & [ ] ) , ExpressionPlacement :: PlaceAtRoot ) ;
658+ assert_eq ! (
659+ func. placement( & [ ] ) ,
660+ ExpressionPlacement :: MoveTowardsRootNodes
661+ ) ;
638662
639- // Just base, no key -> PlaceAtLeaves (not a valid call but should handle gracefully)
663+ // Just base, no key -> MoveTowardsLeafNodes (not a valid call but should handle gracefully)
640664 let args = vec ! [ ExpressionPlacement :: Column ] ;
641- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtLeaves ) ;
665+ assert_eq ! (
666+ func. placement( & args) ,
667+ ExpressionPlacement :: MoveTowardsLeafNodes
668+ ) ;
642669
643670 // Literal base with literal key -> NOT leaf-pushable (would be constant-folded)
644671 let args = vec ! [ ExpressionPlacement :: Literal , ExpressionPlacement :: Literal ] ;
645- assert_eq ! ( func. placement( & args) , ExpressionPlacement :: PlaceAtRoot ) ;
672+ assert_eq ! (
673+ func. placement( & args) ,
674+ ExpressionPlacement :: MoveTowardsRootNodes
675+ ) ;
646676 }
647677}
0 commit comments