Skip to content

Commit dc965b6

Browse files
committed
Another attempt to better iterate
1 parent baf46ed commit dc965b6

File tree

4 files changed

+57
-10
lines changed

4 files changed

+57
-10
lines changed

src/AsyncGenerator.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
- conversion: Ignore
1212
name: ProcessResults
1313
containingTypeName: IQueryBatchItem
14+
- conversion: Ignore
15+
name: GetEnumerable
16+
containingTypeName: HQLQueryPlan
1417
- conversion: Ignore
1518
name: PostProcessInsert
1619
containingTypeName: HqlSqlWalker

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

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
using System.Collections;
1313
using System.Collections.Generic;
1414
using System.Linq;
15+
using System.Threading;
16+
using System.Threading.Tasks;
1517
using NHibernate.Event;
1618
using NHibernate.Hql;
1719
using NHibernate.Linq;
@@ -20,12 +22,12 @@
2022

2123
namespace NHibernate.Engine.Query
2224
{
23-
using System.Threading.Tasks;
24-
using System.Threading;
2525
public partial interface IQueryPlan
2626
{
2727
Task PerformListAsync(QueryParameters queryParameters, ISessionImplementor statelessSessionImpl, IList results, CancellationToken cancellationToken);
2828
Task<int> PerformExecuteUpdateAsync(QueryParameters queryParameters, ISessionImplementor statelessSessionImpl, CancellationToken cancellationToken);
29+
Task<IEnumerable<T>> PerformIterateAsync<T>(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken);
30+
Task<IEnumerable> PerformIterateAsync(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken);
2931
}
3032
public partial class HQLQueryPlan : IQueryPlan
3133
{
@@ -98,6 +100,37 @@ public async Task PerformListAsync(QueryParameters queryParameters, ISessionImpl
98100
}
99101
}
100102

103+
public Task<IEnumerable> PerformIterateAsync(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken)
104+
{
105+
if (cancellationToken.IsCancellationRequested)
106+
{
107+
return Task.FromCanceled<IEnumerable>(cancellationToken);
108+
}
109+
try
110+
{
111+
if (Log.IsDebugEnabled())
112+
{
113+
Log.Debug("enumerable: {0}", _sourceQuery);
114+
queryParameters.LogParameters(session.Factory);
115+
}
116+
117+
if (Translators.Length == 1)
118+
return Translators[0].GetEnumerableAsync(queryParameters, session, cancellationToken);
119+
120+
return Task.FromResult<IEnumerable>(GetEnumerable(queryParameters, session));
121+
}
122+
catch (Exception ex)
123+
{
124+
return Task.FromException<IEnumerable>(ex);
125+
}
126+
}
127+
128+
public async Task<IEnumerable<T>> PerformIterateAsync<T>(QueryParameters queryParameters, IEventSource session, CancellationToken cancellationToken)
129+
{
130+
cancellationToken.ThrowIfCancellationRequested();
131+
return new SafetyEnumerable<T>(await (PerformIterateAsync(queryParameters, session, cancellationToken)).ConfigureAwait(false));
132+
}
133+
101134
public async Task<int> PerformExecuteUpdateAsync(QueryParameters queryParameters, ISessionImplementor session, CancellationToken cancellationToken)
102135
{
103136
cancellationToken.ThrowIfCancellationRequested();

src/NHibernate/Async/Impl/SessionImpl.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ public override async Task<IEnumerable<T>> EnumerableAsync<T>(IQueryExpression q
310310

311311
using (SuspendAutoFlush()) //stops flush being called multiple times if this method is recursively called
312312
{
313-
return plan.PerformIterate<T>(queryParameters, this);
313+
return await (plan.PerformIterateAsync<T>(queryParameters, this, cancellationToken)).ConfigureAwait(false);
314314
}
315315
}
316316
}
@@ -326,7 +326,7 @@ public override async Task<IEnumerable> EnumerableAsync(IQueryExpression queryEx
326326

327327
using (SuspendAutoFlush()) //stops flush being called multiple times if this method is recursively called
328328
{
329-
return plan.PerformIterate(queryParameters, this);
329+
return await (plan.PerformIterateAsync(queryParameters, this, cancellationToken)).ConfigureAwait(false);
330330
}
331331
}
332332
}
@@ -1107,7 +1107,7 @@ public override async Task<IEnumerable> EnumerableFilterAsync(object collection,
11071107
using (BeginProcess())
11081108
{
11091109
var plan = await (GetFilterQueryPlanAsync(collection, filter, queryParameters, true, cancellationToken)).ConfigureAwait(false);
1110-
return plan.PerformIterate(queryParameters, this);
1110+
return await (plan.PerformIterateAsync(queryParameters, this, cancellationToken)).ConfigureAwait(false);
11111111
}
11121112
}
11131113

@@ -1117,7 +1117,7 @@ public override async Task<IEnumerable<T>> EnumerableFilterAsync<T>(object colle
11171117
using (BeginProcess())
11181118
{
11191119
var plan = await (GetFilterQueryPlanAsync(collection, filter, queryParameters, true, cancellationToken)).ConfigureAwait(false);
1120-
return plan.PerformIterate<T>(queryParameters, this);
1120+
return await (plan.PerformIterateAsync<T>(queryParameters, this, cancellationToken)).ConfigureAwait(false);
11211121
}
11221122
}
11231123

src/NHibernate/Engine/Query/HQLQueryPlan.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Linq;
5+
using System.Threading;
6+
using System.Threading.Tasks;
57
using NHibernate.Event;
68
using NHibernate.Hql;
79
using NHibernate.Linq;
@@ -158,11 +160,20 @@ public IEnumerable PerformIterate(QueryParameters queryParameters, IEventSource
158160
queryParameters.LogParameters(session.Factory);
159161
}
160162

161-
//TODO: FIXME AsyncGenerator throws for this code..
162-
foreach (var translator in Translators)
163-
foreach (object obj in translator.GetEnumerable(queryParameters, session))
163+
if (Translators.Length == 1)
164+
return Translators[0].GetEnumerable(queryParameters, session);
165+
166+
return GetEnumerable(queryParameters, session);
167+
}
168+
169+
private IEnumerable<object> GetEnumerable(QueryParameters queryParameters, IEventSource session)
170+
{
171+
foreach (var t in Translators)
164172
{
165-
yield return obj;
173+
foreach (object obj in t.GetEnumerable(queryParameters, session))
174+
{
175+
yield return obj;
176+
}
166177
}
167178
}
168179

0 commit comments

Comments
 (0)