1
use bonsaidb::{
2
    core::{
3
        connection::Connection,
4
        schema::{Collection, CollectionName, DefaultSerialization, Schematic},
5
        test_util::TestDirectory,
6
        Error,
7
    },
8
    local::{
9
        config::{Builder, StorageConfiguration},
10
        Database,
11
    },
12
};
13
use criterion::{measurement::WallTime, BenchmarkGroup, BenchmarkId};
14
use ubyte::ToByteUnit;
15

            
16
use crate::collections::ResizableDocument;
17

            
18
impl Collection for ResizableDocument {
19
40
    fn collection_name() -> CollectionName {
20
40
        CollectionName::new("khonsulabs", "resizable-docs")
21
40
    }
22

            
23
10
    fn define_views(_schema: &mut Schematic) -> Result<(), Error> {
24
10
        Ok(())
25
10
    }
26
}
27

            
28
impl DefaultSerialization for ResizableDocument {}
29

            
30
5
async fn save_document(doc: &ResizableDocument, db: &Database) {
31
5
    db.collection::<ResizableDocument>()
32
5
        .push(doc)
33
5
        .await
34
5
        .unwrap();
35
5
}
36

            
37
5
pub(super) fn save_documents(group: &mut BenchmarkGroup<WallTime>, doc: &ResizableDocument) {
38
5
    group.bench_function(
39
5
        BenchmarkId::new("bonsaidb-local", doc.data.len().bytes()),
40
5
        |b| {
41
5
            let runtime = tokio::runtime::Runtime::new().unwrap();
42
5
            let path = TestDirectory::new("benches-basics.bonsaidb");
43
5
            let db = runtime
44
5
                .block_on(Database::open::<ResizableDocument>(
45
5
                    StorageConfiguration::new(&path),
46
5
                ))
47
5
                .unwrap();
48
5
            b.to_async(&runtime).iter(|| save_document(doc, &db));
49
5
        },
50
5
    );
51
5

            
52
5
    // TODO bench read performance
53
5
    // TODO bench read + write performance (with different numbers of readers/writers)
54
5
    // TODO (once supported) bench batch saving
55
5
}