17
17
using System ;
18
18
using System . Collections . Generic ;
19
19
using System . Linq ;
20
+ using System . Threading ;
20
21
using System . Threading . Tasks ;
21
22
22
23
using Cassandra . Mapping . Statements ;
@@ -71,11 +72,11 @@ internal Mapper(ISession session, MapperFactory mapperFactory, StatementFactory
71
72
/// <summary>
72
73
/// Executes asynchronously and uses the delegate to adapt the RowSet into the return value.
73
74
/// </summary>
74
- private async Task < TResult > ExecuteAsyncAndAdapt < TResult > ( Cql cql , Func < Statement , RowSet , TResult > adaptation )
75
+ private async Task < TResult > ExecuteAsyncAndAdapt < TResult > ( Cql cql , Func < Statement , RowSet , Task < TResult > > adaptation )
75
76
{
76
77
var stmt = await _statementFactory . GetStatementAsync ( _session , cql ) . ConfigureAwait ( false ) ;
77
78
var rs = await ExecuteStatementAsync ( stmt , cql . ExecutionProfile ) . ConfigureAwait ( false ) ;
78
- return adaptation ( stmt , rs ) ;
79
+ return await adaptation ( stmt , rs ) ;
79
80
}
80
81
81
82
/// <inheritdoc />
@@ -98,9 +99,37 @@ public Task<IEnumerable<T>> FetchAsync<T>(Cql cql)
98
99
return ExecuteAsyncAndAdapt ( cql , ( s , rs ) =>
99
100
{
100
101
var mapper = _mapperFactory . GetMapper < T > ( cql . Statement , rs ) ;
101
- return rs . Select ( mapper ) ;
102
+ return Task . FromResult ( Enumerable . Select ( rs , mapper ) ) ;
102
103
} ) ;
103
104
}
105
+ #if NET8_0_OR_GREATER
106
+
107
+ /// <inheritdoc />
108
+ public IAsyncEnumerable < T > FetchAsAsyncEnumerable < T > ( CqlQueryOptions options = null )
109
+ {
110
+ return FetchAsAsyncEnumerable < T > ( Cql . New ( string . Empty , [ ] , options ?? CqlQueryOptions . None ) ) ;
111
+ }
112
+
113
+ /// <inheritdoc />
114
+ public IAsyncEnumerable < T > FetchAsAsyncEnumerable < T > ( string cql , params object [ ] args )
115
+ {
116
+ return FetchAsAsyncEnumerable < T > ( Cql . New ( cql , args , CqlQueryOptions . None ) ) ;
117
+ }
118
+
119
+ /// <inheritdoc />
120
+ public async IAsyncEnumerable < T > FetchAsAsyncEnumerable < T > ( Cql cql )
121
+ {
122
+ //Use ExecuteAsyncAndAdapt with a delegate to handle the adaptation from RowSet to IEnumerable<T>
123
+ _cqlGenerator . AddSelect < T > ( cql ) ;
124
+ var stmt = await _statementFactory . GetStatementAsync ( _session , cql ) . ConfigureAwait ( false ) ;
125
+ var rs = await ExecuteStatementAsync ( stmt , cql . ExecutionProfile ) . ConfigureAwait ( false ) ;
126
+ var mapper = _mapperFactory . GetMapper < T > ( cql . Statement , rs ) ;
127
+ await foreach ( var row in rs )
128
+ {
129
+ yield return mapper ( row ) ;
130
+ }
131
+ }
132
+ #endif
104
133
105
134
/// <inheritdoc />
106
135
public Task < IPage < T > > FetchPageAsync < T > ( Cql cql )
@@ -111,10 +140,14 @@ public Task<IPage<T>> FetchPageAsync<T>(Cql cql)
111
140
}
112
141
cql . AutoPage = false ;
113
142
_cqlGenerator . AddSelect < T > ( cql ) ;
114
- return ExecuteAsyncAndAdapt < IPage < T > > ( cql , ( stmt , rs ) =>
143
+ return ExecuteAsyncAndAdapt < IPage < T > > ( cql , async ( stmt , rs ) =>
115
144
{
116
145
var mapper = _mapperFactory . GetMapper < T > ( cql . Statement , rs ) ;
117
- return new Page < T > ( rs . Select ( mapper ) , stmt . PagingState , rs . PagingState ) ;
146
+ #if NET8_0_OR_GREATER
147
+ return new Page < T > ( await AsyncEnumerable . Select ( rs , mapper ) . ToListAsync ( ) , stmt . PagingState , rs . PagingState ) ;
148
+ #else
149
+ return new Page < T > ( Enumerable . Select ( rs , mapper ) . ToList ( ) , stmt . PagingState , rs . PagingState ) ;
150
+ #endif
118
151
} ) ;
119
152
}
120
153
@@ -140,10 +173,15 @@ public Task<T> SingleAsync<T>(string cql, params object[] args)
140
173
public Task < T > SingleAsync < T > ( Cql cql )
141
174
{
142
175
_cqlGenerator . AddSelect < T > ( cql ) ;
143
- return ExecuteAsyncAndAdapt ( cql , ( s , rs ) =>
176
+ return ExecuteAsyncAndAdapt ( cql , async ( s , rs ) =>
144
177
{
178
+ #if NET8_0_OR_GREATER
179
+ var row = await rs . SingleAsync ( ) ;
180
+ #else
181
+ var row = rs . Single ( ) ;
182
+ #endif
145
183
var mapper = _mapperFactory . GetMapper < T > ( cql . Statement , rs ) ;
146
- return mapper ( rs . Single ( ) ) ;
184
+ return mapper ( row ) ;
147
185
} ) ;
148
186
}
149
187
@@ -157,9 +195,13 @@ public Task<T> SingleOrDefaultAsync<T>(string cql, params object[] args)
157
195
public Task < T > SingleOrDefaultAsync < T > ( Cql cql )
158
196
{
159
197
_cqlGenerator . AddSelect < T > ( cql ) ;
160
- return ExecuteAsyncAndAdapt ( cql , ( s , rs ) =>
198
+ return ExecuteAsyncAndAdapt ( cql , async ( s , rs ) =>
161
199
{
200
+ #if NET8_0_OR_GREATER
201
+ var row = await rs . SingleOrDefaultAsync ( ) ;
202
+ #else
162
203
var row = rs . SingleOrDefault ( ) ;
204
+ #endif
163
205
// Map to return type
164
206
if ( row == null )
165
207
{
@@ -180,9 +222,13 @@ public Task<T> FirstAsync<T>(string cql, params object[] args)
180
222
public Task < T > FirstAsync < T > ( Cql cql )
181
223
{
182
224
_cqlGenerator . AddSelect < T > ( cql ) ;
183
- return ExecuteAsyncAndAdapt ( cql , ( s , rs ) =>
225
+ return ExecuteAsyncAndAdapt ( cql , async ( s , rs ) =>
184
226
{
227
+ #if NET8_0_OR_GREATER
228
+ var row = await rs . FirstAsync ( ) ;
229
+ #else
185
230
var row = rs . First ( ) ;
231
+ #endif
186
232
// Map to return type
187
233
var mapper = _mapperFactory . GetMapper < T > ( cql . Statement , rs ) ;
188
234
return mapper ( row ) ;
@@ -199,9 +245,13 @@ public Task<T> FirstOrDefaultAsync<T>(string cql, params object[] args)
199
245
public Task < T > FirstOrDefaultAsync < T > ( Cql cql )
200
246
{
201
247
_cqlGenerator . AddSelect < T > ( cql ) ;
202
- return ExecuteAsyncAndAdapt ( cql , ( s , rs ) =>
248
+ return ExecuteAsyncAndAdapt ( cql , async ( s , rs ) =>
203
249
{
250
+ #if NET8_0_OR_GREATER
251
+ var row = await rs . FirstOrDefaultAsync ( ) ;
252
+ #else
204
253
var row = rs . FirstOrDefault ( ) ;
254
+ #endif
205
255
// Map to return type
206
256
if ( row == null )
207
257
{
@@ -311,7 +361,7 @@ public Task<AppliedInfo<T>> InsertIfNotExistsAsync<T>(T poco, string executionPr
311
361
312
362
return ExecuteAsyncAndAdapt (
313
363
cqlInstance ,
314
- ( stmt , rs ) => AppliedInfo < T > . FromRowSet ( _mapperFactory , cql , rs ) ) ;
364
+ ( stmt , rs ) => AppliedInfo < T > . FromRowSetAsync ( _mapperFactory , cql , rs ) ) ;
315
365
}
316
366
317
367
/// <inheritdoc />
@@ -360,7 +410,7 @@ public Task<AppliedInfo<T>> UpdateIfAsync<T>(string cql, params object[] args)
360
410
public Task < AppliedInfo < T > > UpdateIfAsync < T > ( Cql cql )
361
411
{
362
412
_cqlGenerator . PrependUpdate < T > ( cql ) ;
363
- return ExecuteAsyncAndAdapt ( cql , ( stmt , rs ) => AppliedInfo < T > . FromRowSet ( _mapperFactory , cql . Statement , rs ) ) ;
413
+ return ExecuteAsyncAndAdapt ( cql , ( stmt , rs ) => AppliedInfo < T > . FromRowSetAsync ( _mapperFactory , cql . Statement , rs ) ) ;
364
414
}
365
415
366
416
/// <inheritdoc />
@@ -492,7 +542,7 @@ public Task<AppliedInfo<T>> DeleteIfAsync<T>(string cql, params object[] args)
492
542
public Task < AppliedInfo < T > > DeleteIfAsync < T > ( Cql cql )
493
543
{
494
544
_cqlGenerator . PrependDelete < T > ( cql ) ;
495
- return ExecuteAsyncAndAdapt ( cql , ( stmt , rs ) => AppliedInfo < T > . FromRowSet ( _mapperFactory , cql . Statement , rs ) ) ;
545
+ return ExecuteAsyncAndAdapt ( cql , ( stmt , rs ) => AppliedInfo < T > . FromRowSetAsync ( _mapperFactory , cql . Statement , rs ) ) ;
496
546
}
497
547
498
548
/// <inheritdoc />
@@ -788,7 +838,7 @@ public async Task<AppliedInfo<T>> ExecuteConditionalAsync<T>(ICqlBatch batch, st
788
838
//Use the concatenation of cql strings as hash for the mapper
789
839
var cqlString = string . Join ( ";" , batch . Statements . Select ( s => s . Statement ) ) ;
790
840
var rs = await ExecuteStatementAsync ( batchStatement , executionProfile ) . ConfigureAwait ( false ) ;
791
- return AppliedInfo < T > . FromRowSet ( _mapperFactory , cqlString , rs ) ;
841
+ return await AppliedInfo < T > . FromRowSetAsync ( _mapperFactory , cqlString , rs ) ;
792
842
}
793
843
794
844
/// <inheritdoc />
0 commit comments