use crate::{DEFAULT_BATCH_SIZE, RecordBatchIterator};
use arrow::array::{Int64Array, RecordBatch, StringViewArray};
use arrow::datatypes::{DataType, Field, Schema, SchemaRef};
use std::sync::{Arc, LazyLock};
use tpchgen::generators::{NationGenerator, NationGeneratorIterator};
pub struct NationArrow {
inner: NationGeneratorIterator<'static>,
batch_size: usize,
}
impl NationArrow {
pub fn new(generator: NationGenerator<'static>) -> Self {
Self {
inner: generator.iter(),
batch_size: DEFAULT_BATCH_SIZE,
}
}
pub fn with_batch_size(mut self, batch_size: usize) -> Self {
self.batch_size = batch_size;
self
}
}
impl RecordBatchIterator for NationArrow {
fn schema(&self) -> &SchemaRef {
&NATION_SCHEMA
}
}
impl Iterator for NationArrow {
type Item = RecordBatch;
fn next(&mut self) -> Option<Self::Item> {
let rows: Vec<_> = self.inner.by_ref().take(self.batch_size).collect();
if rows.is_empty() {
return None;
}
let n_nationkey = Int64Array::from_iter_values(rows.iter().map(|r| r.n_nationkey));
let n_name = StringViewArray::from_iter_values(rows.iter().map(|r| r.n_name));
let n_regionkey = Int64Array::from_iter_values(rows.iter().map(|r| r.n_regionkey));
let n_comment = StringViewArray::from_iter_values(rows.iter().map(|r| r.n_comment));
let batch = RecordBatch::try_new(
Arc::clone(self.schema()),
vec![
Arc::new(n_nationkey),
Arc::new(n_name),
Arc::new(n_regionkey),
Arc::new(n_comment),
],
)
.unwrap();
Some(batch)
}
}
static NATION_SCHEMA: LazyLock<SchemaRef> = LazyLock::new(make_nation_schema);
fn make_nation_schema() -> SchemaRef {
Arc::new(Schema::new(vec![
Field::new("n_nationkey", DataType::Int64, false),
Field::new("n_name", DataType::Utf8View, false),
Field::new("n_regionkey", DataType::Int64, false),
Field::new("n_comment", DataType::Utf8View, false),
]))
}