proof_of_sql/sql/proof_exprs/
dyn_proof_expr.rs1use super::{
2 AddExpr, AndExpr, CastExpr, ColumnExpr, EqualsExpr, InequalityExpr, LiteralExpr, MultiplyExpr,
3 NotExpr, OrExpr, PlaceholderExpr, ProofExpr, ScalingCastExpr, SubtractExpr,
4};
5use crate::{
6 base::{
7 database::{Column, ColumnRef, ColumnType, LiteralValue, Table},
8 map::{IndexMap, IndexSet},
9 proof::{PlaceholderResult, ProofError},
10 scalar::Scalar,
11 },
12 sql::{
13 proof::{FinalRoundBuilder, VerificationBuilder},
14 AnalyzeResult,
15 },
16};
17use alloc::boxed::Box;
18use bumpalo::Bump;
19use core::fmt::Debug;
20use serde::{Deserialize, Serialize};
21
22#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
24#[enum_dispatch::enum_dispatch]
25pub enum DynProofExpr {
26 Column(ColumnExpr),
28 And(AndExpr),
30 Or(OrExpr),
32 Not(NotExpr),
34 Literal(LiteralExpr),
36 Placeholder(PlaceholderExpr),
38 Equals(EqualsExpr),
40 Inequality(InequalityExpr),
42 Add(AddExpr),
44 Subtract(SubtractExpr),
46 Multiply(MultiplyExpr),
48 Cast(CastExpr),
50 ScalingCast(ScalingCastExpr),
52}
53impl DynProofExpr {
54 #[must_use]
56 pub fn new_column(column_ref: ColumnRef) -> Self {
57 Self::Column(ColumnExpr::new(column_ref))
58 }
59 pub fn try_new_and(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
61 AndExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::And)
62 }
63 pub fn try_new_or(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
65 OrExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Or)
66 }
67 pub fn try_new_not(expr: DynProofExpr) -> AnalyzeResult<Self> {
69 NotExpr::try_new(Box::new(expr)).map(DynProofExpr::Not)
70 }
71 #[must_use]
73 pub fn new_literal(value: LiteralValue) -> Self {
74 Self::Literal(LiteralExpr::new(value))
75 }
76 pub fn try_new_placeholder(id: usize, column_type: ColumnType) -> AnalyzeResult<Self> {
78 Ok(Self::Placeholder(PlaceholderExpr::try_new(
79 id,
80 column_type,
81 )?))
82 }
83 pub fn try_new_equals(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
85 EqualsExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Equals)
86 }
87 pub fn try_new_inequality(
89 lhs: DynProofExpr,
90 rhs: DynProofExpr,
91 is_lt: bool,
92 ) -> AnalyzeResult<Self> {
93 InequalityExpr::try_new(Box::new(lhs), Box::new(rhs), is_lt).map(DynProofExpr::Inequality)
94 }
95
96 pub fn try_new_add(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
98 AddExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Add)
99 }
100
101 pub fn try_new_subtract(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
103 SubtractExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Subtract)
104 }
105
106 pub fn try_new_multiply(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
108 MultiplyExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Multiply)
109 }
110
111 pub fn try_new_cast(from_column: DynProofExpr, to_datatype: ColumnType) -> AnalyzeResult<Self> {
113 CastExpr::try_new(Box::new(from_column), to_datatype).map(DynProofExpr::Cast)
114 }
115
116 pub fn try_new_scaling_cast(
118 from_expr: DynProofExpr,
119 to_datatype: ColumnType,
120 ) -> AnalyzeResult<Self> {
121 ScalingCastExpr::try_new(Box::new(from_expr), to_datatype).map(DynProofExpr::ScalingCast)
122 }
123}