use super::InProgressArray;
use crate::concat::concat;
use arrow_array::ArrayRef;
use arrow_schema::ArrowError;
#[derive(Debug)]
pub(crate) struct GenericInProgressArray {
source: Option<ArrayRef>,
buffered_arrays: Vec<ArrayRef>,
}
impl GenericInProgressArray {
pub(crate) fn new() -> Self {
Self {
source: None,
buffered_arrays: vec![],
}
}
}
impl InProgressArray for GenericInProgressArray {
fn set_source(&mut self, source: Option<ArrayRef>) {
self.source = source
}
fn copy_rows(&mut self, offset: usize, len: usize) -> Result<(), ArrowError> {
let source = self.source.as_ref().ok_or_else(|| {
ArrowError::InvalidArgumentError(
"Internal Error: GenericInProgressArray: source not set".to_string(),
)
})?;
let array = source.slice(offset, len);
self.buffered_arrays.push(array);
Ok(())
}
fn finish(&mut self) -> Result<ArrayRef, ArrowError> {
let array = concat(
&self
.buffered_arrays
.iter()
.map(|array| array.as_ref())
.collect::<Vec<_>>(),
)?;
self.buffered_arrays.clear();
Ok(array)
}
}