use super::ProofExpr;
use crate::{
base::{
database::{Column, ColumnRef, ColumnType, LiteralValue, Table},
map::{IndexMap, IndexSet},
proof::{PlaceholderResult, ProofError},
scalar::Scalar,
},
sql::proof::{FinalRoundBuilder, VerificationBuilder},
utils::log,
};
use bumpalo::Bump;
use serde::{Deserialize, Serialize};
use sqlparser::ast::Ident;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct LiteralExpr {
value: LiteralValue,
}
impl LiteralExpr {
pub fn new(value: LiteralValue) -> Self {
Self { value }
}
pub fn value(&self) -> &LiteralValue {
&self.value
}
}
impl ProofExpr for LiteralExpr {
fn data_type(&self) -> ColumnType {
self.value.column_type()
}
#[tracing::instrument(name = "LiteralExpr::first_round_evaluate", level = "debug", skip_all)]
fn first_round_evaluate<'a, S: Scalar>(
&self,
alloc: &'a Bump,
table: &Table<'a, S>,
_params: &[LiteralValue],
) -> PlaceholderResult<Column<'a, S>> {
log::log_memory_usage("Start");
let res = Column::from_literal_with_length(&self.value, table.num_rows(), alloc);
log::log_memory_usage("End");
Ok(res)
}
#[tracing::instrument(name = "LiteralExpr::final_round_evaluate", level = "debug", skip_all)]
fn final_round_evaluate<'a, S: Scalar>(
&self,
_builder: &mut FinalRoundBuilder<'a, S>,
alloc: &'a Bump,
table: &Table<'a, S>,
_params: &[LiteralValue],
) -> PlaceholderResult<Column<'a, S>> {
log::log_memory_usage("Start");
let table_length = table.num_rows();
let res = Column::from_literal_with_length(&self.value, table_length, alloc);
log::log_memory_usage("End");
Ok(res)
}
fn verifier_evaluate<S: Scalar>(
&self,
_builder: &mut impl VerificationBuilder<S>,
_accessor: &IndexMap<Ident, S>,
chi_eval: S,
_params: &[LiteralValue],
) -> Result<S, ProofError> {
Ok(chi_eval * self.value.to_scalar())
}
fn get_column_references(&self, _columns: &mut IndexSet<ColumnRef>) {}
}