44use std:: hash:: Hash ;
55use std:: ops:: Range ;
66
7- use num_traits:: One ;
87use num_traits:: cast:: FromPrimitive ;
98use vortex_array:: ArrayBufferVisitor ;
109use vortex_array:: ArrayChildVisitor ;
@@ -15,6 +14,7 @@ use vortex_array::ExecutionCtx;
1514use vortex_array:: Precision ;
1615use vortex_array:: ProstMetadata ;
1716use vortex_array:: SerializeMetadata ;
17+ use vortex_array:: arrays:: FilterVTable ;
1818use vortex_array:: arrays:: PrimitiveArray ;
1919use vortex_array:: serde:: ArrayChildren ;
2020use vortex_array:: stats:: ArrayStats ;
@@ -45,11 +45,14 @@ use vortex_error::VortexResult;
4545use vortex_error:: vortex_bail;
4646use vortex_error:: vortex_ensure;
4747use vortex_error:: vortex_err;
48+ use vortex_mask:: AllOr ;
4849use vortex_mask:: Mask ;
4950use vortex_scalar:: PValue ;
5051use vortex_scalar:: Scalar ;
5152use vortex_scalar:: ScalarValue ;
5253use vortex_vector:: Vector ;
54+ use vortex_vector:: VectorMut ;
55+ use vortex_vector:: VectorMutOps ;
5356use vortex_vector:: primitive:: PVector ;
5457
5558vtable ! ( Sequence ) ;
@@ -285,20 +288,48 @@ impl VTable for SequenceVTable {
285288 let base = array. base( ) . cast:: <P >( ) ;
286289 let multiplier = array. multiplier( ) . cast:: <P >( ) ;
287290
288- let values = if multiplier == <P >:: one( ) {
289- BufferMut :: from_iter(
290- ( 0 ..array. len( ) ) . map( |i| base + <P >:: from_usize( i) . vortex_expect( "must fit" ) ) ,
291- )
292- } else {
293- BufferMut :: from_iter(
294- ( 0 ..array. len( ) )
295- . map( |i| base + <P >:: from_usize( i) . vortex_expect( "must fit" ) * multiplier) ,
296- )
297- } ;
298-
299- PVector :: <P >:: new( values. freeze( ) , Mask :: new_true( array. len( ) ) ) . into( )
291+ execute_iter( base, multiplier, 0 ..array. len( ) , array. len( ) ) . into( )
300292 } ) )
301293 }
294+
295+ fn execute_parent (
296+ array : & Self :: Array ,
297+ parent : & ArrayRef ,
298+ _child_idx : usize ,
299+ _ctx : & mut ExecutionCtx ,
300+ ) -> VortexResult < Option < Vector > > {
301+ // Special-case filtered execution.
302+ let Some ( filter) = parent. as_opt :: < FilterVTable > ( ) else {
303+ return Ok ( None ) ;
304+ } ;
305+
306+ match filter. filter_mask ( ) . indices ( ) {
307+ AllOr :: All => Ok ( None ) ,
308+ AllOr :: None => Ok ( Some ( VectorMut :: with_capacity ( array. dtype ( ) , 0 ) . freeze ( ) ) ) ,
309+ AllOr :: Some ( indices) => Ok ( Some ( match_each_native_ptype ! ( array. ptype( ) , |P | {
310+ let base = array. base( ) . cast:: <P >( ) ;
311+ let multiplier = array. multiplier( ) . cast:: <P >( ) ;
312+ execute_iter( base, multiplier, indices. iter( ) . copied( ) , indices. len( ) ) . into( )
313+ } ) ) ) ,
314+ }
315+ }
316+ }
317+
318+ fn execute_iter < P : NativePType , I : Iterator < Item = usize > > (
319+ base : P ,
320+ multiplier : P ,
321+ iter : I ,
322+ len : usize ,
323+ ) -> PVector < P > {
324+ let values = if multiplier == <P >:: one ( ) {
325+ BufferMut :: from_iter ( iter. map ( |i| base + <P >:: from_usize ( i) . vortex_expect ( "must fit" ) ) )
326+ } else {
327+ BufferMut :: from_iter (
328+ iter. map ( |i| base + <P >:: from_usize ( i) . vortex_expect ( "must fit" ) * multiplier) ,
329+ )
330+ } ;
331+
332+ PVector :: < P > :: new ( values. freeze ( ) , Mask :: new_true ( len) )
302333}
303334
304335impl BaseArrayVTable < SequenceVTable > for SequenceVTable {
0 commit comments