use crate::data::types::PhysicalType;
use crate::data::ArrayDataLayout;
use crate::{ArrayDataBuilder, Buffers};
use arrow_buffer::buffer::{BooleanBuffer, NullBuffer};
use arrow_schema::DataType;
#[derive(Debug, Clone)]
pub struct BooleanArrayData {
data_type: DataType,
values: BooleanBuffer,
nulls: Option<NullBuffer>,
}
impl BooleanArrayData {
pub fn new(
data_type: DataType,
values: BooleanBuffer,
nulls: Option<NullBuffer>,
) -> Self {
let physical = PhysicalType::from(&data_type);
assert_eq!(
physical, PhysicalType::Boolean,
"Illegal physical type for BooleanArrayData of datatype {:?}, expected {:?} got {:?}",
data_type,
PhysicalType::Boolean,
physical
);
if let Some(n) = nulls.as_ref() {
assert_eq!(values.len(), n.len())
}
Self {
data_type,
values,
nulls,
}
}
pub unsafe fn new_unchecked(
data_type: DataType,
values: BooleanBuffer,
nulls: Option<NullBuffer>,
) -> Self {
Self {
data_type,
values,
nulls,
}
}
pub(crate) unsafe fn from_raw(builder: ArrayDataBuilder) -> Self {
let values = builder.buffers.into_iter().next().unwrap();
let values = BooleanBuffer::new(values, builder.offset, builder.len);
Self {
values,
data_type: builder.data_type,
nulls: builder.nulls,
}
}
#[inline]
pub fn nulls(&self) -> Option<&NullBuffer> {
self.nulls.as_ref()
}
#[inline]
pub fn values(&self) -> &BooleanBuffer {
&self.values
}
#[inline]
pub fn data_type(&self) -> &DataType {
&self.data_type
}
pub fn into_parts(self) -> (DataType, BooleanBuffer, Option<NullBuffer>) {
(self.data_type, self.values, self.nulls)
}
pub fn slice(&self, offset: usize, len: usize) -> Self {
Self {
data_type: self.data_type.clone(),
values: self.values.slice(offset, len),
nulls: self.nulls.as_ref().map(|x| x.slice(offset, len)),
}
}
pub(crate) fn layout(&self) -> ArrayDataLayout<'_> {
ArrayDataLayout {
data_type: &self.data_type,
len: self.values.len(),
offset: self.values.offset(),
nulls: self.nulls.as_ref(),
buffers: Buffers::one(self.values().inner()),
child_data: &[],
}
}
}