Skip to content

Commit ce60683

Browse files
committed
Centralize creation of EntityKey and CacheKey into AbstractSessionImpl. This is in preparation for multi tenancy (NH-3087). Based on work by Paul White in pull request #91.
1 parent 8ed010d commit ce60683

39 files changed

+109
-79
lines changed

src/NHibernate.DomainModel/CustomPersister.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ public object Load(object id, object optionalObject, LockMode lockMode, ISession
317317
if (obj != null)
318318
{
319319
clone = (Custom)obj.Clone();
320-
TwoPhaseLoad.AddUninitializedEntity(new EntityKey(id, this, session.EntityMode), clone, this, LockMode.None, false,
320+
TwoPhaseLoad.AddUninitializedEntity(session.GenerateEntityKey(id, this), clone, this, LockMode.None, false,
321321
session);
322322
TwoPhaseLoad.PostHydrate(this, id, new String[] {obj.Name}, null, clone, LockMode.None, false, session);
323323
TwoPhaseLoad.InitializeEntity(clone, false, session, new PreLoadEvent((IEventSource) session),

src/NHibernate/Action/CollectionAction.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public virtual void BeforeExecutions()
9696
// second-level cache invalidation only)
9797
if (persister.HasCache)
9898
{
99-
CacheKey ck = new CacheKey(key, persister.KeyType, persister.Role, session.EntityMode, session.Factory);
99+
CacheKey ck = session.GenerateCacheKey(key, persister.KeyType, persister.Role);
100100
softLock = persister.Cache.Lock(ck, null);
101101
}
102102
}
@@ -120,7 +120,7 @@ public virtual AfterTransactionCompletionProcessDelegate AfterTransactionComplet
120120
{
121121
if (persister.HasCache)
122122
{
123-
CacheKey ck = new CacheKey(key, persister.KeyType, persister.Role, Session.EntityMode, Session.Factory);
123+
CacheKey ck = Session.GenerateCacheKey(key, persister.KeyType, persister.Role);
124124
persister.Cache.Release(ck, softLock);
125125
}
126126
});
@@ -138,7 +138,7 @@ protected internal void Evict()
138138
{
139139
if (persister.HasCache)
140140
{
141-
CacheKey ck = new CacheKey(key, persister.KeyType, persister.Role, session.EntityMode, session.Factory);
141+
CacheKey ck = session.GenerateCacheKey(key, persister.KeyType, persister.Role);
142142
persister.Cache.Evict(ck);
143143
}
144144
}

src/NHibernate/Action/CollectionUpdateAction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public override AfterTransactionCompletionProcessDelegate AfterTransactionComple
130130
// NH Different behavior: to support unlocking collections from the cache.(r3260)
131131
if (Persister.HasCache)
132132
{
133-
CacheKey ck = new CacheKey(Key, Persister.KeyType, Persister.Role, Session.EntityMode, Session.Factory);
133+
CacheKey ck = Session.GenerateCacheKey(Key, Persister.KeyType, Persister.Role);
134134

135135
if (success)
136136
{

src/NHibernate/Action/EntityDeleteAction.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public override void Execute()
5757
CacheKey ck;
5858
if (persister.HasCache)
5959
{
60-
ck = new CacheKey(id, persister.IdentifierType, persister.RootEntityName, session.EntityMode, session.Factory);
60+
ck = session.GenerateCacheKey(id, persister.IdentifierType, persister.RootEntityName);
6161
sLock = persister.Cache.Lock(ck, version);
6262
}
6363
else
@@ -83,7 +83,7 @@ public override void Execute()
8383
}
8484
entry.PostDelete();
8585

86-
EntityKey key = new EntityKey(entry.Id, entry.Persister, session.EntityMode);
86+
EntityKey key = session.GenerateEntityKey(entry.Id, entry.Persister);
8787
persistenceContext.RemoveEntity(key);
8888
persistenceContext.RemoveProxy(key);
8989

@@ -131,7 +131,7 @@ protected override void AfterTransactionCompletionProcessImpl(bool success)
131131
{
132132
if (Persister.HasCache)
133133
{
134-
CacheKey ck = new CacheKey(Id, Persister.IdentifierType, Persister.RootEntityName, Session.EntityMode, Session.Factory);
134+
CacheKey ck = Session.GenerateCacheKey(Id, Persister.IdentifierType, Persister.RootEntityName);
135135
Persister.Cache.Release(ck, sLock);
136136
}
137137
if (success)

src/NHibernate/Action/EntityIdentityInsertAction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private EntityKey GenerateDelayedEntityKey()
4141
if (!isDelayed)
4242
throw new HibernateException("Cannot request delayed entity-key for non-delayed post-insert-id generation");
4343

44-
return new EntityKey(new DelayedPostInsertIdentifier(), Persister, Session.EntityMode);
44+
return Session.GenerateEntityKey(new DelayedPostInsertIdentifier(), Persister);
4545
}
4646
}
4747

src/NHibernate/Action/EntityInsertAction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public override void Execute()
8484
CacheEntry ce = new CacheEntry(state, persister, persister.HasUninitializedLazyProperties(instance, session.EntityMode), version, session, instance);
8585
cacheEntry = persister.CacheEntryStructure.Structure(ce);
8686

87-
CacheKey ck = new CacheKey(id, persister.IdentifierType, persister.RootEntityName, Session.EntityMode, Session.Factory);
87+
CacheKey ck = Session.GenerateCacheKey(id, persister.IdentifierType, persister.RootEntityName);
8888
bool put = persister.Cache.Insert(ck, cacheEntry, version);
8989

9090
if (put && factory.Statistics.IsStatisticsEnabled)
@@ -108,7 +108,7 @@ protected override void AfterTransactionCompletionProcessImpl(bool success)
108108
IEntityPersister persister = Persister;
109109
if (success && IsCachePutEnabled(persister))
110110
{
111-
CacheKey ck = new CacheKey(Id, persister.IdentifierType, persister.RootEntityName, Session.EntityMode, Session.Factory);
111+
CacheKey ck = Session.GenerateCacheKey(Id, persister.IdentifierType, persister.RootEntityName);
112112
bool put = persister.Cache.AfterInsert(ck, cacheEntry, version);
113113

114114
if (put && Session.Factory.Statistics.IsStatisticsEnabled)

src/NHibernate/Action/EntityUpdateAction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public override void Execute()
7070
CacheKey ck = null;
7171
if (persister.HasCache)
7272
{
73-
ck = new CacheKey(id, persister.IdentifierType, persister.RootEntityName, session.EntityMode, factory);
73+
ck = session.GenerateCacheKey(id, persister.IdentifierType, persister.RootEntityName);
7474
slock = persister.Cache.Lock(ck, previousVersion);
7575
}
7676

@@ -140,7 +140,7 @@ protected override void AfterTransactionCompletionProcessImpl(bool success)
140140
IEntityPersister persister = Persister;
141141
if (persister.HasCache)
142142
{
143-
CacheKey ck = new CacheKey(Id, persister.IdentifierType, persister.RootEntityName, Session.EntityMode, Session.Factory);
143+
CacheKey ck = Session.GenerateCacheKey(Id, persister.IdentifierType, persister.RootEntityName);
144144

145145
if (success && cacheEntry != null)
146146
{

src/NHibernate/Engine/BatchFetchQueue.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public void RemoveBatchLoadableEntityKey(EntityKey key)
136136
/// <param name="batchSize">the maximum number of keys to return</param>
137137
/// <param name="entityMode">The entity mode.</param>
138138
/// <returns>an array of collection keys, of length batchSize (padded with nulls)</returns>
139-
public object[] GetCollectionBatch(ICollectionPersister collectionPersister, object id, int batchSize, EntityMode entityMode)
139+
public object[] GetCollectionBatch(ICollectionPersister collectionPersister, object id, int batchSize)
140140
{
141141
object[] keys = new object[batchSize];
142142
keys[0] = id;
@@ -160,14 +160,14 @@ public object[] GetCollectionBatch(ICollectionPersister collectionPersister, obj
160160

161161
//if ( end == -1 && count > batchSize*10 ) return keys; //try out ten batches, max
162162

163-
bool isEqual = collectionPersister.KeyType.IsEqual(id, ce.LoadedKey, entityMode, collectionPersister.Factory);
163+
bool isEqual = collectionPersister.KeyType.IsEqual(id, ce.LoadedKey, context.Session.EntityMode, collectionPersister.Factory);
164164

165165
if (isEqual)
166166
{
167167
end = i;
168168
//checkForEnd = false;
169169
}
170-
else if (!IsCached(ce.LoadedKey, collectionPersister, entityMode))
170+
else if (!IsCached(ce.LoadedKey, collectionPersister))
171171
{
172172
keys[i++] = ce.LoadedKey;
173173
//count++;
@@ -194,9 +194,8 @@ public object[] GetCollectionBatch(ICollectionPersister collectionPersister, obj
194194
/// <param name="persister">The persister for the entities being loaded.</param>
195195
/// <param name="id">The identifier of the entity currently demanding load.</param>
196196
/// <param name="batchSize">The maximum number of keys to return</param>
197-
/// <param name="entityMode">The entity mode.</param>
198197
/// <returns>an array of identifiers, of length batchSize (possibly padded with nulls)</returns>
199-
public object[] GetEntityBatch(IEntityPersister persister,object id,int batchSize, EntityMode entityMode)
198+
public object[] GetEntityBatch(IEntityPersister persister,object id,int batchSize)
200199
{
201200
object[] ids = new object[batchSize];
202201
ids[0] = id; //first element of array is reserved for the actual instance we are loading!
@@ -214,13 +213,13 @@ public object[] GetEntityBatch(IEntityPersister persister,object id,int batchSiz
214213
//the first id found after the given id
215214
return ids;
216215
}
217-
if (persister.IdentifierType.IsEqual(id, key.Identifier, entityMode))
216+
if (persister.IdentifierType.IsEqual(id, key.Identifier, context.Session.EntityMode))
218217
{
219218
end = i;
220219
}
221220
else
222221
{
223-
if (!IsCached(key, persister, entityMode))
222+
if (!IsCached(key, persister))
224223
{
225224
ids[i++] = key.Identifier;
226225
}
@@ -236,24 +235,21 @@ public object[] GetEntityBatch(IEntityPersister persister,object id,int batchSiz
236235
return ids; //we ran out of ids to try
237236
}
238237

239-
private bool IsCached(EntityKey entityKey, IEntityPersister persister, EntityMode entityMode)
238+
private bool IsCached(EntityKey entityKey, IEntityPersister persister)
240239
{
241240
if (persister.HasCache)
242241
{
243-
CacheKey key =
244-
new CacheKey(entityKey.Identifier, persister.IdentifierType, entityKey.EntityName, entityMode,
245-
context.Session.Factory);
242+
CacheKey key = context.Session.GenerateCacheKey(entityKey.Identifier, persister.IdentifierType, entityKey.EntityName);
246243
return persister.Cache.Cache.Get(key) != null;
247244
}
248245
return false;
249246
}
250247

251-
private bool IsCached(object collectionKey, ICollectionPersister persister, EntityMode entityMode)
248+
private bool IsCached(object collectionKey, ICollectionPersister persister)
252249
{
253250
if (persister.HasCache)
254251
{
255-
CacheKey cacheKey =
256-
new CacheKey(collectionKey, persister.KeyType, persister.Role, entityMode, context.Session.Factory);
252+
CacheKey cacheKey = context.Session.GenerateCacheKey(collectionKey, persister.KeyType, persister.Role);
257253
return persister.Cache.Cache.Get(cacheKey) != null;
258254
}
259255
return false;

src/NHibernate/Engine/Collections.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private static void ProcessDereferencedCollection(IPersistentCollection coll, IS
6060
// throw new AssertionFailure("Unable to determine collection owner identifier for orphan-delete processing");
6161
// }
6262
//}
63-
EntityKey key = new EntityKey(ownerId, loadedPersister.OwnerEntityPersister, session.EntityMode);
63+
EntityKey key = session.GenerateEntityKey(ownerId, loadedPersister.OwnerEntityPersister);
6464
object owner = persistenceContext.GetEntity(key);
6565
if (owner == null)
6666
{

src/NHibernate/Engine/EntityEntry.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ public void ForceLocked(object entity, object nextVersion)
260260

261261
public bool IsNullifiable(bool earlyInsert, ISessionImplementor session)
262262
{
263-
return Status == Status.Saving || (earlyInsert ? !ExistsInDatabase : session.PersistenceContext.NullifiableEntityKeys.Contains(new EntityKey(Id, Persister, entityMode)));
263+
return Status == Status.Saving || (earlyInsert ? !ExistsInDatabase : session.PersistenceContext.NullifiableEntityKeys.Contains(session.GenerateEntityKey(Id, Persister)));
264264
}
265265

266266
public bool RequiresDirtyCheck(object entity)

src/NHibernate/Engine/ISessionImplementor.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Data;
55
using NHibernate.AdoNet;
6+
using NHibernate.Cache;
67
using NHibernate.Collection;
78
using NHibernate.Engine.Query.Sql;
89
using NHibernate.Event;
@@ -303,5 +304,9 @@ public interface ISessionImplementor
303304
ITransactionContext TransactionContext { get; set; }
304305

305306
void CloseSessionFromDistributedTransaction();
307+
308+
EntityKey GenerateEntityKey(object id, IEntityPersister persister);
309+
310+
CacheKey GenerateCacheKey(object id, IType type, string entityOrRoleName);
306311
}
307312
}

src/NHibernate/Engine/Loading/CollectionLoadContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ private void AddCollectionToCache(LoadingCollectionEntry lce, ICollectionPersist
323323
}
324324

325325
CollectionCacheEntry entry = new CollectionCacheEntry(lce.Collection, persister);
326-
CacheKey cacheKey = new CacheKey(lce.Key, persister.KeyType, persister.Role, session.EntityMode, factory);
326+
CacheKey cacheKey = session.GenerateCacheKey(lce.Key, persister.KeyType, persister.Role);
327327
bool put = persister.Cache.Put(cacheKey, persister.CacheEntryStructure.Structure(entry),
328328
session.Timestamp, version, versionComparator,
329329
factory.Settings.IsMinimalPutsEnabled && session.CacheMode != CacheMode.Refresh);

src/NHibernate/Engine/StatefulPersistenceContext.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ public void AfterTransactionCompletion()
330330
/// </summary>
331331
public object[] GetDatabaseSnapshot(object id, IEntityPersister persister)
332332
{
333-
EntityKey key = new EntityKey(id, persister, session.EntityMode);
333+
EntityKey key = session.GenerateEntityKey(id, persister);
334334
object cached;
335335
if (entitySnapshotsByKey.TryGetValue(key, out cached))
336336
{
@@ -614,7 +614,7 @@ private void ReassociateProxy(ILazyInitializer li, INHibernateProxy proxy)
614614
if (li.Session != Session)
615615
{
616616
IEntityPersister persister = session.Factory.GetEntityPersister(li.EntityName);
617-
EntityKey key = new EntityKey(li.Identifier, persister, session.EntityMode);
617+
EntityKey key = session.GenerateEntityKey(li.Identifier, persister);
618618
// any earlier proxy takes precedence
619619
if (!proxiesByKey.ContainsKey(key))
620620
{
@@ -777,13 +777,13 @@ public object ProxyFor(object impl)
777777
{
778778
EntityEntry e = GetEntry(impl);
779779
IEntityPersister p = e.Persister;
780-
return ProxyFor(p, new EntityKey(e.Id, p, session.EntityMode), impl);
780+
return ProxyFor(p, session.GenerateEntityKey(e.Id, p), impl);
781781
}
782782

783783
/// <summary> Get the entity that owns this persistent collection</summary>
784784
public object GetCollectionOwner(object key, ICollectionPersister collectionPersister)
785785
{
786-
return GetEntity(new EntityKey(key, collectionPersister.OwnerEntityPersister, session.EntityMode));
786+
return GetEntity(session.GenerateEntityKey(key, collectionPersister.OwnerEntityPersister));
787787
}
788788

789789
/// <summary> Get the entity that owned this persistent collection when it was loaded </summary>
@@ -1351,7 +1351,7 @@ public void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object gene
13511351
var oldEntry = (EntityEntry) tempObject2;
13521352
parentsByChild.Clear();
13531353

1354-
var newKey = new EntityKey(generatedId, oldEntry.Persister, Session.EntityMode);
1354+
var newKey = Session.GenerateEntityKey(generatedId, oldEntry.Persister);
13551355
AddEntity(newKey, entity);
13561356
AddEntry(entity, oldEntry.Status, oldEntry.LoadedState, oldEntry.RowId, generatedId, oldEntry.Version,
13571357
oldEntry.LockMode, oldEntry.ExistsInDatabase, oldEntry.Persister, oldEntry.IsBeingReplicated,

src/NHibernate/Engine/TwoPhaseLoad.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public static void InitializeEntity(object entity, bool readOnly, ISessionImplem
106106
object version = Versioning.GetVersion(hydratedState, persister);
107107
CacheEntry entry =
108108
new CacheEntry(hydratedState, persister, entityEntry.LoadedWithLazyPropertiesUnfetched, version, session, entity);
109-
CacheKey cacheKey = new CacheKey(id, persister.IdentifierType, persister.RootEntityName, session.EntityMode, session.Factory);
109+
CacheKey cacheKey = session.GenerateCacheKey(id, persister.IdentifierType, persister.RootEntityName);
110110
bool put =
111111
persister.Cache.Put(cacheKey, persister.CacheEntryStructure.Structure(entry), session.Timestamp, version,
112112
persister.IsVersioned ? persister.VersionType.Comparator : null,

src/NHibernate/Event/Default/AbstractLockUpgradeEventListener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected virtual void UpgradeLock(object entity, EntityEntry entry, LockMode re
4747
CacheKey ck;
4848
if (persister.HasCache)
4949
{
50-
ck = new CacheKey(entry.Id, persister.IdentifierType, persister.RootEntityName, source.EntityMode, source.Factory);
50+
ck = source.GenerateCacheKey(entry.Id, persister.IdentifierType, persister.RootEntityName);
5151
slock = persister.Cache.Lock(ck, entry.Version);
5252
}
5353
else

src/NHibernate/Event/Default/AbstractReassociateEventListener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ protected EntityEntry Reassociate(AbstractEvent @event, object entity, object id
3333
}
3434

3535
IEventSource source = @event.Session;
36-
EntityKey key = new EntityKey(id, persister, source.EntityMode);
36+
EntityKey key = source.GenerateEntityKey(id, persister);
3737

3838
source.PersistenceContext.CheckUniqueness(key, entity);
3939

src/NHibernate/Event/Default/AbstractSaveEventListener.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ protected virtual object PerformSave(object entity, object id, IEntityPersister
160160
EntityKey key;
161161
if (!useIdentityColumn)
162162
{
163-
key = new EntityKey(id, persister, source.EntityMode);
163+
key = source.GenerateEntityKey(id, persister);
164164
object old = source.PersistenceContext.GetEntity(key);
165165
if (old != null)
166166
{
@@ -260,7 +260,7 @@ protected virtual object PerformSaveOrReplicate(object entity, EntityKey key, IE
260260
id = insert.GeneratedId;
261261
//now done in EntityIdentityInsertAction
262262
//persister.setIdentifier( entity, id, source.getEntityMode() );
263-
key = new EntityKey(id, persister, source.EntityMode);
263+
key = source.GenerateEntityKey(id, persister);
264264
source.PersistenceContext.CheckUniqueness(key, entity);
265265
//source.getBatcher().executeBatch(); //found another way to ensure that all batched joined inserts have been executed
266266
}

src/NHibernate/Event/Default/DefaultDeleteEventListener.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public virtual void OnDelete(DeleteEvent @event, ISet<object> transientEntities)
6464
throw new TransientObjectException("the detached instance passed to delete() had a null identifier");
6565
}
6666

67-
EntityKey key = new EntityKey(id, persister, source.EntityMode);
67+
EntityKey key = source.GenerateEntityKey(id, persister);
6868

6969
persistenceContext.CheckUniqueness(key, entity);
7070

@@ -196,7 +196,7 @@ protected virtual void DeleteEntity(IEventSource session, object entity, EntityE
196196

197197
// before any callbacks, etc, so subdeletions see that this deletion happened first
198198
persistenceContext.SetEntryStatus(entityEntry, Status.Deleted);
199-
EntityKey key = new EntityKey(entityEntry.Id, persister, session.EntityMode);
199+
EntityKey key = session.GenerateEntityKey(entityEntry.Id, persister);
200200

201201
CascadeBeforeDelete(session, persister, entity, entityEntry, transientEntities);
202202

src/NHibernate/Event/Default/DefaultEvictEventListener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public virtual void OnEvict(EvictEvent @event)
3333
{
3434
throw new ArgumentException("null identifier");
3535
}
36-
EntityKey key = new EntityKey(id, persister, source.EntityMode);
36+
EntityKey key = source.GenerateEntityKey(id, persister);
3737
persistenceContext.RemoveProxy(key);
3838
if (!li.IsUninitialized)
3939
{

src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ private object[] GetDatabaseSnapshot(ISessionImplementor session, IEntityPersist
522522
else
523523
{
524524
//TODO: optimize away this lookup for entities w/o unsaved-value="undefined"
525-
EntityKey entityKey = new EntityKey(id, persister, session.EntityMode);
525+
EntityKey entityKey = session.GenerateEntityKey(id, persister);
526526
return session.PersistenceContext.GetCachedDatabaseSnapshot(entityKey);
527527
}
528528
}

src/NHibernate/Event/Default/DefaultInitializeCollectionEventListener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private bool InitializeCollectionFromCache(object id, ICollectionPersister persi
8080
{
8181
ISessionFactoryImplementor factory = source.Factory;
8282

83-
CacheKey ck = new CacheKey(id, persister.KeyType, persister.Role, source.EntityMode, factory);
83+
CacheKey ck = source.GenerateCacheKey(id, persister.KeyType, persister.Role);
8484
object ce = persister.Cache.Get(ck, source.Timestamp);
8585

8686
if (factory.Statistics.IsStatisticsEnabled)

0 commit comments

Comments
 (0)