1313using NHibernate . Cfg ;
1414using NHibernate . Cfg . MappingSchema ;
1515using NHibernate . Collection ;
16+ using NHibernate . Engine . Query ;
1617using NHibernate . Mapping . ByCode ;
1718using NUnit . Framework ;
1819using NHibernate . Linq ;
1920
2021namespace NHibernate . Test . NHSpecificTest . NH2319
2122{
2223 using System . Threading . Tasks ;
24+ using System . Threading ;
2325 [ TestFixture ]
2426 public abstract class FixtureBaseAsync : TestCaseMappingByCode
2527 {
26- private Guid _parentId ;
28+ private Guid _parent1Id ;
2729 private Guid _child1Id ;
30+ private Guid _parent2Id ;
31+ private Guid _child3Id ;
2832
2933 [ Test ]
30- public async Task ShouldBeAbleToFindChildrenByNameAsync ( )
34+ public Task ShouldBeAbleToFindChildrenByNameAsync ( )
35+ {
36+ return FindChildrenByNameAsync ( _parent1Id , _child1Id ) ;
37+ }
38+
39+ private async Task FindChildrenByNameAsync ( Guid parentId , Guid childId , CancellationToken cancellationToken = default ( CancellationToken ) )
3140 {
3241 using ( var session = OpenSession ( ) )
3342 using ( session . BeginTransaction ( ) )
3443 {
35- var parent = await ( session . GetAsync < Parent > ( _parentId ) ) ;
44+ var parent = await ( session . GetAsync < Parent > ( parentId , cancellationToken ) ) ;
3645
3746 Assert . That ( parent , Is . Not . Null ) ;
3847
3948 var filtered = await ( parent . Children
4049 . AsQueryable ( )
4150 . Where ( x => x . Name == "Jack" )
42- . ToListAsync ( ) ) ;
51+ . ToListAsync ( cancellationToken ) ) ;
4352
4453 Assert . That ( filtered , Has . Count . EqualTo ( 1 ) ) ;
45- Assert . That ( filtered [ 0 ] . Id , Is . EqualTo ( _child1Id ) ) ;
54+ Assert . That ( filtered [ 0 ] . Id , Is . EqualTo ( childId ) ) ;
4655 }
4756 }
4857
@@ -52,7 +61,7 @@ public async Task ShouldBeAbleToPerformComplexFilteringAsync()
5261 using ( var session = OpenSession ( ) )
5362 using ( session . BeginTransaction ( ) )
5463 {
55- var parent = await ( session . GetAsync < Parent > ( _parentId ) ) ;
64+ var parent = await ( session . GetAsync < Parent > ( _parent1Id ) ) ;
5665
5766 Assert . NotNull ( parent ) ;
5867
@@ -67,13 +76,42 @@ public async Task ShouldBeAbleToPerformComplexFilteringAsync()
6776 }
6877 }
6978
79+ [ Test ]
80+ public async Task ShouldBeAbleToReuseQueryPlanAsync ( )
81+ {
82+ await ( ShouldBeAbleToFindChildrenByNameAsync ( ) ) ;
83+ using ( var spy = new LogSpy ( typeof ( QueryPlanCache ) ) )
84+ {
85+ Assert . That ( ShouldBeAbleToFindChildrenByNameAsync , Throws . Nothing ) ;
86+ AssertPlanCacheHit ( spy ) ;
87+ }
88+ }
89+
90+ [ Test ]
91+ public async Task ShouldNotMixResultsAsync ( )
92+ {
93+ await ( FindChildrenByNameAsync ( _parent1Id , _child1Id ) ) ;
94+ using ( var spy = new LogSpy ( typeof ( QueryPlanCache ) ) )
95+ {
96+ await ( FindChildrenByNameAsync ( _parent2Id , _child3Id ) ) ;
97+ AssertPlanCacheHit ( spy ) ;
98+ }
99+ }
100+
101+ private static void AssertPlanCacheHit ( LogSpy spy ) =>
102+ // Each query currently ask the cache two times, so asserting reuse requires to check cache has not been missed
103+ // rather than only asserting it has been hit.
104+ Assert . That ( spy . GetWholeLog ( ) ,
105+ Contains . Substring ( "located collection-filter query plan in cache (" )
106+ . And . Not . Contains ( "unable to locate collection-filter query plan in cache" ) ) ;
107+
70108 [ Test ]
71109 public async Task ShouldNotInitializeCollectionWhenPerformingQueryAsync ( )
72110 {
73111 using ( var session = OpenSession ( ) )
74112 using ( session . BeginTransaction ( ) )
75113 {
76- var parent = await ( session . GetAsync < Parent > ( _parentId ) ) ;
114+ var parent = await ( session . GetAsync < Parent > ( _parent1Id ) ) ;
77115 Assert . That ( parent , Is . Not . Null ) ;
78116
79117 var persistentCollection = ( IPersistentCollection ) parent . Children ;
@@ -94,7 +132,7 @@ public async Task ShouldPerformSqlQueryEvenIfCollectionAlreadyInitializedAsync()
94132 using ( var session = OpenSession ( ) )
95133 using ( session . BeginTransaction ( ) )
96134 {
97- var parent = await ( session . GetAsync < Parent > ( _parentId ) ) ;
135+ var parent = await ( session . GetAsync < Parent > ( _parent1Id ) ) ;
98136 Assert . That ( parent , Is . Not . Null ) ;
99137
100138 var loaded = parent . Children . ToList ( ) ;
@@ -120,7 +158,7 @@ public async Task TestFilterAsync()
120158 using ( var session = OpenSession ( ) )
121159 using ( session . BeginTransaction ( ) )
122160 {
123- var parent = await ( session . GetAsync < Parent > ( _parentId ) ) ;
161+ var parent = await ( session . GetAsync < Parent > ( _parent1Id ) ) ;
124162 Assert . That ( parent , Is . Not . Null ) ;
125163
126164 var children = await ( ( await ( session . CreateFilterAsync ( parent . Children , "where this.Name = 'Jack'" ) ) )
@@ -141,11 +179,11 @@ protected override void OnSetUp()
141179 using ( var session = OpenSession ( ) )
142180 using ( var transaction = session . BeginTransaction ( ) )
143181 {
144- var parent1 = new Parent { Name = "Bob" } ;
145- _parentId = ( Guid ) session . Save ( parent1 ) ;
182+ var parent1 = new Parent { Name = "Bob" } ;
183+ _parent1Id = ( Guid ) session . Save ( parent1 ) ;
146184
147- var parent2 = new Parent { Name = "Martin" } ;
148- session . Save ( parent2 ) ;
185+ var parent2 = new Parent { Name = "Martin" } ;
186+ _parent2Id = ( Guid ) session . Save ( parent2 ) ;
149187
150188 var child1 = new Child
151189 {
@@ -185,7 +223,7 @@ protected override void OnSetUp()
185223 Parent = parent2
186224 } ;
187225 parent2 . Children . Add ( child3 ) ;
188- session . Save ( child3 ) ;
226+ _child3Id = ( Guid ) session . Save ( child3 ) ;
189227
190228 session . Flush ( ) ;
191229 transaction . Commit ( ) ;
0 commit comments