Skip to main content

uqa_sql/catalog/events/
selection.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Rule and trigger predicates shared by live execution and retained metadata inquiries.
8
9use 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}