use arrow::array::NullBufferBuilder;
use arrow::buffer::NullBuffer;
#[derive(Debug)]
pub(crate) struct MaybeNullBufferBuilder {
nulls: NullBufferBuilder,
}
impl MaybeNullBufferBuilder {
pub fn new() -> Self {
Self {
nulls: NullBufferBuilder::new(0),
}
}
pub fn is_null(&self, row: usize) -> bool {
match self.nulls.as_slice() {
Some(_) => !self.nulls.is_valid(row),
None => false,
}
}
pub fn append(&mut self, is_null: bool) {
self.nulls.append(!is_null)
}
pub fn append_n(&mut self, n: usize, is_null: bool) {
if is_null {
self.nulls.append_n_nulls(n);
} else {
self.nulls.append_n_non_nulls(n);
}
}
pub fn allocated_size(&self) -> usize {
self.nulls.allocated_size() / 8
}
pub fn build(mut self) -> Option<NullBuffer> {
self.nulls.finish()
}
pub fn take_n(&mut self, n: usize) -> Option<NullBuffer> {
let mut new_builder = NullBufferBuilder::new(self.nulls.len());
for i in n..self.nulls.len() {
new_builder.append(self.nulls.is_valid(i));
}
std::mem::swap(&mut new_builder, &mut self.nulls);
new_builder.truncate(n);
new_builder.finish()
}
pub(crate) fn might_have_nulls(&self) -> bool {
self.nulls.as_slice().is_some()
}
}