1use aether_ast::{AttributeId, ExtensionalFact, PhaseGraph, PredicateId, RuleAst, RuleId};
2use indexmap::IndexMap;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
6pub struct DependencyGraph {
7 pub edges: IndexMap<PredicateId, Vec<PredicateId>>,
8}
9
10impl DependencyGraph {
11 pub fn add_edge(&mut self, head: PredicateId, dependency: PredicateId) {
12 self.edges.entry(head).or_default().push(dependency);
13 }
14}
15
16#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
17pub struct StronglyConnectedComponent {
18 pub id: usize,
19 pub predicates: Vec<PredicateId>,
20}
21
22#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
23pub struct DeltaRulePlan {
24 pub rule_id: RuleId,
25 pub target_predicate: PredicateId,
26 pub source_predicates: Vec<PredicateId>,
27}
28
29#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
30pub struct PhasePlan {
31 pub phase_graph: PhaseGraph,
32 pub sccs: Vec<StronglyConnectedComponent>,
33}
34
35#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
36pub struct CompiledProgram {
37 pub dependency_graph: DependencyGraph,
38 pub sccs: Vec<StronglyConnectedComponent>,
39 pub phase_graph: PhaseGraph,
40 pub delta_plans: Vec<DeltaRulePlan>,
41 pub materialized: Vec<PredicateId>,
42 pub rules: Vec<RuleAst>,
43 pub extensional_bindings: IndexMap<PredicateId, AttributeId>,
44 pub facts: Vec<ExtensionalFact>,
45 pub predicate_strata: IndexMap<PredicateId, usize>,
46}