Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit 2ecc45d

Browse files
committed
service containers cache
1 parent 753608a commit 2ecc45d

File tree

7 files changed

+124
-7
lines changed

7 files changed

+124
-7
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
using Xunit;
8+
9+
namespace Community.OData.Linq.xTests
10+
{
11+
public class HashTests
12+
{
13+
[Fact]
14+
public void Hashes()
15+
{
16+
ODataSettings s1 = new ODataSettings();
17+
ODataSettings s2 = new ODataSettings();
18+
19+
Assert.Equal(s1.QuerySettings.GetHashCode(), s2.QuerySettings.GetHashCode());
20+
Assert.Equal(s1.DefaultQuerySettings.GetHashCode(), s2.DefaultQuerySettings.GetHashCode());
21+
Assert.Equal(HashCode.Combine(s1.QuerySettings, s1.DefaultQuerySettings), HashCode.Combine(s2.QuerySettings, s2.DefaultQuerySettings));
22+
23+
s1.QuerySettings.EnsureStableOrdering = false;
24+
Assert.NotEqual(s1.QuerySettings.GetHashCode(), s2.QuerySettings.GetHashCode());
25+
Assert.Equal(s1.DefaultQuerySettings.GetHashCode(), s2.DefaultQuerySettings.GetHashCode());
26+
Assert.NotEqual(HashCode.Combine(s1.QuerySettings, s1.DefaultQuerySettings), HashCode.Combine(s2.QuerySettings, s2.DefaultQuerySettings));
27+
28+
s1.QuerySettings.EnsureStableOrdering = true;
29+
Assert.Equal(s1.QuerySettings.GetHashCode(), s2.QuerySettings.GetHashCode());
30+
Assert.Equal(s1.DefaultQuerySettings.GetHashCode(), s2.DefaultQuerySettings.GetHashCode());
31+
Assert.Equal(HashCode.Combine(s1.QuerySettings, s1.DefaultQuerySettings), HashCode.Combine(s2.QuerySettings, s2.DefaultQuerySettings));
32+
33+
s1.DefaultQuerySettings.EnableExpand = false;
34+
Assert.Equal(s1.QuerySettings.GetHashCode(), s2.QuerySettings.GetHashCode());
35+
Assert.NotEqual(s1.DefaultQuerySettings.GetHashCode(), s2.DefaultQuerySettings.GetHashCode());
36+
Assert.NotEqual(HashCode.Combine(s1.QuerySettings, s1.DefaultQuerySettings), HashCode.Combine(s2.QuerySettings, s2.DefaultQuerySettings));
37+
38+
s1.DefaultQuerySettings.EnableExpand = true;
39+
Assert.Equal(s1.QuerySettings.GetHashCode(), s2.QuerySettings.GetHashCode());
40+
Assert.Equal(s1.DefaultQuerySettings.GetHashCode(), s2.DefaultQuerySettings.GetHashCode());
41+
Assert.Equal(HashCode.Combine(s1.QuerySettings, s1.DefaultQuerySettings), HashCode.Combine(s2.QuerySettings, s2.DefaultQuerySettings));
42+
43+
// Microsoft classes public properties
44+
Assert.Equal(HashCode.Combine(s1.ParserSettings.MaximumExpansionCount, s1.ParserSettings.MaximumExpansionDepth), HashCode.Combine(s2.ParserSettings.MaximumExpansionCount, s2.ParserSettings.MaximumExpansionDepth));
45+
s1.ParserSettings.MaximumExpansionCount = 1;
46+
Assert.NotEqual(HashCode.Combine(s1.ParserSettings.MaximumExpansionCount, s1.ParserSettings.MaximumExpansionDepth), HashCode.Combine(s2.ParserSettings.MaximumExpansionCount, s2.ParserSettings.MaximumExpansionDepth));
47+
}
48+
}
49+
}

Community.Data.OData.Linq/Community.OData.Linq.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
</PropertyGroup>
2525

2626
<ItemGroup>
27+
<PackageReference Include="Microsoft.Bcl.HashCode" Version="1.1.1" />
2728
<PackageReference Include="Microsoft.OData.Core" Version="7.4.0" />
2829
<PackageReference Include="System.ComponentModel.Annotations" Version="4.4.1" />
2930
</ItemGroup>

Community.Data.OData.Linq/OData/Query/DefaultQuerySettings.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,28 @@ public int? MaxTop
114114
this._maxTop = value;
115115
}
116116
}
117+
118+
public override bool Equals(object obj)
119+
{
120+
return obj is DefaultQuerySettings settings &&
121+
_enableFilter == settings._enableFilter &&
122+
_enableOrderBy == settings._enableOrderBy &&
123+
_enableExpand == settings._enableExpand &&
124+
_enableCount == settings._enableCount &&
125+
_enableSelect == settings._enableSelect &&
126+
_maxTop == settings._maxTop;
127+
}
128+
129+
public override int GetHashCode()
130+
{
131+
int hashCode = 2109394230;
132+
hashCode = hashCode * -1521134295 + _enableFilter.GetHashCode();
133+
hashCode = hashCode * -1521134295 + _enableOrderBy.GetHashCode();
134+
hashCode = hashCode * -1521134295 + _enableExpand.GetHashCode();
135+
hashCode = hashCode * -1521134295 + _enableCount.GetHashCode();
136+
hashCode = hashCode * -1521134295 + _enableSelect.GetHashCode();
137+
hashCode = hashCode * -1521134295 + _maxTop.GetHashCode();
138+
return hashCode;
139+
}
117140
}
118141
}

Community.Data.OData.Linq/OData/Query/ODataQuerySettings.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,26 @@ internal void CopyFrom(ODataQuerySettings settings)
118118
this.PageSize = settings.PageSize;
119119
this.ModelBoundPageSize = settings.ModelBoundPageSize;
120120
}
121+
122+
public override bool Equals(object obj)
123+
{
124+
return obj is ODataQuerySettings settings &&
125+
_handleNullPropagationOption == settings._handleNullPropagationOption &&
126+
_pageSize == settings._pageSize &&
127+
_modelBoundPageSize == settings._modelBoundPageSize &&
128+
EnsureStableOrdering == settings.EnsureStableOrdering &&
129+
EnableConstantParameterization == settings.EnableConstantParameterization;
130+
}
131+
132+
public override int GetHashCode()
133+
{
134+
int hashCode = 238262878;
135+
hashCode = hashCode * -1521134295 + _handleNullPropagationOption.GetHashCode();
136+
hashCode = hashCode * -1521134295 + _pageSize.GetHashCode();
137+
hashCode = hashCode * -1521134295 + _modelBoundPageSize.GetHashCode();
138+
hashCode = hashCode * -1521134295 + EnsureStableOrdering.GetHashCode();
139+
hashCode = hashCode * -1521134295 + EnableConstantParameterization.GetHashCode();
140+
return hashCode;
141+
}
121142
}
122143
}

Community.Data.OData.Linq/OdataLinqExtensions.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public static class ODataLinqExtensions
3030

3131
private static readonly ConcurrentDictionary<Type,IEdmModel> Models = new ConcurrentDictionary<Type, IEdmModel>();
3232

33+
private static readonly ConcurrentDictionary<int, ServiceContainer> Containers = new ConcurrentDictionary<int, ServiceContainer>();
34+
3335
/// <summary>
3436
/// Enable applying OData specific functions to query
3537
/// </summary>
@@ -73,17 +75,30 @@ public static ODataQuery<T> OData<T>(this IQueryable<T> query, Action<ODataSetti
7375
ODataSettings settings = new ODataSettings();
7476
configuration?.Invoke(settings);
7577

76-
ServiceContainer container = new ServiceContainer();
78+
int settingsHash = HashCode.Combine(
79+
settings.QuerySettings,
80+
settings.DefaultQuerySettings,
81+
settings.ParserSettings.MaximumExpansionCount,
82+
settings.ParserSettings.MaximumExpansionDepth);
83+
84+
ServiceContainer baseContainer = Containers.GetOrAdd(settingsHash, i =>
85+
{
86+
ServiceContainer c = new ServiceContainer();
87+
c.AddService(typeof(ODataQuerySettings), settings.QuerySettings);
88+
c.AddService(typeof(DefaultQuerySettings), settings.DefaultQuerySettings);
89+
c.AddService(typeof(SelectExpandQueryValidator), new SelectExpandQueryValidator(settings.DefaultQuerySettings));
90+
c.AddService(typeof(ODataSimplifiedOptions), SimplifiedOptions);
91+
c.AddService(typeof(ODataUriParserSettings), settings.ParserSettings);
92+
93+
return c;
94+
});
95+
96+
ServiceContainer container = new ServiceContainer(baseContainer);
7797
container.AddService(typeof(IEdmModel), edmModel);
78-
container.AddService(typeof(ODataQuerySettings), settings.QuerySettings);
79-
container.AddService(typeof(ODataUriParserSettings), settings.ParserSettings);
8098
container.AddService(typeof(FilterBinder), new FilterBinder(container));
8199
container.AddService(typeof(ODataUriResolver), settings.Resolver ?? ODataSettings.DefaultResolver);
82-
container.AddService(typeof(ODataSimplifiedOptions), SimplifiedOptions);
83100
container.AddService(typeof(ODataSettings), settings);
84-
container.AddService(typeof(DefaultQuerySettings), settings.DefaultQuerySettings);
85-
container.AddService(typeof(SelectExpandQueryValidator), new SelectExpandQueryValidator(settings.DefaultQuerySettings));
86-
101+
87102
ODataQuery<T> dataQuery = new ODataQuery<T>(query, container);
88103

89104
return dataQuery;

Community.OData.Linq.AspNetCore/Community.OData.Linq.AspNetCore.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
<Pack>True</Pack>
3636
<PackagePath></PackagePath>
3737
</None>
38+
<None Include="..\README.md">
39+
<Pack>True</Pack>
40+
<PackagePath>\</PackagePath>
41+
</None>
3842
</ItemGroup>
3943

4044
</Project>

Community.OData.Linq.Json/Community.OData.Linq.Json.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
<Pack>True</Pack>
3737
<PackagePath></PackagePath>
3838
</None>
39+
<None Include="..\README.md">
40+
<Pack>True</Pack>
41+
<PackagePath>\</PackagePath>
42+
</None>
3943
</ItemGroup>
4044

4145
</Project>

0 commit comments

Comments
 (0)