55using JsonApiDotNetCore . Internal . Contracts ;
66using JsonApiDotNetCore . Managers ;
77using JsonApiDotNetCore . Query ;
8+ using JsonApiDotNetCore . QueryParameterServices . Common ;
89using JsonApiDotNetCore . Services ;
910using Microsoft . AspNetCore . Http ;
10- using Microsoft . Extensions . Primitives ;
11+ using Microsoft . AspNetCore . WebUtilities ;
1112
1213namespace Benchmarks . Query
1314{
1415 [ MarkdownExporter , SimpleJob ( launchCount : 3 , warmupCount : 10 , targetCount : 20 ) , MemoryDiagnoser ]
1516 public class QueryParserBenchmarks
1617 {
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 ;
1921
2022 public QueryParserBenchmarks ( )
2123 {
@@ -27,12 +29,13 @@ public QueryParserBenchmarks()
2729
2830 IResourceDefinitionProvider resourceDefinitionProvider = DependencyFactory . CreateResourceDefinitionProvider ( resourceGraph ) ;
2931
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 ) ;
3234 }
3335
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 )
3639 {
3740 ISortService sortService = new SortService ( resourceDefinitionProvider , resourceGraph , currentRequest ) ;
3841
@@ -41,11 +44,12 @@ private static QueryParameterDiscovery CreateQueryParameterDiscoveryForSort(IRes
4144 sortService
4245 } ;
4346
44- return new QueryParameterDiscovery ( options , queryServices ) ;
47+ return new QueryParameterParser ( options , queryStringAccessor , queryServices ) ;
4548 }
4649
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 )
4953 {
5054 IIncludeService includeService = new IncludeService ( resourceGraph , currentRequest ) ;
5155 IFilterService filterService = new FilterService ( resourceDefinitionProvider , resourceGraph , currentRequest ) ;
@@ -61,40 +65,51 @@ private static QueryParameterDiscovery CreateQueryParameterDiscoveryForAll(IReso
6165 omitNullService
6266 } ;
6367
64- return new QueryParameterDiscovery ( options , queryServices ) ;
68+ return new QueryParameterParser ( options , queryStringAccessor , queryServices ) ;
6569 }
6670
6771 [ 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+ }
7479
7580 [ 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+ }
8288
8389 [ 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+ } ) ;
9497
9598 private void Run ( int iterations , Action action ) {
9699 for ( int i = 0 ; i < iterations ; i ++ )
97100 action ( ) ;
98101 }
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+ }
99114 }
100115}
0 commit comments