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]

Reply via email to