(
truthy: &GenericByteArray<T>,
mask: &BooleanBuffer,
output_len: usize,
selectivity: f64,
)
| 249 | } |
| 250 | |
| 251 | fn scatter_bytes<T: ByteArrayType>( |
| 252 | truthy: &GenericByteArray<T>, |
| 253 | mask: &BooleanBuffer, |
| 254 | output_len: usize, |
| 255 | selectivity: f64, |
| 256 | ) -> GenericByteArray<T> { |
| 257 | let src_offsets = truthy.value_offsets(); |
| 258 | let src_data = truthy.value_data(); |
| 259 | |
| 260 | // Build output offsets: false positions get zero-length (offset stays same) |
| 261 | let mut dst_offsets: Vec<T::Offset> = Vec::with_capacity(output_len + 1); |
| 262 | let mut cur_offset = T::Offset::default(); |
| 263 | dst_offsets.push(cur_offset); |
| 264 | |
| 265 | let mut src_idx = 0; |
| 266 | for i in 0..output_len { |
| 267 | if mask.value(i) { |
| 268 | let len = |
| 269 | src_offsets[src_idx + 1].as_usize() - src_offsets[src_idx].as_usize(); |
| 270 | cur_offset += T::Offset::from_usize(len).unwrap(); |
| 271 | src_idx += 1; |
| 272 | } |
| 273 | dst_offsets.push(cur_offset); |
| 274 | } |
| 275 | |
| 276 | let byte_start = src_offsets[0].as_usize(); |
| 277 | let byte_end = src_offsets[src_idx].as_usize(); |
| 278 | let dst_data: Buffer = src_data[byte_start..byte_end].into(); |
| 279 | |
| 280 | let nulls = scatter_null_mask(truthy.nulls(), mask, output_len, selectivity); |
| 281 | |
| 282 | let offsets_buffer: Buffer = dst_offsets.into(); |
| 283 | // SAFETY: offsets and data buffers are constructed consistently for `output_len` |
| 284 | let data = unsafe { |
| 285 | ArrayDataBuilder::new(truthy.data_type().clone()) |
| 286 | .len(output_len) |
| 287 | .add_buffer(offsets_buffer) |
| 288 | .add_buffer(dst_data) |
| 289 | .nulls(nulls) |
| 290 | .build_unchecked() |
| 291 | }; |
| 292 | GenericByteArray::from(data) |
| 293 | } |
| 294 | |
| 295 | fn scatter_byte_view<T: ByteViewType>( |
| 296 | truthy: &GenericByteViewArray<T>, |
nothing calls this directly
no test coverage detected
searching dependent graphs…