Skip to content

Commit 8e854b3

Browse files
Merge pull request #1718 from bahusoid/futureMerge2
Combine Future queries for ICriteria and IQuery
2 parents 8030961 + 2de3f85 commit 8e854b3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+3632
-180
lines changed

src/NHibernate.Test/Async/Futures/LinqFutureFixture.cs

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,36 @@ public async Task CanUseFutureQueryAsync()
176176
}
177177
}
178178

179+
[Test]
180+
public async Task CanUseFutureQueryAndQueryOverForSatelessSessionAsync()
181+
{
182+
IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
183+
184+
using (var s = Sfi.OpenStatelessSession())
185+
{
186+
var persons10 = s.Query<Person>()
187+
.Take(10)
188+
.ToFuture();
189+
var persons5 = s.QueryOver<Person>()
190+
.Take(5)
191+
.Future();
192+
193+
using (var logSpy = new SqlLogSpy())
194+
{
195+
foreach (var person in await (persons5.GetEnumerableAsync()))
196+
{
197+
}
198+
199+
foreach (var person in await (persons10.GetEnumerableAsync()))
200+
{
201+
}
202+
203+
var events = logSpy.Appender.GetEvents();
204+
Assert.AreEqual(1, events.Length);
205+
}
206+
}
207+
}
208+
179209
[Test]
180210
public async Task CanUseFutureQueryWithAnonymousTypeAsync()
181211
{
@@ -412,5 +442,120 @@ public async Task UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisi
412442
await (tx.CommitAsync());
413443
}
414444
}
445+
446+
[Test]
447+
public async Task FutureCombineCachedAndNonCachedQueriesAsync()
448+
{
449+
using (var s = OpenSession())
450+
using (var tx = s.BeginTransaction())
451+
{
452+
var p1 = new Person
453+
{
454+
Name = "Person name",
455+
Age = 15
456+
};
457+
var p2 = new Person
458+
{
459+
Name = "Person name",
460+
Age = 20
461+
};
462+
463+
await (s.SaveAsync(p1));
464+
await (s.SaveAsync(p2));
465+
await (tx.CommitAsync());
466+
}
467+
468+
using (var s = Sfi.OpenSession())
469+
{
470+
var list = new List<IFutureEnumerable<Person>>();
471+
for (var i = 0; i < 5; i++)
472+
{
473+
var i1 = i;
474+
var query = s.Query<Person>().Where(x => x.Age > i1);
475+
list.Add(query.WithOptions(x => x.SetCacheable(true)).ToFuture());
476+
}
477+
478+
foreach (var query in list)
479+
{
480+
var result = (await (query.GetEnumerableAsync())).ToList();
481+
Assert.That(result.Count, Is.EqualTo(2));
482+
}
483+
}
484+
485+
//Check query.List returns data from cache
486+
Sfi.Statistics.IsStatisticsEnabled = true;
487+
using (var s = Sfi.OpenSession())
488+
{
489+
var list = new List<IEnumerable<Person>>();
490+
for (var i = 0; i < 5; i++)
491+
{
492+
var i1 = i;
493+
var query = s.Query<Person>().Where(x => x.Age > i1);
494+
495+
list.Add(await (query.WithOptions(x => x.SetCacheable(true)).ToListAsync()));
496+
}
497+
498+
foreach (var query in list)
499+
{
500+
var result = query.ToList();
501+
Assert.That(result.Count, Is.EqualTo(2));
502+
}
503+
504+
Assert.That(Sfi.Statistics.PrepareStatementCount, Is.EqualTo(0), "Queries must be retrieved from cache");
505+
}
506+
507+
//Check another Future returns data from cache
508+
Sfi.Statistics.Clear();
509+
using (var s = Sfi.OpenSession())
510+
{
511+
var list = new List<IFutureEnumerable<Person>>();
512+
//Reverse order of queries added to cache
513+
for (var i = 5 - 1; i >= 0; i--)
514+
{
515+
var i1 = i;
516+
var query = s.Query<Person>().Where(x => x.Age > i1);
517+
518+
list.Add(query.WithOptions(x => x.SetCacheable(true)).ToFuture());
519+
}
520+
521+
foreach (var query in list)
522+
{
523+
var result = (await (query.GetEnumerableAsync())).ToList();
524+
Assert.That(result.Count, Is.EqualTo(2));
525+
}
526+
527+
Assert.That(Sfi.Statistics.PrepareStatementCount , Is.EqualTo(0), "Future queries must be retrieved from cache");
528+
}
529+
530+
using (var s = OpenSession())
531+
using (var tx = s.BeginTransaction())
532+
{
533+
await (s.DeleteAsync("from Person"));
534+
await (tx.CommitAsync());
535+
}
536+
}
537+
538+
[Test]
539+
public async Task FutureAutoFlushAsync()
540+
{
541+
using (var s = OpenSession())
542+
using (var tx = s.BeginTransaction())
543+
{
544+
s.FlushMode = FlushMode.Auto;
545+
var p1 = new Person
546+
{
547+
Name = "Person name",
548+
Age = 15
549+
};
550+
await (s.SaveAsync(p1));
551+
await (s.FlushAsync());
552+
553+
await (s.DeleteAsync(p1));
554+
var count = await (s.QueryOver<Person>().ToRowCountQuery().FutureValue<int>().GetValueAsync());
555+
await (tx.CommitAsync());
556+
557+
Assert.That(count, Is.EqualTo(0), "Session wasn't auto flushed.");
558+
}
559+
}
415560
}
416561
}

0 commit comments

Comments
 (0)