use arrow_array::RecordBatchReader;
use arrow_array::ffi_stream;
use arrow_schema::SchemaRef;
use vortex_array::ArrayRef;
use vortex_array::dtype::DType;
use vortex_array::iter::ArrayIterator;
use vortex_error::VortexError;
use vortex_error::VortexResult;
use crate::ArrowSession;
pub struct ArrowArrayStreamAdapter {
stream: ffi_stream::ArrowArrayStreamReader,
session: ArrowSession,
schema: SchemaRef,
dtype: DType,
}
impl ArrowArrayStreamAdapter {
pub fn try_new(
session: &ArrowSession,
stream: ffi_stream::ArrowArrayStreamReader,
) -> VortexResult<Self> {
let schema = stream.schema();
let dtype = session.from_arrow_schema(schema.as_ref())?;
Ok(Self {
stream,
session: session.clone(),
schema,
dtype,
})
}
}
impl ArrayIterator for ArrowArrayStreamAdapter {
fn dtype(&self) -> &DType {
&self.dtype
}
}
impl Iterator for ArrowArrayStreamAdapter {
type Item = VortexResult<ArrayRef>;
fn next(&mut self) -> Option<Self::Item> {
let batch = self.stream.next()?;
Some(batch.map_err(VortexError::from).and_then(|b| {
self.session
.from_arrow_record_batch(b, self.schema.as_ref())
}))
}
}