Maps `nulls` to `BitChunk's` and then to `BitChunkIterator's`, then divides `self.type_ids` into exact chunks of 64 values, calling `mask_chunk` for every exact chunk, and `mask_remainder` for the remainder, if any, collecting the result in a `BooleanBuffer`
(
&self,
nulls: Vec<(i8, NullBuffer)>,
mut mask_chunk: impl FnMut(&[i8; 64], &mut [(i8, BitChunkIterator)]) -> u64,
mask_remainder: impl FnOnce(&[i8], &[(i8, BitChunks)
| 569 | /// Maps `nulls` to `BitChunk's` and then to `BitChunkIterator's`, then divides `self.type_ids` into exact chunks of 64 values, |
| 570 | /// calling `mask_chunk` for every exact chunk, and `mask_remainder` for the remainder, if any, collecting the result in a `BooleanBuffer` |
| 571 | fn mask_sparse_helper( |
| 572 | &self, |
| 573 | nulls: Vec<(i8, NullBuffer)>, |
| 574 | mut mask_chunk: impl FnMut(&[i8; 64], &mut [(i8, BitChunkIterator)]) -> u64, |
| 575 | mask_remainder: impl FnOnce(&[i8], &[(i8, BitChunks)]) -> u64, |
| 576 | ) -> BooleanBuffer { |
| 577 | let bit_chunks = nulls |
| 578 | .iter() |
| 579 | .map(|(type_id, nulls)| (*type_id, nulls.inner().bit_chunks())) |
| 580 | .collect::<Vec<_>>(); |
| 581 | |
| 582 | let mut nulls_masks_iter = bit_chunks |
| 583 | .iter() |
| 584 | .map(|(type_id, bit_chunks)| (*type_id, bit_chunks.iter())) |
| 585 | .collect::<Vec<_>>(); |
| 586 | |
| 587 | let chunks_exact = self.type_ids.chunks_exact(64); |
| 588 | let remainder = chunks_exact.remainder(); |
| 589 | |
| 590 | let chunks = chunks_exact.map(|type_ids_chunk| { |
| 591 | let type_ids_chunk_array = <&[i8; 64]>::try_from(type_ids_chunk).unwrap(); |
| 592 | |
| 593 | mask_chunk(type_ids_chunk_array, &mut nulls_masks_iter) |
| 594 | }); |
| 595 | |
| 596 | // SAFETY: |
| 597 | // chunks is a ChunksExact iterator, which implements TrustedLen, and correctly reports its length |
| 598 | let mut buffer = unsafe { MutableBuffer::from_trusted_len_iter(chunks) }; |
| 599 | |
| 600 | if !remainder.is_empty() { |
| 601 | buffer.push(mask_remainder(remainder, &bit_chunks)); |
| 602 | } |
| 603 | |
| 604 | BooleanBuffer::new(buffer.into(), 0, self.type_ids.len()) |
| 605 | } |
| 606 | |
| 607 | /// Computes the logical nulls for a sparse or dense union, by gathering individual bits from the null buffer of the selected field |
| 608 | fn gather_nulls(&self, nulls: Vec<(i8, NullBuffer)>) -> BooleanBuffer { |
no test coverage detected