Skip to content

Commit 692a987

Browse files
Merge branch 'master' into RefactorSequentialSelect
2 parents 07e02c4 + f5e2431 commit 692a987

File tree

56 files changed

+1047
-518
lines changed

Some content is hidden

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

56 files changed

+1047
-518
lines changed

Diff for: Tools/packages.config

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<package id="NUnit.Extension.NUnitV2ResultWriter" version="3.6.0" targetFramework="net461" />
88
<package id="NUnit.Extension.TeamCityEventListener" version="1.0.2" targetFramework="net461" />
99
<package id="NUnit.Extension.VSProjectLoader" version="3.6.0" targetFramework="net461" />
10-
<package id="CSharpAsyncGenerator.CommandLine" version="0.8.2.9" targetFramework="net461" />
10+
<package id="CSharpAsyncGenerator.CommandLine" version="0.13.1" targetFramework="net461" />
1111
<package id="vswhere" version="2.1.4" targetFramework="net461" />
1212
<package id="gitreleasemanager" version="0.7.0" targetFramework="net461" />
1313
</packages>

Diff for: build-common/NHibernate.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<PackageProjectUrl>http://nhibernate.info</PackageProjectUrl>
2525
<PackageIconUrl>https://raw.githubusercontent.com/nhibernate/nhibernate-core/master/logo/NHibernate-NuGet.png</PackageIconUrl>
2626
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
27-
<PackageLicenseUrl>https://raw.githubusercontent.com/nhibernate/nhibernate-core/master/LICENSE.txt</PackageLicenseUrl>
27+
<PackageLicenseExpression>LGPL-2.1-only</PackageLicenseExpression>
2828
<PackageReleaseNotes>https://github.com/nhibernate/nhibernate-core/blob/$(VersionPrefix)/releasenotes.txt</PackageReleaseNotes>
2929
<RepositoryUrl>https://github.com/nhibernate/nhibernate-core.git</RepositoryUrl>
3030
<RepositoryType>git</RepositoryType>

Diff for: src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs

+23
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public async Task ProjectTransformToDtoAsync()
9999
var actual = await (s.QueryOver<Person>()
100100
.SelectList(list => list
101101
.SelectGroup(p => p.Name).WithAlias(() => summary.Name)
102+
//GH1985: DateTime.xxxx are not supported in SelectGroup
103+
.SelectGroup(p => p.BirthDate.Year).WithAlias(() => summary.BirthYear)
102104
.Select(Projections.RowCount()).WithAlias(() => summary.Count))
103105
.OrderByAlias(() => summary.Name).Asc
104106
.TransformUsing(Transformers.AliasToBean<PersonSummary>())
@@ -111,5 +113,26 @@ public async Task ProjectTransformToDtoAsync()
111113
Assert.That(actual[1].Count, Is.EqualTo(1));
112114
}
113115
}
116+
117+
[Test]
118+
public async Task ProjecionCountDistinctAsync()
119+
{
120+
if (!TestDialect.SupportsCountDistinct)
121+
Assert.Ignore("Dialect does not support count distinct");
122+
123+
using (var s = OpenSession())
124+
using (s.BeginTransaction())
125+
{
126+
var actual
127+
= (await (s.QueryOver<Person>()
128+
.SelectList(l =>
129+
l.SelectCountDistinct(p => p.BirthDate.Year)
130+
.SelectCountDistinct(p => p.Name))
131+
.ListAsync<object[]>())).FirstOrDefault();
132+
133+
Assert.That((int) actual[0], Is.EqualTo(1), "distinct count by birth year");
134+
Assert.That((int) actual[1], Is.EqualTo(2), "distinct count by name");
135+
}
136+
}
114137
}
115138
}

Diff for: src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs

+27
Original file line numberDiff line numberDiff line change
@@ -166,5 +166,32 @@ public async Task SubQueryAsync()
166166
Assert.That(nameAndChildCount[1].ChildCount, Is.EqualTo(1));
167167
}
168168
}
169+
170+
//NH-3493 - Cannot use alias between more than 1 level of nested queries
171+
[Test]
172+
public async Task ThreeLevelSubqueryAsync()
173+
{
174+
if (!Dialect.SupportsScalarSubSelects)
175+
Assert.Ignore("Dialect does not support scalar sub-select");
176+
177+
Person p = null;
178+
var detachedCriteria2 = DetachedCriteria.For<Person>("vf_inner_2")
179+
.SetProjection(Projections.Id())
180+
.Add(Restrictions.Eq($@"mk.{nameof(p.Age)}", 20))
181+
.Add(Restrictions.EqProperty("vf_inner_2.Id", "vf_inner.Id"));
182+
183+
var detachedCriteria1 = DetachedCriteria.For<Person>("vf_inner")
184+
.SetProjection(Projections.Id())
185+
.Add(Subqueries.Exists(detachedCriteria2))
186+
.Add(Restrictions.EqProperty("vf_inner.Id", "vf.Id"));
187+
188+
using (var s = OpenSession())
189+
{
190+
await (s.CreateCriteria<Person>("vf")
191+
.CreateAlias($"vf.{nameof(p.Father)}", "mk")
192+
.AddOrder(Order.Asc(Projections.SubQuery(detachedCriteria1)))
193+
.ListAsync<Person>());
194+
}
195+
}
169196
}
170197
}

Diff for: src/NHibernate.Test/Async/LazyProperty/LazyPropertyFixture.cs

+53
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010

1111
using System.Collections;
12+
using System.Collections.Generic;
1213
using System.Linq;
1314
using NHibernate.Cfg;
1415
using NHibernate.Intercept;
@@ -81,6 +82,7 @@ protected override void OnTearDown()
8182
using (var s = OpenSession())
8283
using (var tx = s.BeginTransaction())
8384
{
85+
s.CreateQuery("delete from Word").ExecuteUpdate();
8486
s.CreateQuery("delete from Book").ExecuteUpdate();
8587
tx.Commit();
8688
}
@@ -345,5 +347,56 @@ public async Task CacheShouldNotContainLazyPropertiesAsync()
345347
Assert.That(NHibernateUtil.IsPropertyInitialized(book, "ALotOfText"), Is.False);
346348
Assert.That(NHibernateUtil.IsPropertyInitialized(book, "Image"), Is.False);
347349
}
350+
351+
[Test]
352+
public async Task CanMergeTransientWithLazyPropertyInCollectionAsync()
353+
{
354+
Book book;
355+
356+
using (var s = OpenSession())
357+
using (var tx = s.BeginTransaction())
358+
{
359+
book = new Book
360+
{
361+
Name = "some name two",
362+
Id = 3,
363+
ALotOfText = "a lot of text two..."
364+
};
365+
// This should insert a new entity.
366+
await (s.MergeAsync(book));
367+
await (tx.CommitAsync());
368+
}
369+
370+
using (var s = OpenSession())
371+
{
372+
book = await (s.GetAsync<Book>(3));
373+
Assert.That(book, Is.Not.Null);
374+
Assert.That(book.Name, Is.EqualTo("some name two"));
375+
Assert.That(book.ALotOfText, Is.EqualTo("a lot of text two..."));
376+
377+
}
378+
using (var s = OpenSession())
379+
using (var tx = s.BeginTransaction())
380+
{
381+
book.Words = new List<Word>();
382+
var word = new Word
383+
{
384+
Id = 2,
385+
Parent = book,
386+
Content = new byte[1] {0}
387+
};
388+
389+
book.Words.Add(word);
390+
await (s.MergeAsync(book));
391+
await (tx.CommitAsync());
392+
}
393+
394+
using (var s = OpenSession())
395+
{
396+
book = await (s.GetAsync<Book>(3));
397+
Assert.That(book.Words.Any(), Is.True);
398+
Assert.That(book.Words.First().Content, Is.EqualTo(new byte[1] { 0 }));
399+
}
400+
}
348401
}
349402
}

Diff for: src/NHibernate.Test/Async/Linq/QueryTimeoutTests.cs

+4-18
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,8 @@ public TimeoutCatchingNonBatchingBatcher(ConnectionManager connectionManager, II
114114

115115
public override Task<DbDataReader> ExecuteReaderAsync(DbCommand cmd, CancellationToken cancellationToken)
116116
{
117-
try
118-
{
119-
LastCommandTimeout = cmd.CommandTimeout;
120-
return base.ExecuteReaderAsync(cmd, cancellationToken);
121-
}
122-
catch (System.Exception ex)
123-
{
124-
return Task.FromException<DbDataReader>(ex);
125-
}
117+
LastCommandTimeout = cmd.CommandTimeout;
118+
return base.ExecuteReaderAsync(cmd, cancellationToken);
126119
}
127120

128121
public override DbDataReader ExecuteReader(DbCommand cmd)
@@ -150,15 +143,8 @@ public partial class TimeoutCatchingNonBatchingBatcher : NonBatchingBatcher
150143

151144
public override Task<DbDataReader> ExecuteReaderAsync(DbCommand cmd, CancellationToken cancellationToken)
152145
{
153-
try
154-
{
155-
LastCommandTimeout = cmd.CommandTimeout;
156-
return base.ExecuteReaderAsync(cmd, cancellationToken);
157-
}
158-
catch (System.Exception ex)
159-
{
160-
return Task.FromException<DbDataReader>(ex);
161-
}
146+
LastCommandTimeout = cmd.CommandTimeout;
147+
return base.ExecuteReaderAsync(cmd, cancellationToken);
162148
}
163149
}
164150
}

Diff for: src/NHibernate.Test/Async/NHSpecificTest/GH1547/Fixture.cs

+1-8
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,7 @@ private partial class SubstituteDbCommand : DbCommand
158158

159159
protected override Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
160160
{
161-
try
162-
{
163-
return Task.FromResult<DbDataReader>(_substituteReader);
164-
}
165-
catch (Exception ex)
166-
{
167-
return Task.FromException<DbDataReader>(ex);
168-
}
161+
return Task.FromResult<DbDataReader>(_substituteReader);
169162
}
170163

171164
public override Task<int> ExecuteNonQueryAsync(CancellationToken cancellationToken)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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 NUnit.Framework;
13+
using NHibernate.Linq;
14+
15+
namespace NHibernate.Test.NHSpecificTest.GH1962
16+
{
17+
using System.Threading.Tasks;
18+
[TestFixture]
19+
public class FixtureAsync : BugTestCase
20+
{
21+
[Test]
22+
[KnownBug("#1962")]
23+
public async Task LinqShouldBeValidAsync()
24+
{
25+
using (var session = OpenSession())
26+
using (session.BeginTransaction())
27+
{
28+
var result =
29+
await (session
30+
.Query<Product>()
31+
.CountAsync(p => p.OrderDetails.Any(od => od.Order.OrderDetails[0] == od)));
32+
Assert.That(result, Is.EqualTo(0));
33+
}
34+
}
35+
}
36+
}

Diff for: src/NHibernate.Test/Async/NHSpecificTest/NH3848/Fixture.cs

+6-13
Original file line numberDiff line numberDiff line change
@@ -573,20 +573,13 @@ protected void ClearSecondLevelCacheFor(System.Type entity)
573573

574574
protected Task ClearCollectionCacheAsync<T>(Expression<Func<T, IEnumerable>> pathToCollection, CancellationToken cancellationToken = default(CancellationToken))
575575
{
576-
try
577-
{
578-
var rootEntityTypeFullPath = typeof(T).FullName;
579-
var memberExpression = pathToCollection.Body as MemberExpression;
580-
if (memberExpression == null)
581-
return Task.FromException<object>(new ArgumentException("pathToCollection should be member expression"));
576+
var rootEntityTypeFullPath = typeof(T).FullName;
577+
var memberExpression = pathToCollection.Body as MemberExpression;
578+
if (memberExpression == null)
579+
return Task.FromException<object>(new ArgumentException("pathToCollection should be member expression"));
582580

583-
var role = $"{rootEntityTypeFullPath}.{memberExpression.Member.Name}";
584-
return Sfi.EvictCollectionAsync(role, cancellationToken);
585-
}
586-
catch (Exception ex)
587-
{
588-
return Task.FromException<object>(ex);
589-
}
581+
var role = $"{rootEntityTypeFullPath}.{memberExpression.Member.Name}";
582+
return Sfi.EvictCollectionAsync(role, cancellationToken);
590583
}
591584

592585
protected void ClearCollectionCache<T>(Expression<Func<T, IEnumerable>> pathToCollection)

Diff for: src/NHibernate.Test/Async/SessionBuilder/Fixture.cs

-45
Original file line numberDiff line numberDiff line change
@@ -189,51 +189,6 @@ private void CanSetFlushMode<T>(T sb) where T : ISessionBuilder<T>
189189
FlushMode.Always, FlushMode.Auto, FlushMode.Commit, FlushMode.Manual);
190190
}
191191

192-
[Test]
193-
public async Task CanSetInterceptorAsync()
194-
{
195-
var sb = Sfi.WithOptions();
196-
await (CanSetInterceptorAsync(sb));
197-
using (var s = sb.OpenSession())
198-
{
199-
await (CanSetInterceptorAsync(s.SessionWithOptions()));
200-
}
201-
}
202-
203-
private Task CanSetInterceptorAsync<T>(T sb) where T : ISessionBuilder<T>
204-
{
205-
try
206-
{
207-
var sbType = sb.GetType().Name;
208-
// Do not use .Instance here, we want another instance.
209-
var interceptor = new EmptyInterceptor();
210-
var options = DebugSessionFactory.GetCreationOptions(sb);
211-
212-
Assert.AreEqual(Sfi.Interceptor, options.SessionInterceptor, $"{sbType}: Initial value");
213-
var fsb = sb.Interceptor(interceptor);
214-
Assert.AreEqual(interceptor, options.SessionInterceptor, $"{sbType}: After call with an interceptor");
215-
Assert.AreEqual(sb, fsb, $"{sbType}: Unexpected fluent return after call with an interceptor");
216-
217-
if (sb is ISharedSessionBuilder ssb)
218-
{
219-
var fssb = ssb.Interceptor();
220-
Assert.AreEqual(EmptyInterceptor.Instance, options.SessionInterceptor, $"{sbType}: After call with shared interceptor");
221-
Assert.AreEqual(sb, fssb, $"{sbType}: Unexpected fluent return on shared");
222-
}
223-
224-
Assert.Throws<ArgumentNullException>(() => sb.Interceptor(null), $"{sbType}: After call with null");
225-
226-
fsb = sb.NoInterceptor();
227-
Assert.AreEqual(EmptyInterceptor.Instance, options.SessionInterceptor, $"{sbType}: After no call");
228-
Assert.AreEqual(sb, fsb, $"{sbType}: Unexpected fluent return after no call");
229-
return Task.CompletedTask;
230-
}
231-
catch (Exception ex)
232-
{
233-
return Task.FromException<object>(ex);
234-
}
235-
}
236-
237192
private void CanSet<T, V>(T sb, Func<V, T> setter, Func<V> getter, Func<ISharedSessionBuilder> shared, V initialValue,
238193
params V[] values) where T : ISessionBuilder<T>
239194
{

Diff for: src/NHibernate.Test/Async/SystemTransactions/DistributedSystemTransactionFixture.cs

+3-10
Original file line numberDiff line numberDiff line change
@@ -690,16 +690,9 @@ public async Task EnforceConnectionUsageRulesOnTransactionCompletionAsync()
690690

691691
private Task DodgeTransactionCompletionDelayIfRequiredAsync(CancellationToken cancellationToken = default(CancellationToken))
692692
{
693-
try
694-
{
695-
if (Sfi.ConnectionProvider.Driver.HasDelayedDistributedTransactionCompletion)
696-
return Task.Delay(500, cancellationToken);
697-
return Task.CompletedTask;
698-
}
699-
catch (Exception ex)
700-
{
701-
return Task.FromException<object>(ex);
702-
}
693+
if (Sfi.ConnectionProvider.Driver.HasDelayedDistributedTransactionCompletion)
694+
return Task.Delay(500, cancellationToken);
695+
return Task.CompletedTask;
703696
}
704697

705698
private void DodgeTransactionCompletionDelayIfRequired()

Diff for: src/NHibernate.Test/Async/TransactionTest/TransactionNotificationFixture.cs

+4-18
Original file line numberDiff line numberDiff line change
@@ -132,28 +132,14 @@ public partial class Synchronization : ITransactionCompletionSynchronization
132132

133133
public Task ExecuteBeforeTransactionCompletionAsync(CancellationToken cancellationToken)
134134
{
135-
try
136-
{
137-
BeforeExecutions += 1;
138-
return Task.CompletedTask;
139-
}
140-
catch (Exception ex)
141-
{
142-
return Task.FromException<object>(ex);
143-
}
135+
BeforeExecutions += 1;
136+
return Task.CompletedTask;
144137
}
145138

146139
public Task ExecuteAfterTransactionCompletionAsync(bool success, CancellationToken cancellationToken)
147140
{
148-
try
149-
{
150-
AfterExecutions += 1;
151-
return Task.CompletedTask;
152-
}
153-
catch (Exception ex)
154-
{
155-
return Task.FromException<object>(ex);
156-
}
141+
AfterExecutions += 1;
142+
return Task.CompletedTask;
157143
}
158144
}
159145

0 commit comments

Comments
 (0)