5
5
using JsonApiDotNetCore . Internal . Contracts ;
6
6
using JsonApiDotNetCore . Managers ;
7
7
using JsonApiDotNetCore . Query ;
8
+ using JsonApiDotNetCore . QueryParameterServices . Common ;
8
9
using JsonApiDotNetCore . Services ;
9
10
using Microsoft . AspNetCore . Http ;
10
- using Microsoft . Extensions . Primitives ;
11
+ using Microsoft . AspNetCore . WebUtilities ;
11
12
12
13
namespace Benchmarks . Query
13
14
{
14
15
[ MarkdownExporter , SimpleJob ( launchCount : 3 , warmupCount : 10 , targetCount : 20 ) , MemoryDiagnoser ]
15
16
public class QueryParserBenchmarks
16
17
{
17
- private readonly QueryParameterDiscovery _queryParameterDiscoveryForSort ;
18
- private readonly QueryParameterDiscovery _queryParameterDiscoveryForAll ;
18
+ private readonly FakeRequestQueryStringAccessor _queryStringAccessor = new FakeRequestQueryStringAccessor ( ) ;
19
+ private readonly QueryParameterParser _queryParameterParserForSort ;
20
+ private readonly QueryParameterParser _queryParameterParserForAll ;
19
21
20
22
public QueryParserBenchmarks ( )
21
23
{
@@ -27,12 +29,13 @@ public QueryParserBenchmarks()
27
29
28
30
IResourceDefinitionProvider resourceDefinitionProvider = DependencyFactory . CreateResourceDefinitionProvider ( resourceGraph ) ;
29
31
30
- _queryParameterDiscoveryForSort = CreateQueryParameterDiscoveryForSort ( resourceGraph , currentRequest , resourceDefinitionProvider , options ) ;
31
- _queryParameterDiscoveryForAll = CreateQueryParameterDiscoveryForAll ( resourceGraph , currentRequest , resourceDefinitionProvider , options ) ;
32
+ _queryParameterParserForSort = CreateQueryParameterDiscoveryForSort ( resourceGraph , currentRequest , resourceDefinitionProvider , options , _queryStringAccessor ) ;
33
+ _queryParameterParserForAll = CreateQueryParameterDiscoveryForAll ( resourceGraph , currentRequest , resourceDefinitionProvider , options , _queryStringAccessor ) ;
32
34
}
33
35
34
- private static QueryParameterDiscovery CreateQueryParameterDiscoveryForSort ( IResourceGraph resourceGraph ,
35
- CurrentRequest currentRequest , IResourceDefinitionProvider resourceDefinitionProvider , IJsonApiOptions options )
36
+ private static QueryParameterParser CreateQueryParameterDiscoveryForSort ( IResourceGraph resourceGraph ,
37
+ CurrentRequest currentRequest , IResourceDefinitionProvider resourceDefinitionProvider ,
38
+ IJsonApiOptions options , FakeRequestQueryStringAccessor queryStringAccessor )
36
39
{
37
40
ISortService sortService = new SortService ( resourceDefinitionProvider , resourceGraph , currentRequest ) ;
38
41
@@ -41,11 +44,12 @@ private static QueryParameterDiscovery CreateQueryParameterDiscoveryForSort(IRes
41
44
sortService
42
45
} ;
43
46
44
- return new QueryParameterDiscovery ( options , queryServices ) ;
47
+ return new QueryParameterParser ( options , queryStringAccessor , queryServices ) ;
45
48
}
46
49
47
- private static QueryParameterDiscovery CreateQueryParameterDiscoveryForAll ( IResourceGraph resourceGraph ,
48
- CurrentRequest currentRequest , IResourceDefinitionProvider resourceDefinitionProvider , IJsonApiOptions options )
50
+ private static QueryParameterParser CreateQueryParameterDiscoveryForAll ( IResourceGraph resourceGraph ,
51
+ CurrentRequest currentRequest , IResourceDefinitionProvider resourceDefinitionProvider ,
52
+ IJsonApiOptions options , FakeRequestQueryStringAccessor queryStringAccessor )
49
53
{
50
54
IIncludeService includeService = new IncludeService ( resourceGraph , currentRequest ) ;
51
55
IFilterService filterService = new FilterService ( resourceDefinitionProvider , resourceGraph , currentRequest ) ;
@@ -61,40 +65,51 @@ private static QueryParameterDiscovery CreateQueryParameterDiscoveryForAll(IReso
61
65
omitNullService
62
66
} ;
63
67
64
- return new QueryParameterDiscovery ( options , queryServices ) ;
68
+ return new QueryParameterParser ( options , queryStringAccessor , queryServices ) ;
65
69
}
66
70
67
71
[ Benchmark ]
68
- public void AscendingSort ( ) => _queryParameterDiscoveryForSort . Parse ( new QueryCollection (
69
- new Dictionary < string , StringValues >
70
- {
71
- { "sort" , BenchmarkResourcePublicNames . NameAttr }
72
- }
73
- ) , null ) ;
72
+ public void AscendingSort ( )
73
+ {
74
+ var queryString = $ "?sort={ BenchmarkResourcePublicNames . NameAttr } ";
75
+
76
+ _queryStringAccessor . SetQueryString ( queryString ) ;
77
+ _queryParameterParserForSort . Parse ( null ) ;
78
+ }
74
79
75
80
[ Benchmark ]
76
- public void DescendingSort ( ) => _queryParameterDiscoveryForSort . Parse ( new QueryCollection (
77
- new Dictionary < string , StringValues >
78
- {
79
- { "sort" , $ "-{ BenchmarkResourcePublicNames . NameAttr } "}
80
- }
81
- ) , null ) ;
81
+ public void DescendingSort ( )
82
+ {
83
+ var queryString = $ "?sort=-{ BenchmarkResourcePublicNames . NameAttr } ";
84
+
85
+ _queryStringAccessor . SetQueryString ( queryString ) ;
86
+ _queryParameterParserForSort . Parse ( null ) ;
87
+ }
82
88
83
89
[ Benchmark ]
84
- public void ComplexQuery ( ) => Run ( 100 , ( ) => _queryParameterDiscoveryForAll . Parse ( new QueryCollection (
85
- new Dictionary < string , StringValues >
86
- {
87
- { $ "filter[{ BenchmarkResourcePublicNames . NameAttr } ]", new StringValues ( new [ ] { "abc" , "eq:abc" } ) } ,
88
- { "sort" , $ "-{ BenchmarkResourcePublicNames . NameAttr } "} ,
89
- { "include" , "child" } ,
90
- { "page[size]" , "1" } ,
91
- { "fields" , BenchmarkResourcePublicNames . NameAttr }
92
- }
93
- ) , null ) ) ;
90
+ public void ComplexQuery ( ) => Run ( 100 , ( ) =>
91
+ {
92
+ var queryString = $ "?filter[{ BenchmarkResourcePublicNames . NameAttr } ]=abc,eq:abc&sort=-{ BenchmarkResourcePublicNames . NameAttr } &include=child&page[size]=1&fields={ BenchmarkResourcePublicNames . NameAttr } ";
93
+
94
+ _queryStringAccessor . SetQueryString ( queryString ) ;
95
+ _queryParameterParserForAll . Parse ( null ) ;
96
+ } ) ;
94
97
95
98
private void Run ( int iterations , Action action ) {
96
99
for ( int i = 0 ; i < iterations ; i ++ )
97
100
action ( ) ;
98
101
}
102
+
103
+ private sealed class FakeRequestQueryStringAccessor : IRequestQueryStringAccessor
104
+ {
105
+ public QueryString QueryString { get ; private set ; }
106
+ public IQueryCollection Query { get ; private set ; }
107
+
108
+ public void SetQueryString ( string queryString )
109
+ {
110
+ QueryString = new QueryString ( queryString ) ;
111
+ Query = new QueryCollection ( QueryHelpers . ParseQuery ( queryString ) ) ;
112
+ }
113
+ }
99
114
}
100
115
}
0 commit comments