use super::DataType;
use crate::Value;
#[derive(Debug, Clone, PartialEq)]
pub struct Column {
pub name: String,
pub dtype: DataType,
pub nullable: bool,
pub tags: Vec<crate::Tag>,
pub initial_default: Option<Value>,
pub default_value: ColumnDefault,
pub field_id: Option<i64>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ColumnDefault {
Literal(Option<Value>),
Expression { dialect: String, expression: String },
}
impl Column {
pub fn new(name: String, dtype: DataType) -> Self {
Self {
name,
dtype,
nullable: true,
tags: Vec::new(),
initial_default: None,
default_value: ColumnDefault::Literal(None),
field_id: None,
}
}
pub fn nullable(mut self, nullable: bool) -> Self {
self.nullable = nullable;
self
}
pub fn tags(mut self, tags: Vec<crate::Tag>) -> Self {
self.tags = tags;
self
}
pub fn initial_default(mut self, default: Option<Value>) -> Self {
self.initial_default = default;
self
}
pub fn default_value(mut self, default: ColumnDefault) -> Self {
self.default_value = default;
self
}
pub fn field_id(mut self, field_id: Option<i64>) -> Self {
self.field_id = field_id;
self
}
}
pub(crate) struct FlattenedColumn {
pub column: Column,
pub parent_index: Option<usize>,
}
impl Column {
pub(crate) fn flatten(&self) -> Vec<FlattenedColumn> {
let mut result = Vec::new();
Column::flatten_into(self, None, &mut result);
result
}
fn flatten_into(
column: &Column,
parent_index: Option<usize>,
flattened: &mut Vec<FlattenedColumn>,
) {
flattened.push(FlattenedColumn {
column: column.clone(),
parent_index,
});
let parent_index = flattened.len() - 1;
match &column.dtype {
DataType::List(inner) => {
Column::flatten_into(inner, Some(parent_index), flattened);
}
DataType::Struct(fields) => {
for field in fields {
Column::flatten_into(field, Some(parent_index), flattened);
}
}
DataType::Map(key, value) => {
Column::flatten_into(key, Some(parent_index), flattened);
Column::flatten_into(value, Some(parent_index), flattened);
}
_ => {}
}
}
}