Skip to main content

uqa_sql/catalog/events/
removal.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Candidate event catalogs and constraint identities for relation and dependency removal.
8use super::{RuleCatalog, TriggerCatalog};
9use crate::catalog::constraints::ConstraintIdentity;
10use uqa_core::RelationIdentity;
11pub struct RemovedRelationEvents {
12    pub triggers: TriggerCatalog,
13    pub rules: RuleCatalog,
14    pub constraints: Vec<ConstraintIdentity>,
15}
16pub fn removed_relation_events(
17    triggers: &TriggerCatalog,
18    rules: &RuleCatalog,
19    relation: &RelationIdentity,
20) -> Result<Option<RemovedRelationEvents>, String> {
21    let qualified = relation.qualified_name();
22    let referenced_by_trigger = triggers.values().any(|entries| {
23        entries.values().any(|trigger| {
24            trigger.definition.referenced_table.as_deref() == Some(qualified.as_str())
25        })
26    });
27    if !triggers.contains_key(relation) && !rules.contains_key(relation) && !referenced_by_trigger {
28        return Ok(None);
29    }
30    let mut next_triggers = triggers.clone();
31    let mut next_rules = rules.clone();
32    let mut removed_constraint_identities = Vec::new();
33    for (trigger_relation, entries) in triggers {
34        for trigger in entries.values() {
35            if trigger.definition.constraint
36                && (trigger_relation == relation
37                    || trigger.definition.referenced_table.as_deref() == Some(qualified.as_str()))
38            {
39                removed_constraint_identities.push(trigger.constraint_identity().map_err(
40                    |error| format!("resolve dropped constraint-trigger identity: {error}"),
41                )?);
42            }
43        }
44    }
45    next_triggers.remove(relation);
46    for entries in next_triggers.values_mut() {
47        entries.retain(|_, trigger| {
48            trigger.definition.referenced_table.as_deref() != Some(qualified.as_str())
49        });
50    }
51    next_triggers.retain(|_, entries| !entries.is_empty());
52    next_rules.remove(relation);
53
54    Ok(Some(RemovedRelationEvents {
55        triggers: next_triggers,
56        rules: next_rules,
57        constraints: removed_constraint_identities,
58    }))
59}