@@ -287,16 +287,21 @@ pub fn nested_case_when(
287287
288288#[ cfg( test) ]
289289mod tests {
290+ use std:: sync:: LazyLock ;
291+
290292 use vortex_buffer:: buffer;
291293 use vortex_dtype:: DType ;
292294 use vortex_dtype:: Nullability ;
293295 use vortex_dtype:: PType ;
294296 use vortex_error:: VortexExpect as _;
295297 use vortex_scalar:: Scalar ;
298+ use vortex_session:: VortexSession ;
296299
297300 use super :: * ;
301+ use crate :: Canonical ;
298302 use crate :: IntoArray ;
299303 use crate :: ToCanonical ;
304+ use crate :: VortexSessionExecute as _;
300305 use crate :: arrays:: BoolArray ;
301306 use crate :: arrays:: PrimitiveArray ;
302307 use crate :: arrays:: StructArray ;
@@ -307,6 +312,21 @@ mod tests {
307312 use crate :: expr:: exprs:: literal:: lit;
308313 use crate :: expr:: exprs:: root:: root;
309314 use crate :: expr:: test_harness;
315+ use crate :: session:: ArraySession ;
316+
317+ static SESSION : LazyLock < VortexSession > =
318+ LazyLock :: new ( || VortexSession :: empty ( ) . with :: < ArraySession > ( ) ) ;
319+
320+ /// Helper to evaluate an expression using the apply+execute pattern
321+ fn evaluate_expr ( expr : & Expression , array : & ArrayRef ) -> ArrayRef {
322+ let mut ctx = SESSION . create_execution_ctx ( ) ;
323+ array
324+ . apply ( expr)
325+ . unwrap ( )
326+ . execute :: < Canonical > ( & mut ctx)
327+ . unwrap ( )
328+ . into_array ( )
329+ }
310330
311331 // ==================== Serialization Tests ====================
312332
@@ -455,7 +475,7 @@ mod tests {
455475 lit ( 0i32 ) ,
456476 ) ;
457477
458- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
478+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
459479 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 0 , 0 , 100 , 100 , 100 ] ) ;
460480 }
461481
@@ -475,7 +495,7 @@ mod tests {
475495 Some ( lit ( 0i32 ) ) ,
476496 ) ;
477497
478- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
498+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
479499 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 10 , 0 , 30 , 0 , 0 ] ) ;
480500 }
481501
@@ -495,7 +515,7 @@ mod tests {
495515 Some ( lit ( 0i32 ) ) ,
496516 ) ;
497517
498- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
518+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
499519 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 0 , 0 , 100 , 100 , 100 ] ) ;
500520 }
501521
@@ -508,7 +528,7 @@ mod tests {
508528
509529 let expr = case_when_no_else ( gt ( get_item ( "value" , root ( ) ) , lit ( 3i32 ) ) , lit ( 100i32 ) ) ;
510530
511- let result = expr . evaluate ( & test_array) . unwrap ( ) ;
531+ let result = evaluate_expr ( & expr , & test_array) ;
512532 assert ! ( result. dtype( ) . is_nullable( ) ) ;
513533
514534 assert_eq ! (
@@ -546,7 +566,7 @@ mod tests {
546566 lit ( 0i32 ) ,
547567 ) ;
548568
549- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
569+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
550570 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 0 , 0 , 0 , 0 , 0 ] ) ;
551571 }
552572
@@ -563,15 +583,15 @@ mod tests {
563583 lit ( 0i32 ) ,
564584 ) ;
565585
566- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
586+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
567587 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 100 , 100 , 100 , 100 , 100 ] ) ;
568588 }
569589
570590 #[ test]
571591 fn test_evaluate_with_literal_condition ( ) {
572592 let test_array = buffer ! [ 1i32 , 2 , 3 ] . into_array ( ) ;
573593 let expr = case_when ( lit ( true ) , lit ( 100i32 ) , lit ( 0i32 ) ) ;
574- let result = expr . evaluate ( & test_array) . unwrap ( ) ;
594+ let result = evaluate_expr ( & expr , & test_array) ;
575595
576596 if let Some ( constant) = result. as_constant ( ) {
577597 assert_eq ! ( constant, Scalar :: from( 100i32 ) ) ;
@@ -594,9 +614,9 @@ mod tests {
594614 lit ( false ) ,
595615 ) ;
596616
597- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_bool ( ) ;
617+ let result = evaluate_expr ( & expr , & test_array) . to_bool ( ) ;
598618 assert_eq ! (
599- result. bit_buffer ( ) . iter( ) . collect:: <Vec <_>>( ) ,
619+ result. to_bit_buffer ( ) . iter( ) . collect:: <Vec <_>>( ) ,
600620 vec![ false , false , true , true , true ]
601621 ) ;
602622 }
@@ -612,7 +632,7 @@ mod tests {
612632
613633 let expr = case_when ( get_item ( "cond" , root ( ) ) , lit ( 100i32 ) , lit ( 0i32 ) ) ;
614634
615- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
635+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
616636 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 100 , 0 , 0 , 0 , 100 ] ) ;
617637 }
618638
@@ -635,7 +655,7 @@ mod tests {
635655 lit ( 0i32 ) ,
636656 ) ;
637657
638- let result = expr . evaluate ( & test_array) . unwrap ( ) ;
658+ let result = evaluate_expr ( & expr , & test_array) ;
639659 let prim = result. to_primitive ( ) ;
640660 assert_eq ! ( prim. as_slice:: <i32 >( ) , & [ 0 , 0 , 30 , 40 , 50 ] ) ;
641661 }
@@ -651,12 +671,11 @@ mod tests {
651671
652672 let expr = case_when ( get_item ( "cond" , root ( ) ) , lit ( 100i32 ) , lit ( 0i32 ) ) ;
653673
654- let result = expr . evaluate ( & test_array) . unwrap ( ) . to_primitive ( ) ;
674+ let result = evaluate_expr ( & expr , & test_array) . to_primitive ( ) ;
655675 assert_eq ! ( result. as_slice:: <i32 >( ) , & [ 0 , 0 , 0 ] ) ;
656676 }
657677
658- // Note: Direct execute tests are covered through evaluate tests above,
659- // since evaluate() calls execute() internally.
678+ // Note: Direct execute tests are covered through apply+execute tests above.
660679
661680 // Note: The binary CASE WHEN implementation using `zip` does NOT provide
662681 // short-circuit/lazy evaluation. All child expressions are evaluated first,
0 commit comments