Skip to content

Commit 866c3eb

Browse files
bahusoidfredericDelaporte
authored andcommitted
Fix auto-flush for multi criteria
Fixes #865
1 parent 00ac90f commit 866c3eb

File tree

4 files changed

+70
-8
lines changed

4 files changed

+70
-8
lines changed

src/NHibernate.Test/Async/QueryTest/MultiCriteriaFixture.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,5 +474,32 @@ public async Task UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisi
474474
}
475475
}
476476
}
477+
478+
//NH-2428 - Session.MultiCriteria and FlushMode.Auto inside transaction (GH865)
479+
[Test]
480+
public async Task MultiCriteriaAutoFlushAsync()
481+
{
482+
using (var s = OpenSession())
483+
using (var tx = s.BeginTransaction())
484+
{
485+
s.FlushMode = FlushMode.Auto;
486+
var p1 = new Item
487+
{
488+
Name = "Person name",
489+
Id = 15
490+
};
491+
await (s.SaveAsync(p1));
492+
await (s.FlushAsync());
493+
494+
await (s.DeleteAsync(p1));
495+
var multi = s.CreateMultiCriteria();
496+
multi.Add<int>(s.QueryOver<Item>().ToRowCountQuery());
497+
var count = (int) ((IList) (await (multi.ListAsync()))[0])[0];
498+
await (tx.CommitAsync());
499+
500+
Assert.That(count, Is.EqualTo(0), "Session wasn't auto flushed.");
501+
502+
}
503+
}
477504
}
478505
}

src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,5 +520,32 @@ public void UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisions()
520520
}
521521
}
522522
}
523+
524+
//NH-2428 - Session.MultiCriteria and FlushMode.Auto inside transaction (GH865)
525+
[Test]
526+
public void MultiCriteriaAutoFlush()
527+
{
528+
using (var s = OpenSession())
529+
using (var tx = s.BeginTransaction())
530+
{
531+
s.FlushMode = FlushMode.Auto;
532+
var p1 = new Item
533+
{
534+
Name = "Person name",
535+
Id = 15
536+
};
537+
s.Save(p1);
538+
s.Flush();
539+
540+
s.Delete(p1);
541+
var multi = s.CreateMultiCriteria();
542+
multi.Add<int>(s.QueryOver<Item>().ToRowCountQuery());
543+
var count = (int) ((IList) multi.List()[0])[0];
544+
tx.Commit();
545+
546+
Assert.That(count, Is.EqualTo(0), "Session wasn't auto flushed.");
547+
548+
}
549+
}
523550
}
524551
}

src/NHibernate/Async/Impl/MultiCriteriaImpl.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Collections;
1313
using System.Collections.Generic;
1414
using System.Diagnostics;
15+
using System.Linq;
1516
using NHibernate.Cache;
1617
using NHibernate.Criterion;
1718
using NHibernate.Driver;
@@ -49,9 +50,14 @@ public partial class MultiCriteriaImpl : IMultiCriteria
4950
}
5051
}
5152

53+
var querySpaces = new HashSet<string>(loaders.SelectMany(l => l.QuerySpaces));
54+
if (resultSetsCommand.HasQueries)
55+
{
56+
await (session.AutoFlushIfRequiredAsync(querySpaces, cancellationToken)).ConfigureAwait(false);
57+
}
5258
if (cacheable)
5359
{
54-
criteriaResults = await (ListUsingQueryCacheAsync(cancellationToken)).ConfigureAwait(false);
60+
criteriaResults = await (ListUsingQueryCacheAsync(querySpaces, cancellationToken)).ConfigureAwait(false);
5561
}
5662
else
5763
{
@@ -62,20 +68,18 @@ public partial class MultiCriteriaImpl : IMultiCriteria
6268
}
6369
}
6470

65-
private async Task<IList> ListUsingQueryCacheAsync(CancellationToken cancellationToken)
71+
private async Task<IList> ListUsingQueryCacheAsync(HashSet<string> querySpaces, CancellationToken cancellationToken)
6672
{
6773
cancellationToken.ThrowIfCancellationRequested();
6874
IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion);
6975

7076
ISet<FilterKey> filterKeys = FilterKey.CreateFilterKeys(session.EnabledFilters);
7177

72-
ISet<string> querySpaces = new HashSet<string>();
7378
List<IType[]> resultTypesList = new List<IType[]>();
7479
int[] maxRows = new int[loaders.Count];
7580
int[] firstRows = new int[loaders.Count];
7681
for (int i = 0; i < loaders.Count; i++)
7782
{
78-
querySpaces.UnionWith(loaders[i].QuerySpaces);
7983
resultTypesList.Add(loaders[i].ResultTypes);
8084
firstRows[i] = parameters[i].RowSelection.FirstRow;
8185
maxRows[i] = parameters[i].RowSelection.MaxRows;

src/NHibernate/Impl/MultiCriteriaImpl.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Diagnostics;
5+
using System.Linq;
56
using NHibernate.Cache;
67
using NHibernate.Criterion;
78
using NHibernate.Driver;
@@ -77,9 +78,14 @@ public IList List()
7778
}
7879
}
7980

81+
var querySpaces = new HashSet<string>(loaders.SelectMany(l => l.QuerySpaces));
82+
if (resultSetsCommand.HasQueries)
83+
{
84+
session.AutoFlushIfRequired(querySpaces);
85+
}
8086
if (cacheable)
8187
{
82-
criteriaResults = ListUsingQueryCache();
88+
criteriaResults = ListUsingQueryCache(querySpaces);
8389
}
8490
else
8591
{
@@ -90,19 +96,17 @@ public IList List()
9096
}
9197
}
9298

93-
private IList ListUsingQueryCache()
99+
private IList ListUsingQueryCache(HashSet<string> querySpaces)
94100
{
95101
IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion);
96102

97103
ISet<FilterKey> filterKeys = FilterKey.CreateFilterKeys(session.EnabledFilters);
98104

99-
ISet<string> querySpaces = new HashSet<string>();
100105
List<IType[]> resultTypesList = new List<IType[]>();
101106
int[] maxRows = new int[loaders.Count];
102107
int[] firstRows = new int[loaders.Count];
103108
for (int i = 0; i < loaders.Count; i++)
104109
{
105-
querySpaces.UnionWith(loaders[i].QuerySpaces);
106110
resultTypesList.Add(loaders[i].ResultTypes);
107111
firstRows[i] = parameters[i].RowSelection.FirstRow;
108112
maxRows[i] = parameters[i].RowSelection.MaxRows;

0 commit comments

Comments
 (0)