proof_of_sql/sql/postprocessing/
select_postprocessing.rsuse super::{PostprocessingResult, PostprocessingStep};
use crate::base::{
database::{OwnedColumn, OwnedTable},
map::IndexMap,
scalar::Scalar,
};
use alloc::vec::Vec;
use proof_of_sql_parser::{intermediate_ast::AliasedResultExpr, Identifier};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SelectPostprocessing {
aliased_result_exprs: Vec<AliasedResultExpr>,
}
impl SelectPostprocessing {
pub fn new(aliased_result_exprs: Vec<AliasedResultExpr>) -> Self {
Self {
aliased_result_exprs,
}
}
}
impl<S: Scalar> PostprocessingStep<S> for SelectPostprocessing {
fn apply(&self, owned_table: OwnedTable<S>) -> PostprocessingResult<OwnedTable<S>> {
let cols: IndexMap<Identifier, OwnedColumn<S>> = self
.aliased_result_exprs
.iter()
.map(
|aliased_result_expr| -> PostprocessingResult<(Identifier, OwnedColumn<S>)> {
let result_column = owned_table.evaluate(&aliased_result_expr.expr)?;
Ok((aliased_result_expr.alias, result_column))
},
)
.collect::<PostprocessingResult<_>>()?;
Ok(OwnedTable::try_new(cols)?)
}
}