uqa_sql/catalog/events/
selection.rs1use super::{RuleCatalog, StoredRule, TriggerCatalog};
10use crate::ast::{RuleEvent, TriggerEvent, TriggerTiming};
11use std::collections::BTreeMap;
12use uqa_core::RelationIdentity;
13
14fn matching_rules<'a>(
15 catalog: &'a RuleCatalog,
16 relation: &RelationIdentity,
17 event: RuleEvent,
18) -> impl Iterator<Item = &'a StoredRule> {
19 catalog
20 .get(relation)
21 .into_iter()
22 .flat_map(BTreeMap::values)
23 .filter(move |rule| rule.definition.event == event)
24}
25
26pub fn rule_definitions(
27 catalog: &RuleCatalog,
28 relation: &RelationIdentity,
29 event: RuleEvent,
30) -> Vec<StoredRule> {
31 matching_rules(catalog, relation, event).cloned().collect()
32}
33
34pub fn active_rules(
35 catalog: &RuleCatalog,
36 relation: &RelationIdentity,
37 event: RuleEvent,
38 replica: bool,
39) -> Vec<StoredRule> {
40 matching_rules(catalog, relation, event)
41 .filter(|rule| {
42 if replica {
43 rule.enabled.fires_in_replica()
44 } else {
45 rule.enabled.fires_in_origin()
46 }
47 })
48 .cloned()
49 .collect()
50}
51
52pub fn has_trigger_definition(
53 catalog: &TriggerCatalog,
54 relation: &RelationIdentity,
55 timing: TriggerTiming,
56 event: TriggerEvent,
57 row: bool,
58) -> bool {
59 catalog.get(relation).is_some_and(|entries| {
60 entries.values().any(|trigger| {
61 trigger.definition.timing == timing
62 && trigger.definition.row == row
63 && trigger.definition.events.contains(&event)
64 })
65 })
66}