use std::sync::Arc;
use arrow::compute::concat_batches;
use arrow_array::RecordBatch;
use arrow_schema::{Field, Schema};
use crate::error::{GraphArError, Result};
pub fn merge_property_groups(groups: &[Vec<RecordBatch>]) -> Result<RecordBatch> {
let mut flattened = Vec::new();
for batches in groups {
if batches.is_empty() {
continue;
}
let schema = batches[0].schema();
flattened.push(concat_batches(&schema, batches)?);
}
if flattened.is_empty() {
return Err(GraphArError::Other(
"merge_property_groups: no batches to merge".into(),
));
}
let row_count = flattened[0].num_rows();
let mut fields: Vec<Field> = Vec::new();
let mut columns = Vec::new();
for batch in &flattened {
if batch.num_rows() != row_count {
return Err(GraphArError::Other(format!(
"merge_property_groups: row count mismatch ({} vs {})",
batch.num_rows(),
row_count
)));
}
for (field, column) in batch.schema().fields().iter().zip(batch.columns()) {
if fields.iter().any(|f: &Field| f.name() == field.name()) {
return Err(GraphArError::Other(format!(
"merge_property_groups: duplicate column '{}'",
field.name()
)));
}
fields.push(field.as_ref().clone());
columns.push(column.clone());
}
}
Ok(RecordBatch::try_new(
Arc::new(Schema::new(fields)),
columns,
)?)
}