Skip to content

Commit 5dc8bc2

Browse files
committed
Deprecate EnumerableImpl and code review changes
1 parent 7b55d5f commit 5dc8bc2

27 files changed

+418
-257
lines changed

src/NHibernate.Test/Async/ConnectionTest/AggressiveReleaseTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ public async Task SerializationFailsOnAfterStatementAggressiveReleaseWithOpenRes
9191
// both scroll() and iterate() cause the batcher to hold on
9292
// to resources, which should make aggresive-Release not Release
9393
// the connection (and thus cause serialization to fail)
94-
IEnumerable en = s.CreateQuery("from Silly").Enumerable();
94+
var en = s.CreateQuery("from Silly").Enumerable().GetEnumerator();
95+
en.MoveNext();
9596

9697
try
9798
{

src/NHibernate.Test/Async/Stats/StatsFixture.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ public async Task QueryStatGatheringAsync()
173173
Assert.AreEqual(maxTime, stats.QueryExecutionMaxTime);
174174
Assert.AreEqual( continents, stats.QueryExecutionMaxTimeQueryString );
175175

176-
IEnumerable itr = s.CreateQuery(continents).Enumerable();
176+
var itr = s.CreateQuery(continents).Enumerable().GetEnumerator();
177+
itr.MoveNext();
177178
// Enumerable() should increment the execution count
178179
Assert.AreEqual(2, continentStats.ExecutionCount, "unexpected execution count");
179180
// but should not effect the cumulative row count

src/NHibernate.Test/ConnectionTest/AggressiveReleaseTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public void SerializationFailsOnAfterStatementAggressiveReleaseWithOpenResources
7979
// both scroll() and iterate() cause the batcher to hold on
8080
// to resources, which should make aggresive-Release not Release
8181
// the connection (and thus cause serialization to fail)
82-
IEnumerable en = s.CreateQuery("from Silly").Enumerable();
82+
var en = s.CreateQuery("from Silly").Enumerable().GetEnumerator();
83+
en.MoveNext();
8384

8485
try
8586
{

src/NHibernate.Test/Linq/ByMethod/AsAsyncEnumerableTests.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Linq;
2+
using System.Threading.Tasks;
3+
using NHibernate.Linq;
24
using NUnit.Framework;
35

46
namespace NHibernate.Test.Linq.ByMethod
@@ -7,12 +9,12 @@ namespace NHibernate.Test.Linq.ByMethod
79
public class AsAsyncEnumerableTests : LinqTestCase
810
{
911
[Test]
10-
public void MultipleEnumerationTest()
12+
public async Task MultipleEnumerationTest()
1113
{
12-
var enumerable = db.Customers.Where(c => c.Address.City == "London").OrderBy(c => c.CustomerId).AsEnumerable();
14+
var asyncEnumerable = db.Customers.Where(c => c.Address.City == "London").OrderBy(c => c.CustomerId).AsAsyncEnumerable();
1315
for (var i = 0; i < 3; i++)
1416
{
15-
AssertByIds(enumerable, new[]
17+
await AssertByIds(asyncEnumerable, new[]
1618
{
1719
"AROUT",
1820
"BSBEV",

src/NHibernate.Test/Stats/StatsFixture.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ public void QueryStatGathering()
161161
Assert.AreEqual(maxTime, stats.QueryExecutionMaxTime);
162162
Assert.AreEqual( continents, stats.QueryExecutionMaxTimeQueryString );
163163

164-
IEnumerable itr = s.CreateQuery(continents).Enumerable();
164+
var itr = s.CreateQuery(continents).Enumerable().GetEnumerator();
165+
itr.MoveNext();
165166
// Enumerable() should increment the execution count
166167
Assert.AreEqual(2, continentStats.ExecutionCount, "unexpected execution count");
167168
// but should not effect the cumulative row count

src/NHibernate/Async/Engine/ISessionImplementor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
namespace NHibernate.Engine
3232
{
33-
internal static partial class SessionImplementorExtensions
33+
public static partial class SessionImplementorExtensions
3434
{
3535

3636
internal static async Task AutoFlushIfRequiredAsync(this ISessionImplementor implementor, ISet<string> querySpaces, CancellationToken cancellationToken)

src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,49 @@ public async Task PerformListAsync(QueryParameters queryParameters, ISessionImpl
9696
ArrayHelper.AddAll(combinedResults, tmp);
9797
}
9898
}
99+
// Since v5.3
100+
[Obsolete("This method has no more usages and will be removed in a future version")]
101+
public Task<IEnumerable> PerformIterateAsync(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken)
102+
{
103+
if (cancellationToken.IsCancellationRequested)
104+
{
105+
return Task.FromCanceled<IEnumerable>(cancellationToken);
106+
}
107+
try
108+
{
109+
if (Log.IsDebugEnabled())
110+
{
111+
Log.Debug("enumerable: {0}", _sourceQuery);
112+
queryParameters.LogParameters(session.Factory);
113+
}
114+
if (Translators.Length == 0)
115+
{
116+
return Task.FromResult<IEnumerable>(CollectionHelper.EmptyEnumerable);
117+
}
118+
if (Translators.Length == 1)
119+
{
120+
return Task.FromResult<IEnumerable>(Translators[0].GetEnumerable(queryParameters, session));
121+
}
122+
var results = new IEnumerable[Translators.Length];
123+
for (int i = 0; i < Translators.Length; i++)
124+
{
125+
var result = Translators[i].GetEnumerable(queryParameters, session);
126+
results[i] = result;
127+
}
128+
return Task.FromResult<IEnumerable>(new JoinedEnumerable(results));
129+
}
130+
catch (Exception ex)
131+
{
132+
return Task.FromException<IEnumerable>(ex);
133+
}
134+
}
135+
// Since v5.3
136+
[Obsolete("This method has no more usages and will be removed in a future version")]
137+
public async Task<IEnumerable<T>> PerformIterateAsync<T>(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken)
138+
{
139+
cancellationToken.ThrowIfCancellationRequested();
140+
return new SafetyEnumerable<T>(await (PerformIterateAsync(queryParameters, session, cancellationToken)).ConfigureAwait(false));
141+
}
99142

100143
public async Task<int> PerformExecuteUpdateAsync(QueryParameters queryParameters, ISessionImplementor session, CancellationToken cancellationToken)
101144
{

src/NHibernate/Async/Hql/Ast/ANTLR/QueryTranslatorImpl.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ public Task<IEnumerable> GetEnumerableAsync(QueryParameters queryParameters, IEv
115115
}
116116
try
117117
{
118-
ErrorIfDML();
119-
return _queryLoader.GetEnumerableAsync(queryParameters, session, cancellationToken);
118+
return Task.FromResult<IEnumerable>(GetEnumerable(queryParameters, session));
120119
}
121120
catch (Exception ex)
122121
{

src/NHibernate/Async/Hql/IQueryTranslator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using NHibernate.Event;
1919
using NHibernate.Hql.Ast.ANTLR;
2020
using NHibernate.Type;
21+
using NHibernate.Util;
2122

2223
namespace NHibernate.Hql
2324
{

src/NHibernate/Async/IQuery.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using NHibernate.Impl;
1717
using System.Threading.Tasks;
1818
using System.Threading;
19+
using NHibernate.Util;
1920

2021
namespace NHibernate
2122
{
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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;
12+
using System.Collections;
13+
using System.Collections.Generic;
14+
using System.Data.Common;
15+
using System.Threading;
16+
using System.Threading.Tasks;
17+
using NHibernate.Engine;
18+
using NHibernate.Event;
19+
using NHibernate.Exceptions;
20+
using NHibernate.SqlCommand;
21+
using NHibernate.Transform;
22+
using NHibernate.Type;
23+
24+
namespace NHibernate.Impl
25+
{
26+
27+
internal partial class AsyncEnumerableImpl<T> : IAsyncEnumerable<T>, IEnumerable<T>
28+
{
29+
30+
internal sealed partial class AsyncEnumeratorImpl : IAsyncEnumerator<T>, IEnumerator<T>
31+
{
32+
33+
private async Task ReadAsync(CancellationToken cancellationToken)
34+
{
35+
cancellationToken.ThrowIfCancellationRequested();
36+
try
37+
{
38+
_hasNext = await (_reader.ReadAsync(cancellationToken)).ConfigureAwait(false);
39+
_startedReading = true;
40+
_currentRow++;
41+
}
42+
catch (DbException e)
43+
{
44+
throw ADOExceptionHelper.Convert(_session.Factory.SQLExceptionConverter, e, "Error executing Enumerable() query",
45+
new SqlString(_command.CommandText));
46+
}
47+
48+
await (PostReadAsync(cancellationToken)).ConfigureAwait(false);
49+
}
50+
51+
private async Task PostReadAsync(CancellationToken cancellationToken)
52+
{
53+
cancellationToken.ThrowIfCancellationRequested();
54+
if (_selection != null && _selection.MaxRows != RowSelection.NoValue)
55+
{
56+
_hasNext = _hasNext && (_currentRow < _selection.MaxRows);
57+
}
58+
59+
bool sessionDefaultReadOnlyOrig = _session.DefaultReadOnly;
60+
_session.DefaultReadOnly = _readOnly;
61+
try
62+
{
63+
await (MaterializeAndSetCurrentAsync(cancellationToken)).ConfigureAwait(false);
64+
}
65+
finally
66+
{
67+
_session.DefaultReadOnly = sessionDefaultReadOnlyOrig;
68+
}
69+
}
70+
71+
private async Task MaterializeAndSetCurrentAsync(CancellationToken cancellationToken)
72+
{
73+
cancellationToken.ThrowIfCancellationRequested();
74+
if (!_hasNext)
75+
{
76+
// there are no more records in the DataReader so clean up
77+
Log.Debug("exhausted results");
78+
Current = default;
79+
_session.Batcher.CloseCommand(_command, _reader);
80+
return;
81+
}
82+
83+
Log.Debug("retrieving next results");
84+
if (_single && _resultTransformer == null)
85+
{
86+
SetCurrent(await (_types[0].NullSafeGetAsync(_reader, _columnNames[0], _session, null, cancellationToken)).ConfigureAwait(false));
87+
return;
88+
}
89+
90+
var currentResults = new object[_types.Length];
91+
// move through each of the ITypes contained in the DbDataReader and convert them
92+
// to their objects.
93+
for (int i = 0; i < _types.Length; i++)
94+
{
95+
// The IType knows how to extract its value out of the DbDataReader. If the IType
96+
// is a value type then the value will simply be pulled out of the DbDataReader. If
97+
// the IType is an Entity type then the IType will extract the id from the DbDataReader
98+
// and use the ISession to load an instance of the object.
99+
currentResults[i] = await (_types[i].NullSafeGetAsync(_reader, _columnNames[i], _session, null, cancellationToken)).ConfigureAwait(false);
100+
}
101+
102+
SetCurrent(_resultTransformer != null
103+
? _resultTransformer.TransformTuple(currentResults, _returnAliases)
104+
: currentResults);
105+
}
106+
}
107+
}
108+
}

src/NHibernate/Async/Impl/CollectionFilterImpl.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public partial class CollectionFilterImpl : QueryImpl
4040
/// </p>
4141
/// </remarks>
4242
// Since v5.3
43-
[Obsolete("This method has no more usages and will be removed in a future version")]
43+
[Obsolete("Use AsyncEnumerable extension method instead.")]
4444
public override Task<IEnumerable> EnumerableAsync(CancellationToken cancellationToken = default(CancellationToken))
4545
{
4646
if (cancellationToken.IsCancellationRequested)
@@ -66,7 +66,7 @@ public partial class CollectionFilterImpl : QueryImpl
6666
/// <typeparam name="T"></typeparam>
6767
/// <returns></returns>
6868
// Since v5.3
69-
[Obsolete("This method has no more usages and will be removed in a future version")]
69+
[Obsolete("Use AsyncEnumerable extension method instead.")]
7070
public override Task<IEnumerable<T>> EnumerableAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
7171
{
7272
if (cancellationToken.IsCancellationRequested)

src/NHibernate/Async/Impl/ExpressionQueryImpl.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ internal partial class ExpressionFilterImpl : ExpressionQueryImpl
8686
/// </p>
8787
/// </remarks>
8888
// Since v5.3
89-
[Obsolete("This method has no more usages and will be removed in a future version")]
89+
[Obsolete("Use AsyncEnumerable extension method instead.")]
9090
public override Task<IEnumerable> EnumerableAsync(CancellationToken cancellationToken = default(CancellationToken))
9191
{
9292
throw new NotImplementedException();
@@ -99,7 +99,7 @@ internal partial class ExpressionFilterImpl : ExpressionQueryImpl
9999
/// <typeparam name="T"></typeparam>
100100
/// <returns></returns>
101101
// Since v5.3
102-
[Obsolete("This method has no more usages and will be removed in a future version")]
102+
[Obsolete("Use AsyncEnumerable extension method instead.")]
103103
public override Task<IEnumerable<T>> EnumerableAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
104104
{
105105
throw new NotImplementedException();

src/NHibernate/Async/Impl/SessionImpl.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ public override async Task<IQueryTranslator[]> GetQueriesAsync(IQueryExpression
303303
/// Strongly-typed version of <see cref="Enumerable(IQueryExpression, QueryParameters)" />
304304
/// </summary>
305305
// Since v5.3
306-
[Obsolete("This method has no more usages and will be removed in a future version")]
306+
[Obsolete("Use AsyncEnumerable extension method instead.")]
307307
public override async Task<IEnumerable<T>> EnumerableAsync<T>(IQueryExpression queryExpression, QueryParameters queryParameters, CancellationToken cancellationToken)
308308
{
309309
cancellationToken.ThrowIfCancellationRequested();
@@ -321,7 +321,7 @@ public override async Task<IEnumerable<T>> EnumerableAsync<T>(IQueryExpression q
321321
}
322322

323323
// Since v5.3
324-
[Obsolete("This method has no more usages and will be removed in a future version")]
324+
[Obsolete("Use AsyncEnumerable extension method instead.")]
325325
public override async Task<IEnumerable> EnumerableAsync(IQueryExpression queryExpression, QueryParameters queryParameters, CancellationToken cancellationToken)
326326
{
327327
cancellationToken.ThrowIfCancellationRequested();
@@ -1112,7 +1112,7 @@ public override async Task<IList<T>> ListFilterAsync<T>(object collection, strin
11121112
/// Collection from a filter
11131113
/// </summary>
11141114
// Since v5.3
1115-
[Obsolete("Use AsyncEnumerableFilter method instead.")]
1115+
[Obsolete("Use AsyncEnumerableFilter extension method instead.")]
11161116
public override async Task<IEnumerable> EnumerableFilterAsync(object collection, string filter, QueryParameters queryParameters, CancellationToken cancellationToken)
11171117
{
11181118
cancellationToken.ThrowIfCancellationRequested();
@@ -1127,7 +1127,7 @@ public override async Task<IEnumerable> EnumerableFilterAsync(object collection,
11271127
/// Strongly-typed version of <see cref="EnumerableFilter(object, string, QueryParameters)" />
11281128
/// </summary>
11291129
// Since v5.3
1130-
[Obsolete("Use AsyncEnumerableFilter method instead.")]
1130+
[Obsolete("Use AsyncEnumerableFilter extension method instead.")]
11311131
public override async Task<IEnumerable<T>> EnumerableFilterAsync<T>(object collection, string filter, QueryParameters queryParameters, CancellationToken cancellationToken)
11321132
{
11331133
cancellationToken.ThrowIfCancellationRequested();

src/NHibernate/Async/Impl/SqlQueryImpl.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public partial class SqlQueryImpl : AbstractQueryImpl, ISQLQuery, ISynchronizabl
9797
/// </p>
9898
/// </remarks>
9999
// Since v5.3
100-
[Obsolete("This method has no more usages and will be removed in a future version")]
100+
[Obsolete("Use AsyncEnumerable extension method instead.")]
101101
public override Task<IEnumerable> EnumerableAsync(CancellationToken cancellationToken = default(CancellationToken))
102102
{
103103
throw new NotSupportedException("SQL queries do not currently support enumeration");
@@ -110,7 +110,7 @@ public partial class SqlQueryImpl : AbstractQueryImpl, ISQLQuery, ISynchronizabl
110110
/// <typeparam name="T"></typeparam>
111111
/// <returns></returns>
112112
// Since v5.3
113-
[Obsolete("This method has no more usages and will be removed in a future version")]
113+
[Obsolete("Use AsyncEnumerable extension method instead.")]
114114
public override Task<IEnumerable<T>> EnumerableAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
115115
{
116116
throw new NotSupportedException("SQL queries do not currently support enumeration");

src/NHibernate/Async/Impl/StatelessSessionImpl.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public override async Task ListAsync(CriteriaImpl criteria, IList results, Cance
165165
}
166166

167167
// Since v5.3
168-
[Obsolete("This method has no more usages and will be removed in a future version")]
168+
[Obsolete("Use AsyncEnumerable extension method instead.")]
169169
public override Task<IEnumerable> EnumerableAsync(IQueryExpression queryExpression, QueryParameters queryParameters, CancellationToken cancellationToken)
170170
{
171171
throw new NotImplementedException();
@@ -175,7 +175,7 @@ public override Task<IEnumerable> EnumerableAsync(IQueryExpression queryExpressi
175175
/// Strongly-typed version of <see cref="Enumerable(IQueryExpression, QueryParameters)" />
176176
/// </summary>
177177
// Since v5.3
178-
[Obsolete("This method has no more usages and will be removed in a future version")]
178+
[Obsolete("Use AsyncEnumerable extension method instead.")]
179179
public override Task<IEnumerable<T>> EnumerableAsync<T>(IQueryExpression queryExpression, QueryParameters queryParameters, CancellationToken cancellationToken)
180180
{
181181
throw new NotImplementedException();
@@ -200,7 +200,7 @@ public override Task<IList<T>> ListFilterAsync<T>(object collection, string filt
200200
/// Collection from a filter
201201
/// </summary>
202202
// Since v5.3
203-
[Obsolete("Use AsyncEnumerableFilter method instead.")]
203+
[Obsolete("Use AsyncEnumerableFilter extension method instead.")]
204204
public override Task<IEnumerable> EnumerableFilterAsync(object collection, string filter, QueryParameters parameters, CancellationToken cancellationToken)
205205
{
206206
throw new NotSupportedException();
@@ -210,7 +210,7 @@ public override Task<IEnumerable> EnumerableFilterAsync(object collection, strin
210210
/// Strongly-typed version of <see cref="EnumerableFilter(object, string, QueryParameters)" />
211211
/// </summary>
212212
// Since v5.3
213-
[Obsolete("Use AsyncEnumerableFilter method instead.")]
213+
[Obsolete("Use AsyncEnumerableFilter extension method instead.")]
214214
public override Task<IEnumerable<T>> EnumerableFilterAsync<T>(object collection, string filter, QueryParameters parameters, CancellationToken cancellationToken)
215215
{
216216
throw new NotSupportedException();

0 commit comments

Comments
 (0)