@@ -176,6 +176,36 @@ public async Task CanUseFutureQueryAsync()
176
176
}
177
177
}
178
178
179
+ [ Test ]
180
+ public async Task CanUseFutureQueryAndQueryOverForSatelessSessionAsync ( )
181
+ {
182
+ IgnoreThisTestIfMultipleQueriesArentSupportedByDriver ( ) ;
183
+
184
+ using ( var s = Sfi . OpenStatelessSession ( ) )
185
+ {
186
+ var persons10 = s . Query < Person > ( )
187
+ . Take ( 10 )
188
+ . ToFuture ( ) ;
189
+ var persons5 = s . QueryOver < Person > ( )
190
+ . Take ( 5 )
191
+ . Future ( ) ;
192
+
193
+ using ( var logSpy = new SqlLogSpy ( ) )
194
+ {
195
+ foreach ( var person in await ( persons5 . GetEnumerableAsync ( ) ) )
196
+ {
197
+ }
198
+
199
+ foreach ( var person in await ( persons10 . GetEnumerableAsync ( ) ) )
200
+ {
201
+ }
202
+
203
+ var events = logSpy . Appender . GetEvents ( ) ;
204
+ Assert . AreEqual ( 1 , events . Length ) ;
205
+ }
206
+ }
207
+ }
208
+
179
209
[ Test ]
180
210
public async Task CanUseFutureQueryWithAnonymousTypeAsync ( )
181
211
{
@@ -412,5 +442,120 @@ public async Task UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisi
412
442
await ( tx . CommitAsync ( ) ) ;
413
443
}
414
444
}
445
+
446
+ [ Test ]
447
+ public async Task FutureCombineCachedAndNonCachedQueriesAsync ( )
448
+ {
449
+ using ( var s = OpenSession ( ) )
450
+ using ( var tx = s . BeginTransaction ( ) )
451
+ {
452
+ var p1 = new Person
453
+ {
454
+ Name = "Person name" ,
455
+ Age = 15
456
+ } ;
457
+ var p2 = new Person
458
+ {
459
+ Name = "Person name" ,
460
+ Age = 20
461
+ } ;
462
+
463
+ await ( s . SaveAsync ( p1 ) ) ;
464
+ await ( s . SaveAsync ( p2 ) ) ;
465
+ await ( tx . CommitAsync ( ) ) ;
466
+ }
467
+
468
+ using ( var s = Sfi . OpenSession ( ) )
469
+ {
470
+ var list = new List < IFutureEnumerable < Person > > ( ) ;
471
+ for ( var i = 0 ; i < 5 ; i ++ )
472
+ {
473
+ var i1 = i ;
474
+ var query = s . Query < Person > ( ) . Where ( x => x . Age > i1 ) ;
475
+ list . Add ( query . WithOptions ( x => x . SetCacheable ( true ) ) . ToFuture ( ) ) ;
476
+ }
477
+
478
+ foreach ( var query in list )
479
+ {
480
+ var result = ( await ( query . GetEnumerableAsync ( ) ) ) . ToList ( ) ;
481
+ Assert . That ( result . Count , Is . EqualTo ( 2 ) ) ;
482
+ }
483
+ }
484
+
485
+ //Check query.List returns data from cache
486
+ Sfi . Statistics . IsStatisticsEnabled = true ;
487
+ using ( var s = Sfi . OpenSession ( ) )
488
+ {
489
+ var list = new List < IEnumerable < Person > > ( ) ;
490
+ for ( var i = 0 ; i < 5 ; i ++ )
491
+ {
492
+ var i1 = i ;
493
+ var query = s . Query < Person > ( ) . Where ( x => x . Age > i1 ) ;
494
+
495
+ list . Add ( await ( query . WithOptions ( x => x . SetCacheable ( true ) ) . ToListAsync ( ) ) ) ;
496
+ }
497
+
498
+ foreach ( var query in list )
499
+ {
500
+ var result = query . ToList ( ) ;
501
+ Assert . That ( result . Count , Is . EqualTo ( 2 ) ) ;
502
+ }
503
+
504
+ Assert . That ( Sfi . Statistics . PrepareStatementCount , Is . EqualTo ( 0 ) , "Queries must be retrieved from cache" ) ;
505
+ }
506
+
507
+ //Check another Future returns data from cache
508
+ Sfi . Statistics . Clear ( ) ;
509
+ using ( var s = Sfi . OpenSession ( ) )
510
+ {
511
+ var list = new List < IFutureEnumerable < Person > > ( ) ;
512
+ //Reverse order of queries added to cache
513
+ for ( var i = 5 - 1 ; i >= 0 ; i -- )
514
+ {
515
+ var i1 = i ;
516
+ var query = s . Query < Person > ( ) . Where ( x => x . Age > i1 ) ;
517
+
518
+ list . Add ( query . WithOptions ( x => x . SetCacheable ( true ) ) . ToFuture ( ) ) ;
519
+ }
520
+
521
+ foreach ( var query in list )
522
+ {
523
+ var result = ( await ( query . GetEnumerableAsync ( ) ) ) . ToList ( ) ;
524
+ Assert . That ( result . Count , Is . EqualTo ( 2 ) ) ;
525
+ }
526
+
527
+ Assert . That ( Sfi . Statistics . PrepareStatementCount , Is . EqualTo ( 0 ) , "Future queries must be retrieved from cache" ) ;
528
+ }
529
+
530
+ using ( var s = OpenSession ( ) )
531
+ using ( var tx = s . BeginTransaction ( ) )
532
+ {
533
+ await ( s . DeleteAsync ( "from Person" ) ) ;
534
+ await ( tx . CommitAsync ( ) ) ;
535
+ }
536
+ }
537
+
538
+ [ Test ]
539
+ public async Task FutureAutoFlushAsync ( )
540
+ {
541
+ using ( var s = OpenSession ( ) )
542
+ using ( var tx = s . BeginTransaction ( ) )
543
+ {
544
+ s . FlushMode = FlushMode . Auto ;
545
+ var p1 = new Person
546
+ {
547
+ Name = "Person name" ,
548
+ Age = 15
549
+ } ;
550
+ await ( s . SaveAsync ( p1 ) ) ;
551
+ await ( s . FlushAsync ( ) ) ;
552
+
553
+ await ( s . DeleteAsync ( p1 ) ) ;
554
+ var count = await ( s . QueryOver < Person > ( ) . ToRowCountQuery ( ) . FutureValue < int > ( ) . GetValueAsync ( ) ) ;
555
+ await ( tx . CommitAsync ( ) ) ;
556
+
557
+ Assert . That ( count , Is . EqualTo ( 0 ) , "Session wasn't auto flushed." ) ;
558
+ }
559
+ }
415
560
}
416
561
}
0 commit comments