proof_of_sql/sql/postprocessing/
select_postprocessing.rs

1use 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/// The select expression used to select, reorder, and apply alias transformations
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14pub struct SelectPostprocessing {
15    /// The aliased result expressions we select
16    aliased_result_exprs: Vec<AliasedResultExpr>,
17}
18
19impl SelectPostprocessing {
20    /// Create a new `SelectPostprocessing` node.
21    #[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    /// Apply the select transformation to the given `OwnedTable`.
31    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}