proof_of_sql/sql/postprocessing/
select_postprocessing.rs1use super::{PostprocessingResult, PostprocessingStep};
2use crate::base::{
3 database::{OwnedColumn, OwnedTable},
4 map::IndexMap,
5 scalar::Scalar,
6};
7use alloc::vec::Vec;
8use proof_of_sql_parser::intermediate_ast::AliasedResultExpr;
9use serde::{Deserialize, Serialize};
10use sqlparser::ast::Ident;
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14pub struct SelectPostprocessing {
15 aliased_result_exprs: Vec<AliasedResultExpr>,
17}
18
19impl SelectPostprocessing {
20 #[must_use]
22 pub fn new(aliased_result_exprs: Vec<AliasedResultExpr>) -> Self {
23 Self {
24 aliased_result_exprs,
25 }
26 }
27}
28
29impl<S: Scalar> PostprocessingStep<S> for SelectPostprocessing {
30 fn apply(&self, owned_table: OwnedTable<S>) -> PostprocessingResult<OwnedTable<S>> {
32 let cols: IndexMap<Ident, OwnedColumn<S>> = self
33 .aliased_result_exprs
34 .iter()
35 .map(
36 |aliased_result_expr| -> PostprocessingResult<(Ident, OwnedColumn<S>)> {
37 let result_column = owned_table.evaluate(&aliased_result_expr.expr)?;
38 Ok((aliased_result_expr.alias.into(), result_column))
39 },
40 )
41 .collect::<PostprocessingResult<_>>()?;
42 Ok(OwnedTable::try_new(cols)?)
43 }
44}