use rudb_common::{LogicalType, Result, Value};
use rudb_vector::{Chunk, VECTOR_SIZE, Vector};
use crate::operator::Operator;
pub(crate) fn collect(input: &mut dyn Operator) -> Result<Vec<Vec<Value>>> {
let mut rows = Vec::new();
while let Some(chunk) = input.next()? {
for row in 0..chunk.len() {
rows.push(chunk.row(row).collect());
}
}
Ok(rows)
}
pub(crate) fn chunks(types: &[LogicalType], rows: &[Vec<Value>]) -> Result<Vec<Chunk>> {
let mut built = Vec::new();
for batch in rows.chunks(VECTOR_SIZE) {
let mut columns = Vec::with_capacity(types.len());
for (position, ty) in types.iter().enumerate() {
let down: Vec<Value> =
batch.iter().map(|row| row.get(position).cloned().unwrap_or(Value::Null)).collect();
columns.push(Vector::from_values(ty.clone(), &down)?);
}
built.push(Chunk::with_rows(columns, batch.len())?);
}
Ok(built)
}