1#[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 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}