1
- use std:: { fs:: File , path:: PathBuf } ;
1
+ use std:: { convert :: TryInto , fs:: File , path:: PathBuf } ;
2
2
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
+ } ;
5
10
use serde_json:: Value ;
6
11
7
- use crate :: {
8
- bench:: { Benchmark , COLL_NAME , DATABASE_NAME } ,
9
- error:: { Error , Result } ,
10
- } ;
12
+ use crate :: bench:: { Benchmark , COLL_NAME , DATABASE_NAME } ;
11
13
12
14
pub struct FindOneBenchmark {
13
15
db : Database ,
@@ -22,49 +24,46 @@ pub struct Options {
22
24
pub uri : String ,
23
25
}
24
26
27
+ #[ async_trait:: async_trait]
25
28
impl Benchmark for FindOneBenchmark {
26
29
type Options = Options ;
27
30
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 ?;
30
33
let db = client. database ( & DATABASE_NAME ) ;
31
- db. drop ( ) ?;
34
+ db. drop ( None ) . await ?;
35
+
36
+ let num_iter = options. num_iter ;
32
37
33
- let mut file = File :: open ( options. path ) ?;
38
+ let mut file = spawn_blocking_and_await ! ( File :: open( options. path) ) ?;
34
39
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 ( ) ? {
37
42
Bson :: Document ( doc) => doc,
38
- _ => return Err ( Error :: UnexpectedJson ( "invalid json test file" . to_string ( ) ) ) ,
43
+ _ => bail ! ( "invalid json test file" ) ,
39
44
} ;
40
45
41
46
let coll = db. collection ( & COLL_NAME ) ;
42
- for i in 0 ..options . num_iter {
47
+ for i in 0 ..num_iter {
43
48
doc. insert ( "_id" , i as i32 ) ;
44
- coll. insert_one ( doc. clone ( ) , None ) ?;
49
+ coll. insert_one ( doc. clone ( ) , None ) . await ?;
45
50
}
46
51
47
- Ok ( FindOneBenchmark {
48
- db,
49
- num_iter : options. num_iter ,
50
- coll,
51
- } )
52
+ Ok ( FindOneBenchmark { db, num_iter, coll } )
52
53
}
53
54
54
- fn do_task ( & self ) -> Result < ( ) > {
55
- let find_options = FindOptions :: builder ( ) . limit ( Some ( 1 ) ) . build ( ) ;
55
+ async fn do_task ( & self ) -> Result < ( ) > {
56
56
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 ?;
61
60
}
62
61
63
62
Ok ( ( ) )
64
63
}
65
64
66
- fn teardown ( & self ) -> Result < ( ) > {
67
- self . db . drop ( ) ?;
65
+ async fn teardown ( & self ) -> Result < ( ) > {
66
+ self . db . drop ( None ) . await ?;
68
67
69
68
Ok ( ( ) )
70
69
}
0 commit comments