1 use criterion::{criterion_group, criterion_main, Criterion};
2 use jql::walker;
3 use serde_json::Value;
4 
5 const DATA: &str = r#"{
6     "array": [1, 2, 3, 4 , 5 , 6, 7],
7     "flatten-array": [[[[["c", "a", "c"]]]], "g", [[["a", ["t"]]]]],
8     "props": { "a": { "b": { "c" : 777 } } },
9     "nested-filter": [
10         {
11             "laptop": {
12                 "brand": "Apple"
13             }
14         },
15         {
16             "laptop": {
17                 "brand": "Asus"
18             }
19         }
20     ]
21 }"#;
22 
access_properties_benchmark(c: &mut Criterion)23 fn access_properties_benchmark(c: &mut Criterion) {
24     let json: Value = serde_json::from_str(DATA).unwrap();
25     let selector = Some(r#""props"."a"."b"."c""#);
26     c.bench_function("Access properties", move |b| {
27         b.iter(|| walker(&json, selector))
28     });
29 }
30 
filter_array_benchmark(c: &mut Criterion)31 fn filter_array_benchmark(c: &mut Criterion) {
32     let json: Value = serde_json::from_str(DATA).unwrap();
33     let selector = Some(r#""nested-filter"|"laptop"|"brand""#);
34     c.bench_function("Filter an array", move |b| {
35         b.iter(|| walker(&json, selector))
36     });
37 }
38 
flatten_array_benchmark(c: &mut Criterion)39 fn flatten_array_benchmark(c: &mut Criterion) {
40     let json: Value = serde_json::from_str(DATA).unwrap();
41     let selector = Some(r#".."flatten-array""#);
42     c.bench_function("Flatten an array", move |b| {
43         b.iter(|| walker(&json, selector))
44     });
45 }
46 
range_array_benchmark(c: &mut Criterion)47 fn range_array_benchmark(c: &mut Criterion) {
48     let json: Value = serde_json::from_str(DATA).unwrap();
49     let selector = Some(r#""array".[5:3]"#);
50     c.bench_function("Get the range of an array", move |b| {
51         b.iter(|| walker(&json, selector))
52     });
53 }
54 
group_benchmark(c: &mut Criterion)55 fn group_benchmark(c: &mut Criterion) {
56     let json: Value = serde_json::from_str(DATA).unwrap();
57     let selector = Some(r#""array","flatten-array","props""#);
58     c.bench_function("Get multiple groups", move |b| {
59         b.iter(|| walker(&json, selector))
60     });
61 }
62 
63 criterion_group!(
64     benches,
65     access_properties_benchmark,
66     filter_array_benchmark,
67     flatten_array_benchmark,
68     range_array_benchmark,
69     group_benchmark
70 );
71 
72 criterion_main!(benches);
73