// take implementation when only values contain nulls
take implementation when only values contain nulls
take implementation when only values contain nulls
pub fn take_values_validity<O: Offset, I: Index, A: GenericBinaryArray<O>>(
    values: &A,
    indices: &[I],
) -> (Buffer<O>, Buffer<u8>, Option<Bitmap>) {
    let mut length = O::default();
    let mut validity = MutableBitmap::with_capacity(indices.len());
    let null_values = values.validity().unwrap();
    let offsets = values.offsets();
    let values_values = values.values();
    let mut starts = MutableBuffer::<O>::with_capacity(indices.len());
    let offsets = indices.iter().map(|index| {
        let index = index.to_usize();
        if null_values.get_bit(index) {
            validity.push(true);
            let start = offsets[index];
            length += offsets[index + 1] - start;
            starts.push(start);
        } else {
            validity.push(false);
            starts.push(O::default());
        }
        length
    });
    let offsets = std::iter::once(O::default()).chain(offsets);
    let offsets = Buffer::from_trusted_len_iter(offsets);
    let buffer = take_values(length, starts.as_slice(), offsets.as_slice(), values_values);
    (offsets, buffer, validity.into())
}
pub fn take_values_validity < O : Offset , I : Index , A : GenericBinaryArray < O > > ( values : & A , indices : & [ I ] , ) -> ( Buffer < O > , Buffer < u8 > , Option < Bitmap > ) { let mut length = O :: default ( ) ; let mut validity = MutableBitmap :: with_capacity ( indices . len ( ) ) ; let null_values = values . validity ( ) . unwrap ( ) ; let offsets = values . offsets ( ) ; let values_values = values . values ( ) ; let mut starts = MutableBuffer :: < O > :: with_capacity ( indices . len ( ) ) ; let offsets = indices . iter ( ) . map ( | index | { let index = index . to_usize ( ) ; if null_values . get_bit ( index ) { validity . push ( true ) ; let start = offsets [ index ] ; length += offsets [ index + 1 ] - start ; starts . push ( start ) ; } else { validity . push ( false ) ; starts . push ( O :: default ( ) ) ; } length } ) ; let offsets = std :: iter :: once ( O :: default ( ) ) . chain ( offsets ) ; let offsets = Buffer :: from_trusted_len_iter ( offsets ) ; let buffer = take_values ( length , starts . as_slice ( ) , offsets . as_slice ( ) , values_values ) ; ( offsets , buffer , validity . into ( ) ) }
take implementation when only values contain nulls
take implementation when only values contain nulls
values
&A
indices
&[I]