@@ -82,15 +82,6 @@ impl ComputeFnVTable for Filter {
8282 return Ok ( array. to_array ( ) . into ( ) ) ;
8383 }
8484
85- // Since we handle the AllTrue and AllFalse cases in the entry-point filter function,
86- // implementations can use `AllOr::expect_some` to unwrap the mixed values variant.
87- let values = match & mask {
88- Mask :: AllTrue ( _) => return Ok ( array. to_array ( ) . into ( ) ) ,
89- Mask :: AllFalse ( _) => return Ok ( Canonical :: empty ( array. dtype ( ) ) . into_array ( ) . into ( ) ) ,
90- Mask :: Values ( values) => values,
91- } ;
92-
93- // Check each kernel for the array
9485 for kernel in kernels {
9586 if let Some ( output) = kernel. invoke ( args) ? {
9687 return Ok ( output) ;
@@ -108,14 +99,17 @@ impl ComputeFnVTable for Filter {
10899 . into ( ) ) ;
109100 }
110101
111- // Fallback: implement using Arrow kernels.
112102 log:: debug!( "No filter implementation found for {}" , array. encoding( ) , ) ;
113103
114- let array_ref = array. to_array ( ) . into_arrow_preferred ( ) ?;
115- let mask_array = BooleanArray :: new ( values. boolean_buffer ( ) . clone ( ) , None ) ;
116- let filtered = arrow_select:: filter:: filter ( array_ref. as_ref ( ) , & mask_array) ?;
104+ if !array. is_canonical ( ) {
105+ let canonical = array. to_canonical ( ) ?. into_array ( ) ;
106+ return filter ( & canonical, mask) . map ( Into :: into) ;
107+ } ;
117108
118- Ok ( ArrayRef :: from_arrow ( filtered, array. dtype ( ) . is_nullable ( ) ) . into ( ) )
109+ vortex_bail ! (
110+ "No filter implementation found for array {}" ,
111+ array. encoding( )
112+ )
119113 }
120114
121115 fn return_dtype ( & self , args : & InvocationArgs ) -> VortexResult < DType > {
@@ -234,6 +228,19 @@ impl TryFrom<&dyn Array> for Mask {
234228 }
235229}
236230
231+ pub fn arrow_filter_fn ( array : & dyn Array , mask : & Mask ) -> VortexResult < ArrayRef > {
232+ let values = match & mask {
233+ Mask :: Values ( values) => values,
234+ _ => unreachable ! ( "check in filter invoke" ) ,
235+ } ;
236+
237+ let array_ref = array. to_array ( ) . into_arrow_preferred ( ) ?;
238+ let mask_array = BooleanArray :: new ( values. boolean_buffer ( ) . clone ( ) , None ) ;
239+ let filtered = arrow_select:: filter:: filter ( array_ref. as_ref ( ) , & mask_array) ?;
240+
241+ Ok ( ArrayRef :: from_arrow ( filtered, array. dtype ( ) . is_nullable ( ) ) )
242+ }
243+
237244#[ cfg( test) ]
238245mod test {
239246 use super :: * ;
0 commit comments