1818use std:: path:: Path ;
1919use std:: path:: PathBuf ;
2020
21- use crate :: util:: { BenchmarkRun , CommonOpt } ;
21+ use crate :: util:: { BenchmarkRun , CommonOpt , QueryResult } ;
2222use datafusion:: {
2323 error:: { DataFusionError , Result } ,
2424 prelude:: SessionContext ,
@@ -128,36 +128,58 @@ impl RunOpt {
128128 let ctx = SessionContext :: new_with_config_rt ( config, rt_builder. build_arc ( ) ?) ;
129129 self . register_hits ( & ctx) . await ?;
130130
131- let iterations = self . common . iterations ;
132131 let mut benchmark_run = BenchmarkRun :: new ( ) ;
133132 for query_id in query_range {
134- let mut millis = Vec :: with_capacity ( iterations) ;
135133 benchmark_run. start_new_case ( & format ! ( "Query {query_id}" ) ) ;
136- let sql = queries. get_query ( query_id) ?;
137- println ! ( "Q{query_id}: {sql}" ) ;
138-
139- for i in 0 ..iterations {
140- let start = Instant :: now ( ) ;
141- let results = ctx. sql ( sql) . await ?. collect ( ) . await ?;
142- let elapsed = start. elapsed ( ) ;
143- let ms = elapsed. as_secs_f64 ( ) * 1000.0 ;
144- millis. push ( ms) ;
145- let row_count: usize = results. iter ( ) . map ( |b| b. num_rows ( ) ) . sum ( ) ;
146- println ! (
147- "Query {query_id} iteration {i} took {ms:.1} ms and returned {row_count} rows"
148- ) ;
149- benchmark_run. write_iter ( elapsed, row_count) ;
134+ let query_run = self . benchmark_query ( & queries, query_id, & ctx) . await ;
135+ match query_run {
136+ Ok ( query_results) => {
137+ for iter in query_results {
138+ benchmark_run. write_iter ( iter. elapsed , iter. row_count ) ;
139+ }
140+ }
141+ Err ( e) => {
142+ benchmark_run. mark_failed ( ) ;
143+ eprintln ! ( "Query {query_id} failed: {e}" ) ;
144+ }
150145 }
151- if self . common . debug {
152- ctx. sql ( sql) . await ?. explain ( false , false ) ?. show ( ) . await ?;
153- }
154- let avg = millis. iter ( ) . sum :: < f64 > ( ) / millis. len ( ) as f64 ;
155- println ! ( "Query {query_id} avg time: {avg:.2} ms" ) ;
156146 }
157147 benchmark_run. maybe_write_json ( self . output_path . as_ref ( ) ) ?;
148+ benchmark_run. maybe_print_failures ( ) ;
158149 Ok ( ( ) )
159150 }
160151
152+ async fn benchmark_query (
153+ & self ,
154+ queries : & AllQueries ,
155+ query_id : usize ,
156+ ctx : & SessionContext ,
157+ ) -> Result < Vec < QueryResult > > {
158+ let sql = queries. get_query ( query_id) ?;
159+ println ! ( "Q{query_id}: {sql}" ) ;
160+
161+ let mut millis = Vec :: with_capacity ( self . iterations ( ) ) ;
162+ let mut query_results = vec ! [ ] ;
163+ for i in 0 ..self . iterations ( ) {
164+ let start = Instant :: now ( ) ;
165+ let results = ctx. sql ( sql) . await ?. collect ( ) . await ?;
166+ let elapsed = start. elapsed ( ) ;
167+ let ms = elapsed. as_secs_f64 ( ) * 1000.0 ;
168+ millis. push ( ms) ;
169+ let row_count: usize = results. iter ( ) . map ( |b| b. num_rows ( ) ) . sum ( ) ;
170+ println ! (
171+ "Query {query_id} iteration {i} took {ms:.1} ms and returned {row_count} rows"
172+ ) ;
173+ query_results. push ( QueryResult { elapsed, row_count } )
174+ }
175+ if self . common . debug {
176+ ctx. sql ( sql) . await ?. explain ( false , false ) ?. show ( ) . await ?;
177+ }
178+ let avg = millis. iter ( ) . sum :: < f64 > ( ) / millis. len ( ) as f64 ;
179+ println ! ( "Query {query_id} avg time: {avg:.2} ms" ) ;
180+ Ok ( query_results)
181+ }
182+
161183 /// Registers the `hits.parquet` as a table named `hits`
162184 async fn register_hits ( & self , ctx : & SessionContext ) -> Result < ( ) > {
163185 let options = Default :: default ( ) ;
@@ -171,4 +193,8 @@ impl RunOpt {
171193 )
172194 } )
173195 }
196+
197+ fn iterations ( & self ) -> usize {
198+ self . common . iterations
199+ }
174200}
0 commit comments