|
1 | | -use crate::query_data::{QueryData, QueryDataDiff, Results}; |
| 1 | +use crate::query_data::{ArtifactSize, ArtifactSizeDiff, QueryData, QueryDataDiff, Results}; |
2 | 2 | use crate::signed_duration::SignedDuration; |
3 | 3 | use rustc_hash::{FxHashMap, FxHashSet}; |
4 | 4 | use serde::{Deserialize, Serialize}; |
| 5 | +use std::collections::HashSet; |
5 | 6 | use std::time::Duration; |
6 | 7 |
|
7 | 8 | #[derive(Serialize, Deserialize)] |
8 | 9 | pub struct DiffResults { |
9 | 10 | pub query_data: Vec<QueryDataDiff>, |
| 11 | + pub artifact_sizes: Vec<ArtifactSizeDiff>, |
10 | 12 | pub total_time: SignedDuration, |
11 | 13 | } |
12 | 14 |
|
13 | 15 | fn build_query_lookup(query_data: &[QueryData]) -> FxHashMap<&str, usize> { |
14 | 16 | let mut lookup = FxHashMap::with_capacity_and_hasher(query_data.len(), Default::default()); |
15 | | - for i in 0..query_data.len() { |
16 | | - lookup.insert(&query_data[i].label[..], i); |
| 17 | + for (i, data) in query_data.iter().enumerate() { |
| 18 | + lookup.insert(&data.label[..], i); |
| 19 | + } |
| 20 | + |
| 21 | + lookup |
| 22 | +} |
| 23 | + |
| 24 | +fn build_artifact_lookup(artifact_sizes: &[ArtifactSize]) -> FxHashMap<&str, usize> { |
| 25 | + let mut lookup = FxHashMap::with_capacity_and_hasher(artifact_sizes.len(), Default::default()); |
| 26 | + for (i, data) in artifact_sizes.iter().enumerate() { |
| 27 | + lookup.insert(&data.label[..], i); |
17 | 28 | } |
18 | 29 |
|
19 | 30 | lookup |
@@ -53,8 +64,33 @@ pub fn calculate_diff(base: Results, change: Results) -> DiffResults { |
53 | 64 |
|
54 | 65 | query_data.sort_by(|l, r| r.self_time.duration.cmp(&l.self_time.duration)); |
55 | 66 |
|
| 67 | + let base_data = build_artifact_lookup(&base.artifact_sizes); |
| 68 | + let change_data = build_artifact_lookup(&change.artifact_sizes); |
| 69 | + let all_labels = base |
| 70 | + .artifact_sizes |
| 71 | + .iter() |
| 72 | + .chain(&change.artifact_sizes) |
| 73 | + .map(|a| a.label.as_str()) |
| 74 | + .collect::<HashSet<_>>(); |
| 75 | + let mut artifact_sizes: Vec<_> = all_labels |
| 76 | + .iter() |
| 77 | + .map(|l| { |
| 78 | + let b = base_data.get(l).map(|i| &base.artifact_sizes[*i]); |
| 79 | + let c = change_data.get(l).map(|i| &change.artifact_sizes[*i]); |
| 80 | + |
| 81 | + match (b, c) { |
| 82 | + (Some(b), Some(c)) => c.clone() - b.clone(), |
| 83 | + (Some(_b), None) => todo!(), |
| 84 | + (None, Some(_c)) => todo!(), |
| 85 | + (None, None) => unreachable!(), |
| 86 | + } |
| 87 | + }) |
| 88 | + .collect(); |
| 89 | + artifact_sizes.sort_by(|l, r| r.size_change.cmp(&l.size_change)); |
| 90 | + |
56 | 91 | DiffResults { |
57 | 92 | query_data, |
| 93 | + artifact_sizes, |
58 | 94 | total_time: sd(change.total_time) - sd(base.total_time), |
59 | 95 | } |
60 | 96 | } |
0 commit comments