1- use std:: { fs:: File , path:: PathBuf } ;
1+ use std:: { convert :: TryInto , fs:: File , path:: PathBuf } ;
22
3- use bson:: Bson ;
4- use mongodb:: { options:: FindOptions , Client , Collection , Database } ;
3+ use anyhow:: { bail, Result } ;
4+ use mongodb:: {
5+ bson:: { doc, Bson } ,
6+ Client ,
7+ Collection ,
8+ Database ,
9+ } ;
510use serde_json:: Value ;
611
7- use crate :: {
8- bench:: { Benchmark , COLL_NAME , DATABASE_NAME } ,
9- error:: { Error , Result } ,
10- } ;
12+ use crate :: bench:: { Benchmark , COLL_NAME , DATABASE_NAME } ;
1113
1214pub struct FindOneBenchmark {
1315 db : Database ,
@@ -22,49 +24,46 @@ pub struct Options {
2224 pub uri : String ,
2325}
2426
27+ #[ async_trait:: async_trait]
2528impl Benchmark for FindOneBenchmark {
2629 type Options = Options ;
2730
28- fn setup ( options : Self :: Options ) -> Result < Self > {
29- let client = Client :: with_uri_str ( & options. uri ) ?;
31+ async fn setup ( options : Self :: Options ) -> Result < Self > {
32+ let client = Client :: with_uri_str ( & options. uri ) . await ?;
3033 let db = client. database ( & DATABASE_NAME ) ;
31- db. drop ( ) ?;
34+ db. drop ( None ) . await ?;
35+
36+ let num_iter = options. num_iter ;
3237
33- let mut file = File :: open ( options. path ) ?;
38+ let mut file = spawn_blocking_and_await ! ( File :: open( options. path) ) ?;
3439
35- let json: Value = serde_json:: from_reader ( & mut file) ?;
36- let mut doc = match json. into ( ) {
40+ let json: Value = spawn_blocking_and_await ! ( serde_json:: from_reader( & mut file) ) ?;
41+ let mut doc = match json. try_into ( ) ? {
3742 Bson :: Document ( doc) => doc,
38- _ => return Err ( Error :: UnexpectedJson ( "invalid json test file" . to_string ( ) ) ) ,
43+ _ => bail ! ( "invalid json test file" ) ,
3944 } ;
4045
4146 let coll = db. collection ( & COLL_NAME ) ;
42- for i in 0 ..options . num_iter {
47+ for i in 0 ..num_iter {
4348 doc. insert ( "_id" , i as i32 ) ;
44- coll. insert_one ( doc. clone ( ) , None ) ?;
49+ coll. insert_one ( doc. clone ( ) , None ) . await ?;
4550 }
4651
47- Ok ( FindOneBenchmark {
48- db,
49- num_iter : options. num_iter ,
50- coll,
51- } )
52+ Ok ( FindOneBenchmark { db, num_iter, coll } )
5253 }
5354
54- fn do_task ( & self ) -> Result < ( ) > {
55- let find_options = FindOptions :: builder ( ) . limit ( Some ( 1 ) ) . build ( ) ;
55+ async fn do_task ( & self ) -> Result < ( ) > {
5656 for i in 0 ..self . num_iter {
57- let mut cursor = self
58- . coll
59- . find ( Some ( doc ! { "_id" : i as i32 } ) , Some ( find_options. clone ( ) ) ) ?;
60- let _doc = cursor. next ( ) ;
57+ self . coll
58+ . find_one ( Some ( doc ! { "_id" : i as i32 } ) , None )
59+ . await ?;
6160 }
6261
6362 Ok ( ( ) )
6463 }
6564
66- fn teardown ( & self ) -> Result < ( ) > {
67- self . db . drop ( ) ?;
65+ async fn teardown ( & self ) -> Result < ( ) > {
66+ self . db . drop ( None ) . await ?;
6867
6968 Ok ( ( ) )
7069 }
0 commit comments