@@ -45,27 +45,31 @@ async fn graph_response(
45
45
) -> ServerResult < Arc < graph:: Response > > {
46
46
let range = ctxt. data_range ( body. start ..=body. end ) ;
47
47
let commits: Arc < Vec < _ > > = Arc :: new ( range. into_iter ( ) . map ( |c| c. into ( ) ) . collect ( ) ) ;
48
- let metric_selector = Selector :: One ( body. stat ) ;
49
48
let mut benchmarks = HashMap :: new ( ) ;
50
49
51
- let series_iterator = ctxt
50
+ let interpolated_responses : Vec < _ > = ctxt
52
51
. statistic_series (
53
52
Query :: new ( )
54
53
. set :: < String > ( Tag :: Benchmark , Selector :: All )
55
54
. set :: < String > ( Tag :: Profile , Selector :: All )
56
55
. set :: < String > ( Tag :: Scenario , Selector :: All )
57
- . set :: < String > ( Tag :: Metric , metric_selector . clone ( ) ) ,
56
+ . set :: < String > ( Tag :: Metric , Selector :: One ( body . stat ) ) ,
58
57
commits. clone ( ) ,
59
58
)
60
59
. await ?
61
60
. into_iter ( )
62
- . map ( SeriesResponse :: interpolate) ;
61
+ . map ( |sr| sr. interpolate ( ) . map ( |series| series. collect :: < Vec < _ > > ( ) ) )
62
+ . collect ( ) ;
63
63
64
- for series_response in series_iterator {
65
- let benchmark = series_response. path . get :: < Benchmark > ( ) ?. to_string ( ) ;
66
- let profile = * series_response. path . get :: < Profile > ( ) ?;
67
- let scenario = series_response. path . get :: < Scenario > ( ) ?. to_string ( ) ;
68
- let graph_series = graph_series ( series_response. series , body. kind ) ;
64
+ let summary_benchmark = create_summary ( ctxt, & interpolated_responses, body. kind ) . await ?;
65
+
66
+ benchmarks. insert ( "Summary" . to_string ( ) , summary_benchmark) ;
67
+
68
+ for response in interpolated_responses {
69
+ let benchmark = response. path . get :: < Benchmark > ( ) ?. to_string ( ) ;
70
+ let profile = * response. path . get :: < Profile > ( ) ?;
71
+ let scenario = response. path . get :: < Scenario > ( ) ?. to_string ( ) ;
72
+ let graph_series = graph_series ( response. series . into_iter ( ) , body. kind ) ;
69
73
70
74
benchmarks
71
75
. entry ( benchmark)
@@ -75,10 +79,6 @@ async fn graph_response(
75
79
. insert ( scenario, graph_series) ;
76
80
}
77
81
78
- let summary_benchmark = create_summary ( ctxt, metric_selector, & commits, body. kind ) . await ?;
79
-
80
- benchmarks. insert ( "Summary" . to_string ( ) , summary_benchmark) ;
81
-
82
82
Ok ( Arc :: new ( graph:: Response {
83
83
commits : Arc :: try_unwrap ( commits)
84
84
. unwrap ( )
@@ -96,8 +96,12 @@ async fn graph_response(
96
96
/// test cases per profile type
97
97
async fn create_summary (
98
98
ctxt : & SiteCtxt ,
99
- metric_selector : Selector < String > ,
100
- commits : & Arc < Vec < ArtifactId > > ,
99
+ interpolated_responses : & [ SeriesResponse <
100
+ Vec < (
101
+ ( database:: ArtifactId , std:: option:: Option < f64 > ) ,
102
+ IsInterpolated ,
103
+ ) > ,
104
+ > ] ,
101
105
graph_kind : GraphKind ,
102
106
) -> ServerResult < HashMap < Profile , HashMap < String , graph:: Series > > > {
103
107
let mut baselines = HashMap :: new ( ) ;
@@ -107,42 +111,38 @@ async fn create_summary(
107
111
vec![ Profile :: Check , Profile :: Debug , Profile :: Opt ]
108
112
) ;
109
113
for ( scenario, profile) in summary_query_cases {
110
- let query = Query :: new ( )
111
- . set :: < String > ( Tag :: Benchmark , Selector :: All )
112
- . set ( Tag :: Profile , Selector :: One ( profile) )
113
- . set ( Tag :: Scenario , Selector :: One ( scenario) )
114
- . set ( Tag :: Metric , metric_selector. clone ( ) ) ;
115
-
116
- let baseline_query = Query :: new ( )
117
- . set :: < String > ( Tag :: Benchmark , Selector :: All )
118
- . set ( Tag :: Profile , Selector :: One ( profile) )
119
- . set ( Tag :: Scenario , Selector :: One ( Scenario :: Empty ) )
120
- . set ( Tag :: Metric , metric_selector. clone ( ) ) ;
121
-
122
- let baseline = match baselines. entry ( baseline_query. clone ( ) ) {
114
+ let baseline = match baselines. entry ( ( profile, scenario) ) {
123
115
std:: collections:: hash_map:: Entry :: Occupied ( o) => * o. get ( ) ,
124
116
std:: collections:: hash_map:: Entry :: Vacant ( v) => {
125
- let value = db:: average (
126
- ctxt. statistic_series ( baseline_query, commits. clone ( ) )
127
- . await ?
128
- . into_iter ( )
129
- . map ( |sr| sr. interpolate ( ) . series )
130
- . collect :: < Vec < _ > > ( ) ,
131
- )
132
- . next ( )
133
- . map_or ( 0.0 , |( ( _c, d) , _interpolated) | d. expect ( "interpolated" ) ) ;
117
+ let baseline_responses = interpolated_responses
118
+ . iter ( )
119
+ . filter ( |sr| {
120
+ let p = sr. path . get :: < Profile > ( ) . unwrap ( ) ;
121
+ let s = sr. path . get :: < Scenario > ( ) . unwrap ( ) ;
122
+ * p == profile && * s == Scenario :: Empty
123
+ } )
124
+ . map ( |sr| sr. series . iter ( ) . cloned ( ) )
125
+ . collect ( ) ;
126
+
127
+ let value = db:: average ( baseline_responses)
128
+ . next ( )
129
+ . map_or ( 0.0 , |( ( _c, d) , _interpolated) | d. expect ( "interpolated" ) ) ;
134
130
* v. insert ( value)
135
131
}
136
132
} ;
137
133
138
- let avg_vs_baseline = db:: average (
139
- ctxt. statistic_series ( query. clone ( ) , commits. clone ( ) )
140
- . await ?
141
- . into_iter ( )
142
- . map ( |sr| sr. interpolate ( ) . series )
143
- . collect ( ) ,
144
- )
145
- . map ( |( ( c, d) , i) | ( ( c, Some ( d. expect ( "interpolated" ) / baseline) ) , i) ) ;
134
+ let summary_case_responses = interpolated_responses
135
+ . iter ( )
136
+ . filter ( |sr| {
137
+ let p = sr. path . get :: < Profile > ( ) . unwrap ( ) ;
138
+ let s = sr. path . get :: < Scenario > ( ) . unwrap ( ) ;
139
+ * p == profile && * s == scenario
140
+ } )
141
+ . map ( |sr| sr. series . iter ( ) . cloned ( ) )
142
+ . collect ( ) ;
143
+
144
+ let avg_vs_baseline = db:: average ( summary_case_responses)
145
+ . map ( |( ( c, d) , i) | ( ( c, Some ( d. expect ( "interpolated" ) / baseline) ) , i) ) ;
146
146
147
147
let graph_series = graph_series ( avg_vs_baseline, graph_kind) ;
148
148
0 commit comments