Skip to content

Commit 0595a4a

Browse files
Add SetFlushMode to Linq
1 parent e3bd18e commit 0595a4a

File tree

3 files changed

+360
-1
lines changed

3 files changed

+360
-1
lines changed
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Linq;
12+
using NHibernate.Cfg;
13+
using NHibernate.Linq;
14+
using NUnit.Framework;
15+
16+
namespace NHibernate.Test.Linq
17+
{
18+
using System.Threading.Tasks;
19+
[TestFixture]
20+
public class QueryFlushModeTestsAsync : LinqTestCase
21+
{
22+
protected override void Configure(Configuration configuration)
23+
{
24+
configuration.SetProperty(Environment.GenerateStatistics, "true");
25+
base.Configure(configuration);
26+
}
27+
28+
[Test]
29+
public async Task CanSetFlushModeOnQueriesAsync(
30+
[Values(FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual)]
31+
FlushMode flushMode)
32+
{
33+
Sfi.Statistics.Clear();
34+
35+
using (var t = session.BeginTransaction())
36+
{
37+
var customer = await (db.Customers.FirstAsync());
38+
customer.CompanyName = "Blah";
39+
40+
var unused =
41+
await (db.Customers
42+
.Where(c => c.CompanyName == "Bon app'")
43+
.WithOptions(o => o.SetFlushMode(flushMode))
44+
.ToListAsync());
45+
46+
var expectedFlushCount = 0;
47+
switch (flushMode)
48+
{
49+
case FlushMode.Always:
50+
case FlushMode.Auto:
51+
expectedFlushCount++;
52+
break;
53+
}
54+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on same entity query");
55+
56+
customer.CompanyName = "Other blah";
57+
58+
var dummy =
59+
await (db.Orders
60+
.Where(o => o.OrderId > 10)
61+
.WithOptions(o => o.SetFlushMode(flushMode))
62+
.ToListAsync());
63+
64+
switch (flushMode)
65+
{
66+
case FlushMode.Always:
67+
expectedFlushCount++;
68+
break;
69+
}
70+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on other entity query");
71+
72+
// Tests here should not alter data, LinqTestCase derives from ReadonlyTestCase
73+
await (t.RollbackAsync());
74+
}
75+
}
76+
77+
[Test]
78+
public async Task CanSetCommentOnPagingQueryAsync(
79+
[Values(FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual)]
80+
FlushMode flushMode)
81+
{
82+
Sfi.Statistics.Clear();
83+
84+
using (var t = session.BeginTransaction())
85+
{
86+
var customer = await (db.Customers.FirstAsync());
87+
customer.CompanyName = "Blah";
88+
89+
var unused =
90+
await (db.Customers
91+
.Skip(1).Take(1)
92+
.WithOptions(o => o.SetFlushMode(flushMode))
93+
.ToListAsync());
94+
95+
var expectedFlushCount = 0;
96+
switch (flushMode)
97+
{
98+
case FlushMode.Always:
99+
case FlushMode.Auto:
100+
expectedFlushCount++;
101+
break;
102+
}
103+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on same entity query");
104+
105+
customer.CompanyName = "Other blah";
106+
107+
var dummy =
108+
await (db.Orders
109+
.Skip(1).Take(1)
110+
.WithOptions(o => o.SetFlushMode(flushMode))
111+
.ToListAsync());
112+
113+
switch (flushMode)
114+
{
115+
case FlushMode.Always:
116+
expectedFlushCount++;
117+
break;
118+
}
119+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on other entity query");
120+
121+
// Tests here should not alter data, LinqTestCase derives from ReadonlyTestCase
122+
await (t.RollbackAsync());
123+
}
124+
}
125+
126+
[Test]
127+
public async Task CanSetCommentBeforeSkipOnOrderedPageQueryAsync(
128+
[Values(FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual)]
129+
FlushMode flushMode)
130+
{
131+
Sfi.Statistics.Clear();
132+
133+
using (var t = session.BeginTransaction())
134+
{
135+
var customer = await (db.Customers.FirstAsync());
136+
customer.CompanyName = "Blah";
137+
138+
var unused =
139+
await (db.Customers
140+
.OrderBy(c => c.CompanyName)
141+
.Skip(5).Take(5)
142+
.WithOptions(o => o.SetFlushMode(flushMode))
143+
.ToListAsync());
144+
145+
var expectedFlushCount = 0;
146+
switch (flushMode)
147+
{
148+
case FlushMode.Always:
149+
case FlushMode.Auto:
150+
expectedFlushCount++;
151+
break;
152+
}
153+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on same entity query");
154+
155+
customer.CompanyName = "Other blah";
156+
157+
var dummy =
158+
await (db.Orders
159+
.OrderBy(o => o.OrderId)
160+
.Skip(5).Take(5)
161+
.WithOptions(o => o.SetFlushMode(flushMode))
162+
.ToListAsync());
163+
164+
switch (flushMode)
165+
{
166+
case FlushMode.Always:
167+
expectedFlushCount++;
168+
break;
169+
}
170+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on other entity query");
171+
172+
// Tests here should not alter data, LinqTestCase derives from ReadonlyTestCase
173+
await (t.RollbackAsync());
174+
}
175+
}
176+
}
177+
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
using System.Linq;
2+
using NHibernate.Cfg;
3+
using NHibernate.Linq;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.Linq
7+
{
8+
[TestFixture]
9+
public class QueryFlushModeTests : LinqTestCase
10+
{
11+
protected override void Configure(Configuration configuration)
12+
{
13+
configuration.SetProperty(Environment.GenerateStatistics, "true");
14+
base.Configure(configuration);
15+
}
16+
17+
[Test]
18+
public void CanSetFlushModeOnQueries(
19+
[Values(FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual)]
20+
FlushMode flushMode)
21+
{
22+
Sfi.Statistics.Clear();
23+
24+
using (var t = session.BeginTransaction())
25+
{
26+
var customer = db.Customers.First();
27+
customer.CompanyName = "Blah";
28+
29+
var unused =
30+
db.Customers
31+
.Where(c => c.CompanyName == "Bon app'")
32+
.WithOptions(o => o.SetFlushMode(flushMode))
33+
.ToList();
34+
35+
var expectedFlushCount = 0;
36+
switch (flushMode)
37+
{
38+
case FlushMode.Always:
39+
case FlushMode.Auto:
40+
expectedFlushCount++;
41+
break;
42+
}
43+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on same entity query");
44+
45+
customer.CompanyName = "Other blah";
46+
47+
var dummy =
48+
db.Orders
49+
.Where(o => o.OrderId > 10)
50+
.WithOptions(o => o.SetFlushMode(flushMode))
51+
.ToList();
52+
53+
switch (flushMode)
54+
{
55+
case FlushMode.Always:
56+
expectedFlushCount++;
57+
break;
58+
}
59+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on other entity query");
60+
61+
// Tests here should not alter data, LinqTestCase derives from ReadonlyTestCase
62+
t.Rollback();
63+
}
64+
}
65+
66+
[Test]
67+
public void CanSetCommentOnPagingQuery(
68+
[Values(FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual)]
69+
FlushMode flushMode)
70+
{
71+
Sfi.Statistics.Clear();
72+
73+
using (var t = session.BeginTransaction())
74+
{
75+
var customer = db.Customers.First();
76+
customer.CompanyName = "Blah";
77+
78+
var unused =
79+
db.Customers
80+
.Skip(1).Take(1)
81+
.WithOptions(o => o.SetFlushMode(flushMode))
82+
.ToList();
83+
84+
var expectedFlushCount = 0;
85+
switch (flushMode)
86+
{
87+
case FlushMode.Always:
88+
case FlushMode.Auto:
89+
expectedFlushCount++;
90+
break;
91+
}
92+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on same entity query");
93+
94+
customer.CompanyName = "Other blah";
95+
96+
var dummy =
97+
db.Orders
98+
.Skip(1).Take(1)
99+
.WithOptions(o => o.SetFlushMode(flushMode))
100+
.ToList();
101+
102+
switch (flushMode)
103+
{
104+
case FlushMode.Always:
105+
expectedFlushCount++;
106+
break;
107+
}
108+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on other entity query");
109+
110+
// Tests here should not alter data, LinqTestCase derives from ReadonlyTestCase
111+
t.Rollback();
112+
}
113+
}
114+
115+
[Test]
116+
public void CanSetCommentBeforeSkipOnOrderedPageQuery(
117+
[Values(FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual)]
118+
FlushMode flushMode)
119+
{
120+
Sfi.Statistics.Clear();
121+
122+
using (var t = session.BeginTransaction())
123+
{
124+
var customer = db.Customers.First();
125+
customer.CompanyName = "Blah";
126+
127+
var unused =
128+
db.Customers
129+
.OrderBy(c => c.CompanyName)
130+
.Skip(5).Take(5)
131+
.WithOptions(o => o.SetFlushMode(flushMode))
132+
.ToList();
133+
134+
var expectedFlushCount = 0;
135+
switch (flushMode)
136+
{
137+
case FlushMode.Always:
138+
case FlushMode.Auto:
139+
expectedFlushCount++;
140+
break;
141+
}
142+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on same entity query");
143+
144+
customer.CompanyName = "Other blah";
145+
146+
var dummy =
147+
db.Orders
148+
.OrderBy(o => o.OrderId)
149+
.Skip(5).Take(5)
150+
.WithOptions(o => o.SetFlushMode(flushMode))
151+
.ToList();
152+
153+
switch (flushMode)
154+
{
155+
case FlushMode.Always:
156+
expectedFlushCount++;
157+
break;
158+
}
159+
Assert.That(Sfi.Statistics.FlushCount, Is.EqualTo(expectedFlushCount), "Unexpected flush count on other entity query");
160+
161+
// Tests here should not alter data, LinqTestCase derives from ReadonlyTestCase
162+
t.Rollback();
163+
}
164+
}
165+
}
166+
}

src/NHibernate/Linq/NhQueryableOptions.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class NhQueryableOptions
1414
protected int? Timeout { get; private set; }
1515
protected bool? ReadOnly { get; private set; }
1616
protected string Comment { get; private set; }
17+
protected FlushMode? FlushMode { get; private set; }
1718

1819
#pragma warning disable 618
1920
/// <inheritdoc />
@@ -112,6 +113,17 @@ public NhQueryableOptions SetComment(string comment)
112113
Comment = comment;
113114
return this;
114115
}
116+
117+
/// <summary>
118+
/// Override the current session flush mode, just for this query.
119+
/// </summary>
120+
/// <param name="flushMode">The flush mode to use for the query.</param>
121+
/// <returns><see langword="this"/> (for method chaining).</returns>
122+
public NhQueryableOptions SetFlushMode(FlushMode flushMode)
123+
{
124+
FlushMode = flushMode;
125+
return this;
126+
}
115127

116128
protected internal NhQueryableOptions Clone()
117129
{
@@ -122,7 +134,8 @@ protected internal NhQueryableOptions Clone()
122134
CacheRegion = CacheRegion,
123135
Timeout = Timeout,
124136
ReadOnly = ReadOnly,
125-
Comment = Comment
137+
Comment = Comment,
138+
FlushMode = FlushMode
126139
};
127140
}
128141

@@ -145,6 +158,9 @@ protected internal void Apply(IQuery query)
145158

146159
if (!string.IsNullOrEmpty(Comment))
147160
query.SetComment(Comment);
161+
162+
if (FlushMode.HasValue)
163+
query.SetFlushMode(FlushMode.Value);
148164
}
149165
}
150166
}

0 commit comments

Comments
 (0)