Skip to content

Commit 57caa6e

Browse files
committed
Add query plan cache check
1 parent af48953 commit 57caa6e

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/NHibernate.Test/Async/Linq/ParameterTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
using System.Collections.Generic;
1313
using System.Linq;
1414
using System.Linq.Expressions;
15+
using System.Reflection;
1516
using System.Text.RegularExpressions;
1617
using NHibernate.DomainModel.Northwind.Entities;
18+
using NHibernate.Engine.Query;
1719
using NHibernate.Linq;
20+
using NHibernate.Util;
1821
using NUnit.Framework;
1922

2023
namespace NHibernate.Test.Linq
@@ -323,7 +326,18 @@ public async Task UsingTwoParametersInDMLDeleteAsync()
323326
Is.EqualTo(linqParameterNumber ?? parameterNumber),
324327
"Linq expression has different number of parameters");
325328

329+
var queryPlanCacheType = typeof(QueryPlanCache);
330+
var cache = (SoftLimitMRUCache)
331+
queryPlanCacheType
332+
.GetField("planCache", BindingFlags.Instance | BindingFlags.NonPublic)
333+
.GetValue(Sfi.QueryPlanCache);
334+
cache.Clear();
335+
326336
await (query.ToListAsync(cancellationToken));
337+
338+
// In case of arrays two query plans will be stored, one with an one without expended parameters
339+
Assert.That(cache, Has.Count.EqualTo(linqParameterNumber.HasValue ? 2 : 1), "Query should be cacheable");
340+
327341
AssertParameters(sqlSpy, parameterNumber);
328342
}
329343
}

src/NHibernate.Test/Linq/ParameterTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Linq.Expressions;
5+
using System.Reflection;
56
using System.Text.RegularExpressions;
67
using NHibernate.DomainModel.Northwind.Entities;
8+
using NHibernate.Engine.Query;
79
using NHibernate.Linq;
10+
using NHibernate.Util;
811
using NUnit.Framework;
912

1013
namespace NHibernate.Test.Linq
@@ -384,7 +387,18 @@ private void AssertTotalParameters<T>(IQueryable<T> query, int parameterNumber,
384387
Is.EqualTo(linqParameterNumber ?? parameterNumber),
385388
"Linq expression has different number of parameters");
386389

390+
var queryPlanCacheType = typeof(QueryPlanCache);
391+
var cache = (SoftLimitMRUCache)
392+
queryPlanCacheType
393+
.GetField("planCache", BindingFlags.Instance | BindingFlags.NonPublic)
394+
.GetValue(Sfi.QueryPlanCache);
395+
cache.Clear();
396+
387397
query.ToList();
398+
399+
// In case of arrays two query plans will be stored, one with an one without expended parameters
400+
Assert.That(cache, Has.Count.EqualTo(linqParameterNumber.HasValue ? 2 : 1), "Query should be cacheable");
401+
388402
AssertParameters(sqlSpy, parameterNumber);
389403
}
390404
}

0 commit comments

Comments
 (0)