use super::{AliasedDynProofExpr, ColumnExpr, DynProofExpr, TableExpr};
use crate::base::{
database::{ColumnRef, ColumnType, LiteralValue, SchemaAccessor, TableRef},
math::{decimal::Precision, i256::I256},
scalar::Scalar,
};
use sqlparser::ast::Ident;
pub fn col_ref(tab: &TableRef, name: &str, accessor: &impl SchemaAccessor) -> ColumnRef {
let name: Ident = name.into();
let type_col = accessor.lookup_column(tab, &name).unwrap();
ColumnRef::new(tab.clone(), name, type_col)
}
pub fn column(tab: &TableRef, name: &str, accessor: &impl SchemaAccessor) -> DynProofExpr {
let name: Ident = name.into();
let type_col = accessor.lookup_column(tab, &name).unwrap();
DynProofExpr::Column(ColumnExpr::new(ColumnRef::new(tab.clone(), name, type_col)))
}
pub fn equal(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_equals(left, right).unwrap()
}
pub fn lt(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_inequality(left, right, true).unwrap()
}
pub fn gt(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_inequality(left, right, false).unwrap()
}
pub fn lte(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
not(DynProofExpr::try_new_inequality(left, right, false).unwrap())
}
pub fn gte(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
not(DynProofExpr::try_new_inequality(left, right, true).unwrap())
}
pub fn not(expr: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_not(expr).unwrap()
}
pub fn and(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_and(left, right).unwrap()
}
pub fn or(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_or(left, right).unwrap()
}
pub fn add(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_add(left, right).unwrap()
}
pub fn subtract(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_subtract(left, right).unwrap()
}
pub fn multiply(left: DynProofExpr, right: DynProofExpr) -> DynProofExpr {
DynProofExpr::try_new_multiply(left, right).unwrap()
}
pub fn cast(left: DynProofExpr, right: ColumnType) -> DynProofExpr {
DynProofExpr::try_new_cast(left, right).unwrap()
}
pub fn scaling_cast(left: DynProofExpr, right: ColumnType) -> DynProofExpr {
DynProofExpr::try_new_scaling_cast(left, right).unwrap()
}
pub fn const_bool(val: bool) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::Boolean(val))
}
pub fn const_smallint(val: i16) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::SmallInt(val))
}
pub fn const_int(val: i32) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::Int(val))
}
pub fn const_bigint(val: i64) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::BigInt(val))
}
pub fn const_int128(val: i128) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::Int128(val))
}
pub fn const_varchar(val: &str) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::VarChar(val.to_string()))
}
pub fn const_varbinary(val: &[u8]) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::VarBinary(val.to_vec()))
}
pub fn const_scalar<S: Scalar, T: Into<S>>(val: T) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::Scalar(val.into().into()))
}
pub fn const_decimal75<T: Into<I256>>(precision: u8, scale: i8, val: T) -> DynProofExpr {
DynProofExpr::new_literal(LiteralValue::Decimal75(
Precision::new(precision).unwrap(),
scale,
val.into(),
))
}
pub fn aliased_placeholder(index: usize, col_type: ColumnType, alias: &str) -> AliasedDynProofExpr {
AliasedDynProofExpr {
expr: DynProofExpr::try_new_placeholder(index, col_type).unwrap(),
alias: alias.into(),
}
}
pub fn tab(tab: &TableRef) -> TableExpr {
TableExpr {
table_ref: tab.clone(),
}
}
pub fn aliased_plan(expr: DynProofExpr, alias: &str) -> AliasedDynProofExpr {
AliasedDynProofExpr {
expr,
alias: alias.into(),
}
}
pub fn col_expr_plan(
tab: &TableRef,
name: &str,
accessor: &impl SchemaAccessor,
) -> AliasedDynProofExpr {
AliasedDynProofExpr {
expr: DynProofExpr::Column(ColumnExpr::new(col_ref(tab, name, accessor))),
alias: name.into(),
}
}
pub fn cols_expr_plan(
tab: &TableRef,
names: &[&str],
accessor: &impl SchemaAccessor,
) -> Vec<AliasedDynProofExpr> {
names
.iter()
.map(|name| col_expr_plan(tab, name, accessor))
.collect()
}
pub fn col_expr(tab: &TableRef, name: &str, accessor: &impl SchemaAccessor) -> ColumnExpr {
ColumnExpr::new(col_ref(tab, name, accessor))
}
pub fn cols_expr(
tab: &TableRef,
names: &[&str],
accessor: &impl SchemaAccessor,
) -> Vec<ColumnExpr> {
names
.iter()
.map(|name| col_expr(tab, name, accessor))
.collect()
}
pub fn sum_expr(expr: DynProofExpr, alias: &str) -> AliasedDynProofExpr {
AliasedDynProofExpr {
expr,
alias: alias.into(),
}
}