Skip to content

Commit c3b984b

Browse files
authored
Replace object queryKey by value-type QueryKey (#376)
* Replace `object` queryKey by value-type `QueryKey` * remove default arg * Fix CachingFutureSequenceTest
1 parent d58e3ce commit c3b984b

File tree

4 files changed

+30
-24
lines changed

4 files changed

+30
-24
lines changed

Orm/Xtensive.Orm/Orm/Domain.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,9 @@ public static Domain Demand()
128128

129129
internal KeyGeneratorRegistry KeyGenerators { get; private set; }
130130

131-
internal ConcurrentDictionary<TypeInfo, IReadOnlyList<PrefetchFieldDescriptor>> PrefetchFieldDescriptorCache { get; } =
132-
new ConcurrentDictionary<TypeInfo, IReadOnlyList<PrefetchFieldDescriptor>>();
131+
internal ConcurrentDictionary<TypeInfo, IReadOnlyList<PrefetchFieldDescriptor>> PrefetchFieldDescriptorCache { get; } = new();
133132

134-
internal FastConcurrentLruCache<object, (object, ParameterizedQuery)> QueryCache { get; }
133+
internal FastConcurrentLruCache<QueryKey, (QueryKey Key, ParameterizedQuery Query)> QueryCache { get; }
135134

136135
internal ConcurrentDictionary<Type, System.Linq.Expressions.MethodCallExpression> RootCallExpressionsCache { get; } = new();
137136

@@ -430,7 +429,7 @@ internal Domain(DomainConfiguration configuration, object upgradeContextCookie,
430429
GenericKeyFactories = new ConcurrentDictionary<TypeInfo, GenericKeyFactory>();
431430
EntityDataReader = new EntityDataReader(this);
432431
KeyGenerators = new KeyGeneratorRegistry();
433-
QueryCache = new FastConcurrentLruCache<object, (object, ParameterizedQuery)>(Configuration.QueryCacheSize, k => k.Item1);
432+
QueryCache = new(Configuration.QueryCacheSize, k => k.Key);
434433
Extensions = new ExtensionCollection();
435434
UpgradeContextCookie = upgradeContextCookie;
436435
SingleConnection = singleConnection;

Orm/Xtensive.Orm/Orm/Internals/CompiledQueryRunner.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,23 @@
44
// Created by: Denis Krjuchkov
55
// Created: 2012.01.27
66

7-
using System;
8-
using System.Collections.Generic;
9-
using System.Linq;
107
using System.Linq.Expressions;
118
using System.Reflection;
12-
using System.Threading;
13-
using System.Threading.Tasks;
14-
using Xtensive.Caching;
159
using Xtensive.Core;
1610
using Xtensive.Orm.Linq;
1711
using Xtensive.Orm.Linq.Expressions.Visitors;
18-
using Xtensive.Orm.Providers;
19-
using Xtensive.Orm.Rse.Providers;
2012
using Xtensive.Reflection;
2113

2214
namespace Xtensive.Orm.Internals
2315
{
16+
internal record struct QueryKey(object Key, int MetadataToken, ModuleHandle ModuleHandle, string StorageNodeId);
17+
2418
internal class CompiledQueryRunner
2519
{
2620
private readonly Domain domain;
2721
private readonly Session session;
2822
private readonly QueryEndpoint endpoint;
29-
private readonly object queryKey;
23+
private readonly QueryKey queryKey;
3024
private readonly object queryTarget;
3125
private readonly ParameterContext outerContext;
3226

@@ -217,7 +211,7 @@ private ParameterContext CreateParameterContext(ParameterizedQuery query)
217211
return parameterContext;
218212
}
219213

220-
public CompiledQueryRunner(QueryEndpoint endpoint, object queryKey, object queryTarget, ParameterContext outerContext = null)
214+
private CompiledQueryRunner(QueryEndpoint endpoint, (object Key, int MetadataToken, ModuleHandle ModuleHandle) keyParts, object queryTarget, ParameterContext outerContext)
221215
{
222216
session = endpoint.Provider.Session;
223217
domain = session.Domain;
@@ -227,9 +221,21 @@ public CompiledQueryRunner(QueryEndpoint endpoint, object queryKey, object query
227221
this.outerContext = outerContext;
228222

229223
var domainConfig = domain.Configuration;
230-
this.queryKey = domainConfig.ShareStorageSchemaOverNodes && domainConfig.PreferTypeIdsAsQueryParameters
231-
? queryKey
232-
: (queryKey, session.StorageNodeId);
224+
queryKey = new(keyParts.Key, keyParts.MetadataToken, keyParts.ModuleHandle,
225+
domainConfig.ShareStorageSchemaOverNodes && domainConfig.PreferTypeIdsAsQueryParameters ? null : session.StorageNodeId
226+
);
227+
}
228+
229+
public CompiledQueryRunner(QueryEndpoint endpoint, MethodInfo methodInfo, object queryTarget, ParameterContext outerContext = null)
230+
: this(endpoint, (methodInfo, methodInfo.MetadataToken, methodInfo.Module.ModuleHandle), queryTarget, outerContext)
231+
{
232+
}
233+
234+
public CompiledQueryRunner(QueryEndpoint endpoint, object key, object queryTarget, ParameterContext outerContext = null)
235+
: this(endpoint,
236+
key is MethodInfo methodInfo ? (methodInfo, methodInfo.MetadataToken, methodInfo.Module.ModuleHandle) : (key, 0, default),
237+
queryTarget, outerContext)
238+
{
233239
}
234240
}
235241
}

Orm/Xtensive.Orm/Orm/QueryEndpoint.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,9 @@ public DelayedScalarQuery<TResult> CreateDelayedQuery<TResult>(Func<QueryEndpoin
880880
public DelayedQuery<TElement> CreateDelayedQuery<TElement>(object key, Func<QueryEndpoint, IQueryable<TElement>> query) =>
881881
new CompiledQueryRunner(this, key, query.Target).CreateDelayedQuery(query);
882882

883+
public DelayedQuery<TElement> CreateDelayedQuery<TElement>(MethodInfo key, Func<QueryEndpoint, IQueryable<TElement>> query) =>
884+
new CompiledQueryRunner(this, key, query.Target).CreateDelayedQuery(query);
885+
883886
/// <summary>
884887
/// Creates future query and registers it for the later execution.
885888
/// The associated query will be cached.

Orm/Xtensive.Orm/Orm/StorageNodeManager.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,11 @@ public bool RemoveNode([NotNull] string nodeId, bool clearQueryCache = false)
6464

6565
if (removeResult && clearQueryCache) {
6666
var domainConfig = handlers.Domain.Configuration;
67-
if (domainConfig.ShareStorageSchemaOverNodes && domainConfig.PreferTypeIdsAsQueryParameters) {
68-
return removeResult;
69-
}
70-
71-
var queryCache = (Caching.FastConcurrentLruCache<object, (object, Linq.ParameterizedQuery)>) handlers.Domain.QueryCache;
72-
foreach (var key in queryCache.Keys.Where(k => k is ValueTuple<object, string> pair && pair.Item2 == nodeId).ToList()) {
73-
queryCache.RemoveKey(key);
67+
if (!(domainConfig.ShareStorageSchemaOverNodes && domainConfig.PreferTypeIdsAsQueryParameters)) {
68+
var queryCache = handlers.Domain.QueryCache;
69+
foreach (var key in queryCache.Keys.Where(k => k.StorageNodeId == nodeId).ToList()) {
70+
queryCache.RemoveKey(key);
71+
}
7472
}
7573
}
7674
return removeResult;

0 commit comments

Comments
 (0)