Skip to content

Commit 7264b30

Browse files
committed
wip
Signed-off-by: Joe Isaacs <[email protected]>
1 parent a3798cd commit 7264b30

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

vortex-vector/src/listview/vector.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)