Rachelint commented on issue #6430: URL: https://github.com/apache/arrow-rs/issues/6430#issuecomment-2366782446
> > In my opinion, can we define something like BooleanArrayMutator? I am still reading codes and thinking. > > I think we can use the builders for this rather than adding a new API. I think we can use the existing structures for low level manipulation if we made it a bit easier to convert between them. > > I think we should make conversion from array --> builder such that they don't copy if possible, but if necessary copy the underlying buffers. A sliced array is likely to be share so copying the bitmap to modify it will be needed anyways > > > And for in-place modification, I found another challenge that we can't modify bit through index using BooleanBuilder? > > The lower level BooleanBufferBuilder contains the relevant APIs, like this: https://docs.rs/arrow/latest/arrow/array/builder/struct.BooleanBufferBuilder.html#method.set_bit > > Rather than changing BooleanBuilder to allow direct manipulation of the underling boolean buffer, maybe we could make it easier to further destructure it (see [source](https://docs.rs/arrow-array/53.0.0/src/arrow_array/builder/boolean_builder.rs.html#60-61)) > > For example > > ```rust > // convert boolean array --> BooleanBuilder > let builder = boolean_array.into_builder(); > > // Deconstruct the BooleanBuilder into `BooleanBufferBuilder` and `NullBufferBuilder > let (bool_builder, null_builder) = builder.into_builders(); > > .. modify the boolean/null buffers via low level builders > > // put it back together > let builder = BooleanBuilder::new_from_builders(bool_builder, null_builder); > let array = builder.finish() > ``` > > new_from_builders is inspired by https://docs.rs/arrow/latest/arrow/array/builder/struct.PrimitiveBuilder.html#method.new_from_buffer Got it! The alternative may can be something like `slices_mut` in `PrimitiveBuilder`? ```rust impl<T: ArrowPrimitiveType> PrimitiveBuilder<T> { /// Returns the current values buffer and null buffer as a slice pub fn slices_mut(&mut self) -> (&mut [T::Native], Option<&mut [u8]>) { ( self.values_builder.as_slice_mut(), self.null_buffer_builder.as_slice_mut(), ) } } ``` We offer the similar api like: ``` impl BooleanBuilder { pub fn builders_mut(&mut self) -> (&mut BooleanBufferBuilder, &mut NullBufferBuilder) { ... } } ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
