uqa_sql/catalog/events/
removal.rs1use 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}