MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / execute_before_batch

Function execute_before_batch

nodedb/src/control/trigger/batch/before.rs:45–132  ·  view source on GitHub ↗
(
    state: &SharedState,
    identity: &AuthenticatedIdentity,
    tenant_id: TenantId,
    collection: &str,
    event: DmlEvent,
    mut rows: Vec<TriggerBatchRow>,
    cascade_depth: u32,
)

Source from the content-addressed store, hash-verified

43/// Returns the mutated batch + error accumulator.
44#[allow(clippy::too_many_arguments)]
45pub async fn execute_before_batch(
46 state: &SharedState,
47 identity: &AuthenticatedIdentity,
48 tenant_id: TenantId,
49 collection: &str,
50 event: DmlEvent,
51 mut rows: Vec<TriggerBatchRow>,
52 cascade_depth: u32,
53) -> crate::Result<BeforeBatchResult> {
54 let triggers = state
55 .trigger_registry
56 .get_matching(tenant_id.as_u64(), collection, event);
57
58 let before_triggers: Vec<_> = triggers
59 .into_iter()
60 .filter(|t| t.timing == TriggerTiming::Before)
61 .collect();
62
63 if before_triggers.is_empty() {
64 return Ok(BeforeBatchResult {
65 rows,
66 errors: ErrorAccumulator::new(),
67 });
68 }
69
70 crate::control::trigger::fire_common::check_cascade_depth(cascade_depth, collection)?;
71
72 let mut errors = ErrorAccumulator::new();
73
74 for trigger in &before_triggers {
75 let op_str = event.as_str();
76
77 // Pre-filter by WHEN clause.
78 let mask = when_filter::filter_batch_by_when(
79 &rows,
80 collection,
81 op_str,
82 trigger.when_condition.as_deref(),
83 );
84
85 let effective_identity = resolve_trigger_identity(trigger, identity, tenant_id);
86
87 let block = match state.block_cache.get_or_parse(&trigger.body_sql) {
88 Ok(b) => b,
89 Err(e) => {
90 tracing::warn!(trigger = %trigger.name, error = %e, "failed to parse BEFORE trigger body");
91 continue;
92 }
93 };
94
95 // Process each passing row.
96 for (idx, (row, &passes)) in rows.iter_mut().zip(mask.iter()).enumerate() {
97 if !passes {
98 continue;
99 }
100
101 let bindings = build_before_bindings(row, collection, op_str);
102

Callers

nothing calls this directly

Calls 15

check_cascade_depthFunction · 0.85
filter_batch_by_whenFunction · 0.85
resolve_trigger_identityFunction · 0.85
build_before_bindingsFunction · 0.85
get_matchingMethod · 0.80
collectMethod · 0.80
get_or_parseMethod · 0.80
iter_mutMethod · 0.80
execute_blockMethod · 0.80
take_new_mutationsMethod · 0.80
new_fields_mutMethod · 0.80
to_stringMethod · 0.80

Tested by

no test coverage detected