proof_of_sql/sql/proof_plans/
dyn_proof_plan.rs1use super::{
2 EmptyExec, FilterExec, GroupByExec, ProjectionExec, SliceExec, SortMergeJoinExec, TableExec,
3 UnionExec,
4};
5use crate::{
6 base::{
7 database::{
8 ColumnField, ColumnRef, LiteralValue, OwnedTable, Table, TableEvaluation, TableRef,
9 },
10 map::{IndexMap, IndexSet},
11 proof::{PlaceholderResult, ProofError},
12 scalar::Scalar,
13 },
14 sql::{
15 proof::{
16 FinalRoundBuilder, FirstRoundBuilder, ProofPlan, ProverEvaluate, VerificationBuilder,
17 },
18 proof_exprs::{AliasedDynProofExpr, ColumnExpr, DynProofExpr, TableExpr},
19 },
20};
21use alloc::{boxed::Box, vec::Vec};
22use bumpalo::Bump;
23use serde::{Deserialize, Serialize};
24use sqlparser::ast::Ident;
25
26#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
28#[enum_dispatch::enum_dispatch]
29pub enum DynProofPlan {
30 Empty(EmptyExec),
32 Table(TableExec),
34 Projection(ProjectionExec),
39 GroupBy(GroupByExec),
49 Filter(FilterExec),
54 Slice(SliceExec),
59 Union(UnionExec),
69 SortMergeJoin(SortMergeJoinExec),
75}
76
77impl DynProofPlan {
78 #[must_use]
80 pub fn new_empty() -> Self {
81 Self::Empty(EmptyExec::new())
82 }
83
84 #[must_use]
86 pub fn new_table(table_ref: TableRef, schema: Vec<ColumnField>) -> Self {
87 Self::Table(TableExec::new(table_ref, schema))
88 }
89
90 #[must_use]
92 pub fn new_projection(aliased_results: Vec<AliasedDynProofExpr>, input: DynProofPlan) -> Self {
93 Self::Projection(ProjectionExec::new(aliased_results, Box::new(input)))
94 }
95
96 #[must_use]
98 pub fn new_filter(
99 aliased_results: Vec<AliasedDynProofExpr>,
100 input: TableExpr,
101 filter_expr: DynProofExpr,
102 ) -> Self {
103 Self::Filter(FilterExec::new(aliased_results, input, filter_expr))
104 }
105
106 #[must_use]
108 pub fn new_group_by(
109 group_by_exprs: Vec<ColumnExpr>,
110 sum_expr: Vec<AliasedDynProofExpr>,
111 count_alias: Ident,
112 table: TableExpr,
113 where_clause: DynProofExpr,
114 ) -> Self {
115 Self::GroupBy(GroupByExec::new(
116 group_by_exprs,
117 sum_expr,
118 count_alias,
119 table,
120 where_clause,
121 ))
122 }
123
124 #[must_use]
126 pub fn new_slice(input: DynProofPlan, skip: usize, fetch: Option<usize>) -> Self {
127 Self::Slice(SliceExec::new(Box::new(input), skip, fetch))
128 }
129
130 #[must_use]
132 pub fn new_union(inputs: Vec<DynProofPlan>, schema: Vec<ColumnField>) -> Self {
133 Self::Union(UnionExec::new(inputs, schema))
134 }
135}