Skip to content

Commit 8c9b837

Browse files
authored
Optimize MaterializationContext (#380)
* Optimize `MaterializationContext` * re-arrange fields * Redundant null-check * SessionProperty instead of Session Field
1 parent f2ab772 commit 8c9b837

File tree

3 files changed

+17
-40
lines changed

3 files changed

+17
-40
lines changed

Orm/Xtensive.Orm/Orm/Linq/Materialization/ExpressionMaterializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ internal override Expression VisitStructureFieldExpression(StructureFieldExpress
267267
return Expression.Convert(
268268
Expression.Call(
269269
WellKnownMembers.CreateStructure,
270-
Expression.Field(itemMaterializationContextParameter, ItemMaterializationContext.SessionFieldInfo),
270+
Expression.Property(itemMaterializationContextParameter, ItemMaterializationContext.SessionPropertyInfo),
271271
Expression.Constant(expression.Type),
272272
persistentTupleExpression),
273273
expression.Type);
@@ -313,7 +313,7 @@ internal override Expression VisitStructureExpression(StructureExpression expres
313313
return Expression.Convert(
314314
Expression.Call(
315315
WellKnownMembers.CreateStructure,
316-
Expression.Field(itemMaterializationContextParameter, ItemMaterializationContext.SessionFieldInfo),
316+
Expression.Property(itemMaterializationContextParameter, ItemMaterializationContext.SessionPropertyInfo),
317317
Expression.Constant(expression.Type),
318318
persistentTupleExpression),
319319
expression.Type);
@@ -330,7 +330,7 @@ internal override Expression VisitKeyExpression(KeyExpression expression)
330330
WellKnownMembers.Key.Create,
331331
Expression.Constant(context.Domain),
332332
Expression.Property(
333-
Expression.Field(itemMaterializationContextParameter, ItemMaterializationContext.SessionFieldInfo),
333+
Expression.Property(itemMaterializationContextParameter, ItemMaterializationContext.SessionPropertyInfo),
334334
WellKnownMembers.SessionNodeId),
335335
Expression.Constant(expression.EntityType),
336336
TypeReferenceAccuracyConstantExpression,

Orm/Xtensive.Orm/Orm/Linq/Materialization/ItemMaterializationContext.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44

5-
using System;
6-
using System.Collections.Generic;
75
using System.Reflection;
86
using Xtensive.Core;
97
using Xtensive.Orm.Internals;
@@ -14,21 +12,21 @@
1412

1513
namespace Xtensive.Orm.Linq.Materialization
1614
{
17-
internal sealed class ItemMaterializationContext
15+
internal readonly struct ItemMaterializationContext
1816
{
1917
public static readonly MethodInfo IsMaterializedMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(IsMaterialized));
2018
public static readonly MethodInfo GetEntityMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(GetEntity));
2119
public static readonly MethodInfo MaterializeMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(Materialize));
22-
public static readonly System.Reflection.FieldInfo SessionFieldInfo = WellKnownOrmTypes.ItemMaterializationContext.GetField(nameof(Session));
20+
public static readonly System.Reflection.PropertyInfo SessionPropertyInfo = WellKnownOrmTypes.ItemMaterializationContext.GetProperty(nameof(Session));
2321

24-
public readonly Session Session;
2522
public readonly MaterializationContext MaterializationContext;
2623

27-
private readonly TypeIdRegistry typeIdRegistry;
2824
private readonly Entity[] entities;
29-
3025
public ParameterContext ParameterContext { get; }
3126

27+
public Session Session => MaterializationContext.Session;
28+
private TypeIdRegistry typeIdRegistry => Session.StorageNode.TypeIdRegistry;
29+
3230
public bool IsMaterialized(int index) => entities[index] != null;
3331

3432
public Entity GetEntity(int index) => entities[index];
@@ -75,9 +73,7 @@ public ItemMaterializationContext(MaterializationContext materializationContext,
7573
{
7674
ParameterContext = parameterContext;
7775
MaterializationContext = materializationContext;
78-
Session = materializationContext.Session;
7976

80-
typeIdRegistry = Session.StorageNode.TypeIdRegistry;
8177
entities = new Entity[materializationContext.EntitiesInRow];
8278
}
8379
}

Orm/Xtensive.Orm/Orm/Linq/Materialization/MaterializationContext.cs

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
// Created by: Alexis Kochetov
55
// Created: 2009.05.29
66

7-
using System;
8-
using System.Collections.Generic;
9-
using System.Linq;
10-
using Xtensive.Core;
117
using Xtensive.Tuples.Transform;
128
using Xtensive.Orm.Internals;
139
using Xtensive.Orm.Model;
@@ -29,29 +25,24 @@ private struct EntityMappingCache
2925
private readonly EntityMappingCache[] entityMappings;
3026

3127
/// <summary>
32-
/// Gets model of current <see cref="DomainModel">domain model.</see>
28+
/// Gets the session in which materialization is executing.
3329
/// </summary>
34-
public DomainModel Model { get; private set; }
30+
public Session Session { get; }
3531

3632
/// <summary>
37-
/// Gets the session in which materialization is executing.
33+
/// Gets model of current <see cref="DomainModel">domain model.</see>
3834
/// </summary>
39-
public Session Session { get; private set; }
35+
public DomainModel Model => Session.Domain.Model;
4036

4137
/// <summary>
4238
/// Gets count of entities in query row.
4339
/// </summary>
44-
public int EntitiesInRow { get; private set; }
40+
public int EntitiesInRow => entityMappings.Length;
4541

4642
/// <summary>
4743
/// Gets <see cref="StorageNode">node</see> specific type identifiers registry of current node.
4844
/// </summary>
49-
public TypeIdRegistry TypeIdRegistry
50-
{
51-
get {
52-
return Session.StorageNode.TypeIdRegistry;
53-
}
54-
}
45+
public TypeIdRegistry TypeIdRegistry => Session.StorageNode.TypeIdRegistry;
5546

5647
/// <summary>
5748
/// Gets or sets queue of materialization actions.
@@ -97,27 +88,17 @@ public TypeMapping GetTypeMapping(int entityIndex, TypeInfo approximateType, int
9788
return result;
9889
}
9990

100-
private int ResolveTypeToNodeSpecificTypeIdentifier(TypeInfo typeInfo)
101-
{
102-
ArgumentNullException.ThrowIfNull(typeInfo);
103-
return TypeIdRegistry[typeInfo];
104-
}
105-
91+
private int ResolveTypeToNodeSpecificTypeIdentifier(TypeInfo typeInfo) => TypeIdRegistry[typeInfo];
10692

10793
// Constructors
10894

10995
public MaterializationContext(Session session, int entityCount)
11096
{
11197
Session = session;
112-
Model = session.Domain.Model;
113-
EntitiesInRow = entityCount;
11498

11599
entityMappings = new EntityMappingCache[entityCount];
116-
117100
for (int i = 0; i < entityMappings.Length; i++)
118-
entityMappings[i] = new EntityMappingCache {
119-
Items = new Dictionary<int, TypeMapping>()
120-
};
101+
entityMappings[i] = new() { Items = new Dictionary<int, TypeMapping>() };
121102
}
122103
}
123-
}
104+
}

0 commit comments

Comments
 (0)