use super::event::{LineageEvent, LineageEventType};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CausalLineage {
pub events: Vec<LineageEvent>,
}
impl CausalLineage {
pub fn new() -> Self {
Self::default()
}
pub fn add_event(&mut self, event: LineageEvent) {
self.events.push(event);
self.events.sort();
}
pub fn events_in_order(&self) -> &[LineageEvent] {
&self.events
}
pub fn events_for_run(&self, run_id: &str) -> Vec<&LineageEvent> {
self.events.iter().filter(|e| e.run_id == run_id).collect()
}
pub fn events_of_type(&self, event_type: LineageEventType) -> Vec<&LineageEvent> {
self.events.iter().filter(|e| e.event_type == event_type).collect()
}
pub fn latest_event_for_run(&self, run_id: &str) -> Option<&LineageEvent> {
self.events.iter().rev().find(|e| e.run_id == run_id)
}
pub fn run_precedes(&self, run_a: &str, run_b: &str) -> bool {
let a_events = self.events_for_run(run_a);
let b_events = self.events_for_run(run_b);
if a_events.is_empty() || b_events.is_empty() {
return false;
}
let b_first = b_events.first().expect("b_events is non-empty (checked above)");
a_events.iter().all(|a| a.timestamp.happens_before(&b_first.timestamp))
}
pub fn len(&self) -> usize {
self.events.len()
}
pub fn is_empty(&self) -> bool {
self.events.is_empty()
}
}