use crate::control::planner::procedural::executor::bindings::RowBindings;
use crate::control::security::catalog::trigger_types::{
TriggerExecutionMode, TriggerGranularity, TriggerTiming,
};
use crate::control::security::identity::AuthenticatedIdentity;
use crate::control::state::SharedState;
use crate::types::TenantId;
use super::fire_common::{check_cascade_depth, fire_triggers};
use super::registry::DmlEvent;
pub async fn fire_after_statement(
state: &SharedState,
identity: &AuthenticatedIdentity,
tenant_id: TenantId,
collection: &str,
event: DmlEvent,
cascade_depth: u32,
mode_filter: Option<TriggerExecutionMode>,
) -> crate::Result<()> {
let triggers = state
.trigger_registry
.get_matching(tenant_id.as_u64(), collection, event);
let statement_triggers: Vec<_> = triggers
.into_iter()
.filter(|t| t.timing == TriggerTiming::After)
.filter(|t| t.granularity == TriggerGranularity::Statement)
.filter(|t| mode_filter.is_none() || Some(t.execution_mode) == mode_filter)
.collect();
if statement_triggers.is_empty() {
return Ok(());
}
check_cascade_depth(cascade_depth, collection)?;
let bindings = RowBindings::statement(collection, event.as_str());
fire_triggers(
state,
identity,
tenant_id,
collection,
&statement_triggers,
&bindings,
cascade_depth,
)
.await
}