use crate::array::{
ArrayBuilder, ArrayRef, GenericListBuilder, GenericStringArray, OffsetSizeTrait,
UInt8Builder,
};
use crate::error::Result;
use std::any::Any;
use std::sync::Arc;
#[derive(Debug)]
pub struct GenericStringBuilder<OffsetSize: OffsetSizeTrait> {
builder: GenericListBuilder<OffsetSize, UInt8Builder>,
}
impl<OffsetSize: OffsetSizeTrait> GenericStringBuilder<OffsetSize> {
pub fn new(capacity: usize) -> Self {
let values_builder = UInt8Builder::new(capacity);
Self {
builder: GenericListBuilder::new(values_builder),
}
}
pub fn with_capacity(item_capacity: usize, data_capacity: usize) -> Self {
let values_builder = UInt8Builder::new(data_capacity);
Self {
builder: GenericListBuilder::with_capacity(values_builder, item_capacity),
}
}
#[inline]
pub fn append_value(&mut self, value: impl AsRef<str>) -> Result<()> {
self.builder
.values()
.append_slice(value.as_ref().as_bytes())?;
self.builder.append(true)?;
Ok(())
}
#[inline]
pub fn append(&mut self, is_valid: bool) -> Result<()> {
self.builder.append(is_valid)
}
#[inline]
pub fn append_null(&mut self) -> Result<()> {
self.append(false)
}
#[inline]
pub fn append_option(&mut self, value: Option<impl AsRef<str>>) -> Result<()> {
match value {
None => self.append_null()?,
Some(v) => self.append_value(v)?,
};
Ok(())
}
pub fn finish(&mut self) -> GenericStringArray<OffsetSize> {
GenericStringArray::<OffsetSize>::from(self.builder.finish())
}
pub fn values_slice(&self) -> &[u8] {
self.builder.values_ref().values_slice()
}
pub fn offsets_slice(&self) -> &[OffsetSize] {
self.builder.offsets_slice()
}
}
impl<OffsetSize: OffsetSizeTrait> ArrayBuilder for GenericStringBuilder<OffsetSize> {
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn into_box_any(self: Box<Self>) -> Box<dyn Any> {
self
}
fn len(&self) -> usize {
self.builder.len()
}
fn is_empty(&self) -> bool {
self.builder.is_empty()
}
fn finish(&mut self) -> ArrayRef {
let a = GenericStringBuilder::<OffsetSize>::finish(self);
Arc::new(a)
}
}