use super::ColumnType;
use crate::base::{
math::decimal::Precision,
scalar::Scalar,
time::timestamp::{PoSQLTimeUnit, PoSQLTimeZone},
};
#[derive(Debug, PartialEq, Clone, Eq)]
#[non_exhaustive]
pub enum OwnedColumn<S: Scalar> {
Boolean(Vec<bool>),
SmallInt(Vec<i16>),
Int(Vec<i32>),
BigInt(Vec<i64>),
VarChar(Vec<String>),
Int128(Vec<i128>),
Decimal75(Precision, i8, Vec<S>),
Scalar(Vec<S>),
TimestampTZ(PoSQLTimeUnit, PoSQLTimeZone, Vec<i64>),
}
impl<S: Scalar> OwnedColumn<S> {
pub fn len(&self) -> usize {
match self {
OwnedColumn::Boolean(col) => col.len(),
OwnedColumn::SmallInt(col) => col.len(),
OwnedColumn::Int(col) => col.len(),
OwnedColumn::BigInt(col) => col.len(),
OwnedColumn::VarChar(col) => col.len(),
OwnedColumn::Int128(col) => col.len(),
OwnedColumn::Decimal75(_, _, col) => col.len(),
OwnedColumn::Scalar(col) => col.len(),
OwnedColumn::TimestampTZ(_, _, col) => col.len(),
}
}
pub fn is_empty(&self) -> bool {
match self {
OwnedColumn::Boolean(col) => col.is_empty(),
OwnedColumn::SmallInt(col) => col.is_empty(),
OwnedColumn::Int(col) => col.is_empty(),
OwnedColumn::BigInt(col) => col.is_empty(),
OwnedColumn::VarChar(col) => col.is_empty(),
OwnedColumn::Int128(col) => col.is_empty(),
OwnedColumn::Scalar(col) => col.is_empty(),
OwnedColumn::Decimal75(_, _, col) => col.is_empty(),
OwnedColumn::TimestampTZ(_, _, col) => col.is_empty(),
}
}
pub fn column_type(&self) -> ColumnType {
match self {
OwnedColumn::Boolean(_) => ColumnType::Boolean,
OwnedColumn::SmallInt(_) => ColumnType::SmallInt,
OwnedColumn::Int(_) => ColumnType::Int,
OwnedColumn::BigInt(_) => ColumnType::BigInt,
OwnedColumn::VarChar(_) => ColumnType::VarChar,
OwnedColumn::Int128(_) => ColumnType::Int128,
OwnedColumn::Scalar(_) => ColumnType::Scalar,
OwnedColumn::Decimal75(precision, scale, _) => {
ColumnType::Decimal75(*precision, *scale)
}
OwnedColumn::TimestampTZ(tu, tz, _) => ColumnType::TimestampTZ(*tu, *tz),
}
}
#[cfg(test)]
pub fn i16_iter(&self) -> impl Iterator<Item = &i16> {
match self {
OwnedColumn::SmallInt(col) => col.iter(),
_ => panic!("Expected SmallInt column"),
}
}
#[cfg(test)]
pub fn i32_iter(&self) -> impl Iterator<Item = &i32> {
match self {
OwnedColumn::Int(col) => col.iter(),
_ => panic!("Expected Int column"),
}
}
#[cfg(test)]
pub fn i64_iter(&self) -> impl Iterator<Item = &i64> {
match self {
OwnedColumn::BigInt(col) => col.iter(),
OwnedColumn::TimestampTZ(_, _, col) => col.iter(),
_ => panic!("Expected TimestampTZ or BigInt column"),
}
}
#[cfg(test)]
pub fn i128_iter(&self) -> impl Iterator<Item = &i128> {
match self {
OwnedColumn::Int128(col) => col.iter(),
_ => panic!("Expected Int128 column"),
}
}
#[cfg(test)]
pub fn bool_iter(&self) -> impl Iterator<Item = &bool> {
match self {
OwnedColumn::Boolean(col) => col.iter(),
_ => panic!("Expected Boolean column"),
}
}
#[cfg(test)]
pub fn scalar_iter(&self) -> impl Iterator<Item = &S> {
match self {
OwnedColumn::Scalar(col) => col.iter(),
OwnedColumn::Decimal75(_, _, col) => col.iter(),
_ => panic!("Expected Scalar or Decimal75 column"),
}
}
#[cfg(test)]
pub fn string_iter(&self) -> impl Iterator<Item = &String> {
match self {
OwnedColumn::VarChar(col) => col.iter(),
_ => panic!("Expected VarChar column"),
}
}
}