Skip to content

Commit d87a00c

Browse files
committed
less copy
1 parent b659c96 commit d87a00c

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

arrow-select/src/concat.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,15 @@ fn concat_lists<OffsetSize: OffsetSizeTrait>(
135135
) -> Result<ArrayRef, ArrowError> {
136136
let mut output_len = 0;
137137
let mut list_has_nulls = false;
138+
let mut list_has_slices = false;
138139

139140
let lists = arrays
140141
.iter()
141142
.map(|x| x.as_list::<OffsetSize>())
142143
.inspect(|l| {
143144
output_len += l.len();
144145
list_has_nulls |= l.null_count() != 0;
146+
list_has_slices |= l.offsets()[0].as_usize() > 0;
145147
})
146148
.collect::<Vec<_>>();
147149

@@ -156,19 +158,23 @@ fn concat_lists<OffsetSize: OffsetSizeTrait>(
156158
NullBuffer::new(nulls.finish())
157159
});
158160

159-
let values: Vec<ArrayRef> = lists
160-
.iter()
161-
.map(|x| {
162-
// offsets may not refer to all values in the array
163-
// for example a sliced list array may have offsets that start at
164-
// a non-zero offset and not use all the values
165-
let offsets = x.offsets();
161+
// If any of the lists have slices, we need to slice the values
162+
// to ensure that the offsets are correct
163+
let mut sliced_values;
164+
let values: Vec<&dyn Array> = if list_has_slices {
165+
sliced_values = Vec::with_capacity(lists.len());
166+
for l in &lists {
167+
// if the first offset is non-zero, we need to slice the values so when
168+
// we concatenate them below only the relevant values are included
169+
let offsets = l.offsets();
166170
let start_offset = offsets[0].as_usize();
167171
let end_offset = offsets[offsets.len() - 1].as_usize();
168-
x.values().slice(start_offset, end_offset - start_offset)
169-
})
170-
.collect::<Vec<_>>();
171-
let values: Vec<&dyn Array> = values.iter().map(|a| a.as_ref()).collect();
172+
sliced_values.push(l.values().slice(start_offset, end_offset - start_offset));
173+
}
174+
sliced_values.iter().map(|a| a.as_ref()).collect()
175+
} else {
176+
lists.iter().map(|x| x.values().as_ref()).collect()
177+
};
172178

173179
let concatenated_values = concat(values.as_slice())?;
174180

0 commit comments

Comments
 (0)