@@ -120,20 +120,35 @@ where
120120 S : vortex_dtype:: NativePType + Copy ,
121121 usize : TryFrom < O > + TryFrom < S > ,
122122{
123- // Build element-level mask: for each valid list, mark elements[offset..offset+size] as valid
124- let valid_slices: Vec < ( usize , usize ) > = ( 0 ..len)
125- . filter ( |& i| validity. value ( i) )
126- . map ( |i| {
123+ // Fast path: if all lists are invalid, elements don't matter
124+ if validity. all_false ( ) {
125+ return true ;
126+ }
127+
128+ // Fast path: if all lists are valid, compare elements directly
129+ if validity. all_true ( ) {
130+ return self_elements == other_elements
131+ && self_offsets == other_offsets
132+ && self_sizes == other_sizes;
133+ }
134+
135+ // Build element-level mask using Vec<bool> to handle overlapping slices correctly
136+ let elem_len = self_elements. len ( ) ;
137+ let mut element_valid = vec ! [ false ; elem_len] ;
138+ for i in 0 ..len {
139+ if validity. value ( i) {
127140 let offset = self_offsets
128141 . get_as :: < usize > ( i)
129142 . vortex_expect ( "offset is valid and fits in usize" ) ;
130143 let size = self_sizes
131144 . get_as :: < usize > ( i)
132145 . vortex_expect ( "size is valid and fits in usize" ) ;
133- ( offset, offset + size)
134- } )
135- . collect ( ) ;
136- let element_mask = Mask :: from_slices ( self_elements. len ( ) , valid_slices) ;
146+ for j in offset..( offset + size) . min ( elem_len) {
147+ element_valid[ j] = true ;
148+ }
149+ }
150+ }
151+ let element_mask = Mask :: from_buffer ( vortex_buffer:: BitBuffer :: from ( element_valid) ) ;
137152
138153 // Clone elements and apply the element-level mask
139154 let mut self_elems = self_elements. clone ( ) ;
0 commit comments