@@ -83,17 +83,16 @@ public bool Put(
83
83
IList result ,
84
84
ISessionImplementor session )
85
85
{
86
- // 6.0 TODO: inline the call.
87
- #pragma warning disable 612
88
- var cached = Put ( key , returnTypes , result , queryParameters . NaturalKeyLookup , session ) ;
89
- #pragma warning restore 612
86
+ if ( queryParameters . NaturalKeyLookup && result . Count == 0 )
87
+ return false ;
90
88
91
- if ( cached && key . ResultTransformer ? . AutoDiscoverTypes == true && key . ResultTransformer . AutoDiscoveredAliases != null )
92
- {
93
- Cache . Put ( new QueryAliasesKey ( key ) , key . ResultTransformer . AutoDiscoveredAliases ) ;
94
- }
89
+ var ts = session . Factory . Settings . CacheProvider . NextTimestamp ( ) ;
95
90
96
- return cached ;
91
+ Log . Debug ( "caching query results in region: '{0}'; {1}" , _regionName , key ) ;
92
+
93
+ Cache . Put ( key , GetCacheableResult ( returnTypes , session , result , ts , GetAutoDiscoveredAliases ( key ) ) ) ;
94
+
95
+ return true ;
97
96
}
98
97
99
98
// Since 5.2
@@ -107,7 +106,7 @@ public bool Put(QueryKey key, ICacheAssembler[] returnTypes, IList result, bool
107
106
108
107
Log . Debug ( "caching query results in region: '{0}'; {1}" , _regionName , key ) ;
109
108
110
- Cache . Put ( key , GetCacheableResult ( returnTypes , session , result , ts ) ) ;
109
+ Cache . Put ( key , GetCacheableResult ( returnTypes , session , result , ts , null ) ) ;
111
110
112
111
return true ;
113
112
}
@@ -130,20 +129,32 @@ public IList Get(
130
129
131
130
try
132
131
{
133
- // 6.0 TODO: inline the call.
134
- #pragma warning disable 612
135
- var result = Get ( key , returnTypes , queryParameters . NaturalKeyLookup , spaces , session ) ;
136
- #pragma warning restore 612
132
+ if ( Log . IsDebugEnabled ( ) )
133
+ Log . Debug ( "checking cached query results in region: '{0}'; {1}" , _regionName , key ) ;
134
+
135
+ var cacheable = ( IList ) Cache . Get ( key ) ;
136
+ if ( cacheable == null )
137
+ {
138
+ Log . Debug ( "query results were not found in cache: {0}" , key ) ;
139
+ return null ;
140
+ }
141
+
142
+ var timestamp = ( long ) cacheable [ 0 ] ;
143
+
144
+ if ( Log . IsDebugEnabled ( ) )
145
+ Log . Debug ( "Checking query spaces for up-to-dateness [{0}]" , StringHelper . CollectionToString ( spaces ) ) ;
146
+
147
+ if ( ! queryParameters . NaturalKeyLookup && ! IsUpToDate ( spaces , timestamp ) )
148
+ {
149
+ Log . Debug ( "cached query results were not up to date for: {0}" , key ) ;
150
+ return null ;
151
+ }
152
+
153
+ var result = GetResultFromCacheable ( key , returnTypes , queryParameters . NaturalKeyLookup , session , cacheable ) ;
137
154
138
155
if ( result != null && key . ResultTransformer ? . AutoDiscoverTypes == true && result . Count > 0 )
139
156
{
140
- var aliasesKey = new QueryAliasesKey ( key ) ;
141
- if ( ! ( Cache . Get ( aliasesKey ) is string [ ] aliases ) )
142
- {
143
- // Cannot properly initialize the result transformer, treat it as a cache miss
144
- Log . Debug ( "query aliases were not found in cache: {0}" , aliasesKey ) ;
145
- return null ;
146
- }
157
+ var aliases = ( string [ ] ) cacheable [ 1 ] ;
147
158
key . ResultTransformer . SupplyAutoDiscoveredParameters ( queryParameters . ResultTransformer , aliases ) ;
148
159
}
149
160
@@ -207,20 +218,19 @@ public bool[] PutMany(
207
218
var key = keys [ i ] ;
208
219
cached [ i ] = true ;
209
220
cachedKeys . Add ( key ) ;
210
- cachedResults . Add ( GetCacheableResult ( returnTypes [ i ] , session , result , ts ) ) ;
211
-
212
- if ( key . ResultTransformer ? . AutoDiscoverTypes == true && key . ResultTransformer . AutoDiscoveredAliases != null )
213
- {
214
- cachedKeys . Add ( new QueryAliasesKey ( key ) ) ;
215
- cachedResults . Add ( key . ResultTransformer . AutoDiscoveredAliases ) ;
216
- }
221
+ cachedResults . Add ( GetCacheableResult ( returnTypes [ i ] , session , result , ts , GetAutoDiscoveredAliases ( key ) ) ) ;
217
222
}
218
223
219
224
_cache . PutMany ( cachedKeys . ToArray ( ) , cachedResults . ToArray ( ) ) ;
220
225
221
226
return cached ;
222
227
}
223
228
229
+ private static string [ ] GetAutoDiscoveredAliases ( QueryKey key )
230
+ {
231
+ return key . ResultTransformer ? . AutoDiscoverTypes == true ? key . ResultTransformer . AutoDiscoveredAliases : null ;
232
+ }
233
+
224
234
/// <inheritdoc />
225
235
public IList [ ] GetMany (
226
236
QueryKey [ ] keys ,
@@ -271,8 +281,6 @@ public IList[] GetMany(
271
281
{
272
282
session . PersistenceContext . BatchFetchQueue . InitializeQueryCacheQueue ( ) ;
273
283
274
- var queryAliasesKeys = new QueryAliasesKey [ keys . Length ] ;
275
- var hasAliasesToFetch = false ;
276
284
for ( var i = 0 ; i < keys . Length ; i ++ )
277
285
{
278
286
var cacheable = ( IList ) cacheables [ i ] ;
@@ -297,35 +305,10 @@ public IList[] GetMany(
297
305
finalReturnTypes [ i ] = GetReturnTypes ( key , returnTypes [ i ] , cacheable ) ;
298
306
PerformBeforeAssemble ( finalReturnTypes [ i ] , session , cacheable ) ;
299
307
300
- if ( key . ResultTransformer ? . AutoDiscoverTypes == true && cacheable . Count > 0 )
308
+ if ( key . ResultTransformer ? . AutoDiscoverTypes == true && cacheable . Count > 2 )
301
309
{
302
- queryAliasesKeys [ i ] = new QueryAliasesKey ( key ) ;
303
- hasAliasesToFetch = true ;
304
- }
305
- }
306
-
307
- if ( hasAliasesToFetch )
308
- {
309
- var allAliases = _cache . GetMany ( queryAliasesKeys . Where ( k => k != null ) . ToArray ( ) ) ;
310
-
311
- var aliasesIndex = 0 ;
312
- for ( var i = 0 ; i < keys . Length ; i ++ )
313
- {
314
- var queryAliasesKey = queryAliasesKeys [ i ] ;
315
- if ( queryAliasesKey == null )
316
- continue ;
317
-
318
- if ( allAliases [ aliasesIndex ] is string [ ] aliases )
319
- {
320
- keys [ i ] . ResultTransformer . SupplyAutoDiscoveredParameters ( queryParameters [ i ] . ResultTransformer , aliases ) ;
321
- }
322
- else
323
- {
324
- // Cannot properly initialize the result transformer, treat it as a cache miss
325
- Log . Debug ( "query aliases were not found in cache: {0}" , queryAliasesKey ) ;
326
- finalReturnTypes [ i ] = null ;
327
- }
328
- aliasesIndex ++ ;
310
+ var aliases = ( string [ ] ) cacheable [ 1 ] ;
311
+ key . ResultTransformer . SupplyAutoDiscoveredParameters ( queryParams . ResultTransformer , aliases ) ;
329
312
}
330
313
}
331
314
@@ -395,9 +378,9 @@ private static List<object> GetCacheableResult(
395
378
ICacheAssembler [ ] returnTypes ,
396
379
ISessionImplementor session ,
397
380
IList result ,
398
- long ts )
381
+ long ts , string [ ] aliases )
399
382
{
400
- var cacheable = new List < object > ( result . Count + 1 ) { ts } ;
383
+ var cacheable = new List < object > ( result . Count + 2 ) { ts , aliases } ;
401
384
foreach ( var row in result )
402
385
{
403
386
if ( returnTypes . Length == 1 )
@@ -413,12 +396,21 @@ private static List<object> GetCacheableResult(
413
396
return cacheable ;
414
397
}
415
398
399
+ private static IEnumerable < object > GetResultsEnumerable ( IList results )
400
+ {
401
+ // Skip first element, it is the timestamp, and the second, it is the aliases.
402
+ for ( var i = 2 ; i < results . Count ; i ++ )
403
+ {
404
+ yield return results [ i ] ;
405
+ }
406
+ }
407
+
416
408
private static ICacheAssembler [ ] GetReturnTypes (
417
409
QueryKey key ,
418
410
ICacheAssembler [ ] returnTypes ,
419
411
IList cacheable )
420
412
{
421
- if ( key . ResultTransformer ? . AutoDiscoverTypes == true && cacheable . Count > 0 )
413
+ if ( key . ResultTransformer ? . AutoDiscoverTypes == true && cacheable . Count > 2 )
422
414
{
423
415
returnTypes = GuessTypes ( cacheable ) ;
424
416
}
@@ -435,18 +427,16 @@ private static void PerformBeforeAssemble(
435
427
{
436
428
var returnType = returnTypes [ 0 ] ;
437
429
438
- // Skip first element, it is the timestamp
439
- for ( var i = 1 ; i < cacheable . Count ; i ++ )
430
+ foreach ( var cached in GetResultsEnumerable ( cacheable ) )
440
431
{
441
- returnType . BeforeAssemble ( cacheable [ i ] , session ) ;
432
+ returnType . BeforeAssemble ( cached , session ) ;
442
433
}
443
434
}
444
435
else
445
436
{
446
- // Skip first element, it is the timestamp
447
- for ( var i = 1 ; i < cacheable . Count ; i ++ )
437
+ foreach ( var cached in GetResultsEnumerable ( cacheable ) )
448
438
{
449
- TypeHelper . BeforeAssemble ( ( object [ ] ) cacheable [ i ] , returnTypes , session ) ;
439
+ TypeHelper . BeforeAssemble ( ( object [ ] ) cached , returnTypes , session ) ;
450
440
}
451
441
}
452
442
}
@@ -460,15 +450,14 @@ private IList PerformAssemble(
460
450
{
461
451
try
462
452
{
463
- var result = new List < object > ( cacheable . Count - 1 ) ;
453
+ var result = new List < object > ( cacheable . Count - 2 ) ;
464
454
if ( returnTypes . Length == 1 )
465
455
{
466
456
var returnType = returnTypes [ 0 ] ;
467
457
468
- // Skip first element, it is the timestamp
469
- for ( var i = 1 ; i < cacheable . Count ; i ++ )
458
+ foreach ( var cached in GetResultsEnumerable ( cacheable ) )
470
459
{
471
- result . Add ( returnType . Assemble ( cacheable [ i ] , session , null ) ) ;
460
+ result . Add ( returnType . Assemble ( cached , session , null ) ) ;
472
461
}
473
462
}
474
463
else
@@ -482,10 +471,9 @@ private IList PerformAssemble(
482
471
}
483
472
}
484
473
485
- // Skip first element, it is the timestamp
486
- for ( var i = 1 ; i < cacheable . Count ; i ++ )
474
+ foreach ( var cached in GetResultsEnumerable ( cacheable ) )
487
475
{
488
- result . Add ( TypeHelper . Assemble ( ( object [ ] ) cacheable [ i ] , returnTypes , nonCollectionTypeIndexes , session ) ) ;
476
+ result . Add ( TypeHelper . Assemble ( ( object [ ] ) cached , returnTypes , nonCollectionTypeIndexes , session ) ) ;
489
477
}
490
478
}
491
479
@@ -530,17 +518,18 @@ private static void InitializeCollections(
530
518
return ;
531
519
}
532
520
533
- // Skip first element, it is the timestamp
534
- for ( var i = 1 ; i < cacheResult . Count ; i ++ )
521
+ var j = 0 ;
522
+ foreach ( var cached in GetResultsEnumerable ( cacheResult ) )
535
523
{
536
524
// Initialization of the fetched collection must be done at the end in order to be able to batch fetch them
537
525
// from the cache or database. The collections were already created when their owners were assembled so we only
538
526
// have to initialize them.
539
527
TypeHelper . InitializeCollections (
540
- ( object [ ] ) cacheResult [ i ] ,
541
- ( object [ ] ) assembleResult [ i - 1 ] ,
528
+ ( object [ ] ) cached ,
529
+ ( object [ ] ) assembleResult [ j ] ,
542
530
collectionIndexes ,
543
531
session ) ;
532
+ j ++ ;
544
533
}
545
534
}
546
535
@@ -570,23 +559,24 @@ private IList GetResultFromCacheable(
570
559
571
560
private static ICacheAssembler [ ] GuessTypes ( IList cacheable )
572
561
{
573
- var colCount = ( cacheable [ 0 ] as object [ ] ) ? . Length ?? 1 ;
562
+ var colCount = ( cacheable [ 2 ] as object [ ] ) ? . Length ?? 1 ;
574
563
var returnTypes = new ICacheAssembler [ colCount ] ;
575
564
if ( colCount == 1 )
576
565
{
577
- foreach ( var obj in cacheable )
566
+ foreach ( var cached in GetResultsEnumerable ( cacheable ) )
578
567
{
579
- if ( obj == null )
568
+ if ( cached == null )
580
569
continue ;
581
- returnTypes [ 0 ] = NHibernateUtil . GuessType ( obj ) ;
570
+ returnTypes [ 0 ] = NHibernateUtil . GuessType ( cached ) ;
582
571
break ;
583
572
}
584
573
}
585
574
else
586
575
{
587
576
var foundTypes = 0 ;
588
- foreach ( object [ ] row in cacheable )
577
+ foreach ( var cached in GetResultsEnumerable ( cacheable ) )
589
578
{
579
+ var row = ( object [ ] ) cached ;
590
580
for ( var i = 0 ; i < colCount ; i ++ )
591
581
{
592
582
if ( row [ i ] != null && returnTypes [ i ] == null )
0 commit comments