use super::{
AddExpr, AndExpr, CastExpr, ColumnExpr, EqualsExpr, InequalityExpr, LiteralExpr, MultiplyExpr,
NotExpr, OrExpr, PlaceholderExpr, ProofExpr, ScalingCastExpr, SubtractExpr,
};
use crate::{
base::{
database::{Column, ColumnRef, ColumnType, LiteralValue, Table},
map::{IndexMap, IndexSet},
proof::{PlaceholderResult, ProofError},
scalar::Scalar,
},
sql::{
proof::{FinalRoundBuilder, VerificationBuilder},
AnalyzeResult,
},
};
use alloc::boxed::Box;
use bumpalo::Bump;
use core::fmt::Debug;
use serde::{Deserialize, Serialize};
use sqlparser::ast::Ident;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[enum_dispatch::enum_dispatch]
pub enum DynProofExpr {
Column(ColumnExpr),
And(AndExpr),
Or(OrExpr),
Not(NotExpr),
Literal(LiteralExpr),
Placeholder(PlaceholderExpr),
Equals(EqualsExpr),
Inequality(InequalityExpr),
Add(AddExpr),
Subtract(SubtractExpr),
Multiply(MultiplyExpr),
Cast(CastExpr),
ScalingCast(ScalingCastExpr),
}
impl DynProofExpr {
#[must_use]
pub fn new_column(column_ref: ColumnRef) -> Self {
Self::Column(ColumnExpr::new(column_ref))
}
pub fn try_new_and(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
AndExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::And)
}
pub fn try_new_or(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
OrExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Or)
}
pub fn try_new_not(expr: DynProofExpr) -> AnalyzeResult<Self> {
NotExpr::try_new(Box::new(expr)).map(DynProofExpr::Not)
}
#[must_use]
pub fn new_literal(value: LiteralValue) -> Self {
Self::Literal(LiteralExpr::new(value))
}
pub fn try_new_placeholder(id: usize, column_type: ColumnType) -> AnalyzeResult<Self> {
Ok(Self::Placeholder(PlaceholderExpr::try_new(
id,
column_type,
)?))
}
pub fn try_new_equals(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
EqualsExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Equals)
}
pub fn try_new_inequality(
lhs: DynProofExpr,
rhs: DynProofExpr,
is_lt: bool,
) -> AnalyzeResult<Self> {
InequalityExpr::try_new(Box::new(lhs), Box::new(rhs), is_lt).map(DynProofExpr::Inequality)
}
pub fn try_new_add(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
AddExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Add)
}
pub fn try_new_subtract(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
SubtractExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Subtract)
}
pub fn try_new_multiply(lhs: DynProofExpr, rhs: DynProofExpr) -> AnalyzeResult<Self> {
MultiplyExpr::try_new(Box::new(lhs), Box::new(rhs)).map(DynProofExpr::Multiply)
}
pub fn try_new_cast(from_column: DynProofExpr, to_datatype: ColumnType) -> AnalyzeResult<Self> {
CastExpr::try_new(Box::new(from_column), to_datatype).map(DynProofExpr::Cast)
}
pub fn try_new_scaling_cast(
from_expr: DynProofExpr,
to_datatype: ColumnType,
) -> AnalyzeResult<Self> {
ScalingCastExpr::try_new(Box::new(from_expr), to_datatype).map(DynProofExpr::ScalingCast)
}
}