use crate::enums::error::MinarrowError;
#[cfg(feature = "cube")]
use crate::Cube;
#[cfg(feature = "views")]
use crate::TableV;
use crate::{FieldArray, Table};
pub trait Combine {
type Element;
type Output;
fn combine(&self, elements: Vec<Self::Element>) -> Result<Self::Output, MinarrowError>;
}
impl Combine for Table {
type Element = FieldArray;
type Output = Table;
fn combine(&self, elements: Vec<Self::Element>) -> Result<Self::Output, MinarrowError> {
let n_rows = elements.first().map(|fa| fa.array.len()).unwrap_or(0);
for (i, fa) in elements.iter().enumerate() {
if fa.array.len() != n_rows {
return Err(MinarrowError::ColumnLengthMismatch {
col: i,
expected: n_rows,
found: fa.array.len(),
});
}
}
#[allow(unused_mut)]
let mut table = Table::build(elements, n_rows, self.name.clone());
#[cfg(feature = "table_metadata")]
{
table.metadata = self.metadata.clone();
}
Ok(table)
}
}
#[cfg(feature = "views")]
impl Combine for TableV {
type Element = FieldArray;
type Output = Table;
fn combine(&self, elements: Vec<Self::Element>) -> Result<Self::Output, MinarrowError> {
let n_rows = elements.first().map(|fa| fa.array.len()).unwrap_or(0);
for (i, fa) in elements.iter().enumerate() {
if fa.array.len() != n_rows {
return Err(MinarrowError::ColumnLengthMismatch {
col: i,
expected: n_rows,
found: fa.array.len(),
});
}
}
Ok(Table::build(elements, n_rows, self.name.clone()))
}
}
#[cfg(feature = "cube")]
impl Combine for Cube {
type Element = Table;
type Output = Cube;
fn combine(&self, elements: Vec<Self::Element>) -> Result<Self::Output, MinarrowError> {
if elements.len() != self.tables.len() {
return Err(MinarrowError::ShapeError {
message: format!(
"Cube::combine: expected {} elements (one per group), got {}",
self.tables.len(),
elements.len()
),
});
}
Ok(Cube::from_tables(
elements,
self.name.clone(),
self.third_dim_index.clone(),
))
}
}