use super::{target_row, CteScope, SQLError, SQLParam, Value, ViewDmlTarget};
use crate::mutation::{
constraints::{trigger_view_check_violation, ConstraintContext},
expressions::eval_mutation_expr,
rows::context::MutationExpressionContext,
};
use uqa_sql::plan::ViewCheckPlan;
pub struct TriggerViewChecks<'a, S: Clone + 'static> {
pub expressions: MutationExpressionContext<'a, S>,
pub constraints: ConstraintContext<'a>,
pub target: &'a ViewDmlTarget,
pub target_qualifier: &'a str,
pub checks: &'a [ViewCheckPlan],
pub supplied: &'a [String],
pub params: &'a [SQLParam],
pub scope: &'a CteScope<S>,
}
impl<S: Clone + 'static> TriggerViewChecks<'_, S> {
pub fn validate(&self, values: &[Value]) -> Result<(), SQLError> {
if self.checks.is_empty() {
return Ok(());
}
let row = target_row(self.target, self.target_qualifier, values)?;
for check in self.checks {
let value = eval_mutation_expr(
self.expressions,
self.scope,
&check.predicate,
Some(&row),
self.params,
)?;
if !uqa_sql::expr::truthy(&value) {
return Err(trigger_view_check_violation(
self.constraints,
&check.view,
self.target,
self.supplied,
values,
));
}
}
Ok(())
}
}