use super::{DenseFilterExpr, FilterExpr, GroupByExpr};
use crate::{
base::commitment::Commitment,
sql::proof::{ProofExpr, ProverEvaluate},
};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub enum ProofPlan<C: Commitment> {
Filter(FilterExpr<C>),
GroupBy(GroupByExpr<C>),
DenseFilter(DenseFilterExpr<C>),
}
impl<C: Commitment> ProofExpr<C> for ProofPlan<C> {
fn count(
&self,
builder: &mut crate::sql::proof::CountBuilder,
accessor: &dyn crate::base::database::MetadataAccessor,
) -> Result<(), crate::base::proof::ProofError> {
match self {
ProofPlan::Filter(expr) => expr.count(builder, accessor),
ProofPlan::GroupBy(expr) => expr.count(builder, accessor),
ProofPlan::DenseFilter(expr) => expr.count(builder, accessor),
}
}
fn get_length(&self, accessor: &dyn crate::base::database::MetadataAccessor) -> usize {
match self {
ProofPlan::Filter(expr) => expr.get_length(accessor),
ProofPlan::GroupBy(expr) => expr.get_length(accessor),
ProofPlan::DenseFilter(expr) => expr.get_length(accessor),
}
}
fn get_offset(&self, accessor: &dyn crate::base::database::MetadataAccessor) -> usize {
match self {
ProofPlan::Filter(expr) => expr.get_offset(accessor),
ProofPlan::GroupBy(expr) => expr.get_offset(accessor),
ProofPlan::DenseFilter(expr) => expr.get_offset(accessor),
}
}
#[tracing::instrument(name = "ProofPlan::verifier_evaluate", level = "debug", skip_all)]
fn verifier_evaluate(
&self,
builder: &mut crate::sql::proof::VerificationBuilder<C>,
accessor: &dyn crate::base::database::CommitmentAccessor<C>,
) -> Result<(), crate::base::proof::ProofError> {
match self {
ProofPlan::Filter(expr) => expr.verifier_evaluate(builder, accessor),
ProofPlan::GroupBy(expr) => expr.verifier_evaluate(builder, accessor),
ProofPlan::DenseFilter(expr) => expr.verifier_evaluate(builder, accessor),
}
}
fn get_column_result_fields(&self) -> Vec<crate::base::database::ColumnField> {
match self {
ProofPlan::Filter(expr) => expr.get_column_result_fields(),
ProofPlan::GroupBy(expr) => expr.get_column_result_fields(),
ProofPlan::DenseFilter(expr) => expr.get_column_result_fields(),
}
}
fn get_column_references(&self) -> std::collections::HashSet<crate::base::database::ColumnRef> {
match self {
ProofPlan::Filter(expr) => expr.get_column_references(),
ProofPlan::GroupBy(expr) => expr.get_column_references(),
ProofPlan::DenseFilter(expr) => expr.get_column_references(),
}
}
}
impl<C: Commitment> ProverEvaluate<C::Scalar> for ProofPlan<C> {
#[tracing::instrument(name = "ProofPlan::result_evaluate", level = "debug", skip_all)]
fn result_evaluate<'a>(
&self,
builder: &mut crate::sql::proof::ResultBuilder<'a>,
alloc: &'a bumpalo::Bump,
accessor: &'a dyn crate::base::database::DataAccessor<C::Scalar>,
) {
match self {
ProofPlan::Filter(expr) => expr.result_evaluate(builder, alloc, accessor),
ProofPlan::GroupBy(expr) => expr.result_evaluate(builder, alloc, accessor),
ProofPlan::DenseFilter(expr) => expr.result_evaluate(builder, alloc, accessor),
}
}
#[tracing::instrument(name = "ProofPlan::prover_evaluate", level = "debug", skip_all)]
fn prover_evaluate<'a>(
&self,
builder: &mut crate::sql::proof::ProofBuilder<'a, C::Scalar>,
alloc: &'a bumpalo::Bump,
accessor: &'a dyn crate::base::database::DataAccessor<C::Scalar>,
) {
match self {
ProofPlan::Filter(expr) => expr.prover_evaluate(builder, alloc, accessor),
ProofPlan::GroupBy(expr) => expr.prover_evaluate(builder, alloc, accessor),
ProofPlan::DenseFilter(expr) => expr.prover_evaluate(builder, alloc, accessor),
}
}
}