use quack_rs::prelude::{BindInfo, LogicalType, TypeId};
use super::type_desc::DuckTypeDesc;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct DuckResultSchema {
columns: Vec<(String, DuckTypeDesc)>,
}
impl DuckResultSchema {
#[must_use]
pub fn new(columns: Vec<(String, DuckTypeDesc)>) -> Self {
Self { columns }
}
#[must_use]
pub fn from_scalar_types<'a, I: IntoIterator<Item = (&'a str, TypeId)>>(columns: I) -> Self {
Self {
columns: columns
.into_iter()
.map(|(name, type_id)| (name.to_owned(), DuckTypeDesc::Scalar(type_id)))
.collect(),
}
}
#[must_use]
pub fn columns(&self) -> &[(String, DuckTypeDesc)] {
&self.columns
}
#[must_use]
pub fn column(&self, index: usize) -> Option<&(String, DuckTypeDesc)> {
self.columns.get(index)
}
#[must_use]
pub fn len(&self) -> usize {
self.columns.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.columns.is_empty()
}
pub fn declare(&self, bind: &BindInfo) {
for (name, desc) in &self.columns {
let logical_type = desc.to_logical_type();
bind.add_result_column_with_type(name, &logical_type);
}
}
#[must_use]
pub fn to_logical_types(&self) -> Vec<LogicalType> {
self.columns.iter().map(|(_, desc)| desc.to_logical_type()).collect()
}
}
impl From<Vec<(String, DuckTypeDesc)>> for DuckResultSchema {
fn from(columns: Vec<(String, DuckTypeDesc)>) -> Self {
Self::new(columns)
}
}