Skip to main content

kyu_delta/
stats.rs

1/// Statistics returned after processing a `DeltaBatch`.
2#[derive(Clone, Debug, Default, PartialEq, Eq)]
3pub struct DeltaStats {
4    pub nodes_created: u64,
5    pub nodes_updated: u64,
6    pub nodes_deleted: u64,
7    pub edges_created: u64,
8    pub edges_updated: u64,
9    pub edges_deleted: u64,
10    pub total_deltas: u64,
11    pub elapsed_micros: u64,
12}
13
14impl DeltaStats {
15    pub fn total_mutations(&self) -> u64 {
16        self.nodes_created
17            + self.nodes_updated
18            + self.nodes_deleted
19            + self.edges_created
20            + self.edges_updated
21            + self.edges_deleted
22    }
23
24    /// Merge stats from another batch (additive).
25    pub fn merge(&mut self, other: &DeltaStats) {
26        self.nodes_created += other.nodes_created;
27        self.nodes_updated += other.nodes_updated;
28        self.nodes_deleted += other.nodes_deleted;
29        self.edges_created += other.edges_created;
30        self.edges_updated += other.edges_updated;
31        self.edges_deleted += other.edges_deleted;
32        self.total_deltas += other.total_deltas;
33        self.elapsed_micros += other.elapsed_micros;
34    }
35}
36
37impl std::fmt::Display for DeltaStats {
38    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39        write!(
40            f,
41            "nodes: +{}/~{}/{}, edges: +{}/~{}/{}, total: {}, {}us",
42            self.nodes_created,
43            self.nodes_updated,
44            self.nodes_deleted,
45            self.edges_created,
46            self.edges_updated,
47            self.edges_deleted,
48            self.total_deltas,
49            self.elapsed_micros,
50        )
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn default_is_zero() {
60        let s = DeltaStats::default();
61        assert_eq!(s.total_mutations(), 0);
62        assert_eq!(s.total_deltas, 0);
63    }
64
65    #[test]
66    fn total_mutations() {
67        let s = DeltaStats {
68            nodes_created: 3,
69            nodes_updated: 2,
70            nodes_deleted: 1,
71            edges_created: 5,
72            edges_updated: 0,
73            edges_deleted: 1,
74            total_deltas: 12,
75            elapsed_micros: 100,
76        };
77        assert_eq!(s.total_mutations(), 12);
78    }
79
80    #[test]
81    fn merge_additive() {
82        let mut a = DeltaStats {
83            nodes_created: 3,
84            ..Default::default()
85        };
86        let b = DeltaStats {
87            nodes_created: 2,
88            edges_created: 5,
89            ..Default::default()
90        };
91        a.merge(&b);
92        assert_eq!(a.nodes_created, 5);
93        assert_eq!(a.edges_created, 5);
94    }
95
96    #[test]
97    fn display_format() {
98        let s = DeltaStats {
99            nodes_created: 1,
100            edges_created: 2,
101            total_deltas: 3,
102            elapsed_micros: 50,
103            ..Default::default()
104        };
105        let d = format!("{s}");
106        assert!(d.contains("nodes: +1"));
107        assert!(d.contains("edges: +2"));
108        assert!(d.contains("50us"));
109    }
110
111    #[test]
112    fn total_deltas_counted() {
113        let s = DeltaStats {
114            total_deltas: 42,
115            ..Default::default()
116        };
117        assert_eq!(s.total_deltas, 42);
118    }
119}