Skip to content

Optimize MaterializationContext #380

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ internal override Expression VisitStructureFieldExpression(StructureFieldExpress
return Expression.Convert(
Expression.Call(
WellKnownMembers.CreateStructure,
Expression.Field(itemMaterializationContextParameter, ItemMaterializationContext.SessionFieldInfo),
Expression.Property(itemMaterializationContextParameter, ItemMaterializationContext.SessionPropertyInfo),
Expression.Constant(expression.Type),
persistentTupleExpression),
expression.Type);
Expand Down Expand Up @@ -313,7 +313,7 @@ internal override Expression VisitStructureExpression(StructureExpression expres
return Expression.Convert(
Expression.Call(
WellKnownMembers.CreateStructure,
Expression.Field(itemMaterializationContextParameter, ItemMaterializationContext.SessionFieldInfo),
Expression.Property(itemMaterializationContextParameter, ItemMaterializationContext.SessionPropertyInfo),
Expression.Constant(expression.Type),
persistentTupleExpression),
expression.Type);
Expand All @@ -330,7 +330,7 @@ internal override Expression VisitKeyExpression(KeyExpression expression)
WellKnownMembers.Key.Create,
Expression.Constant(context.Domain),
Expression.Property(
Expression.Field(itemMaterializationContextParameter, ItemMaterializationContext.SessionFieldInfo),
Expression.Property(itemMaterializationContextParameter, ItemMaterializationContext.SessionPropertyInfo),
WellKnownMembers.SessionNodeId),
Expression.Constant(expression.EntityType),
TypeReferenceAccuracyConstantExpression,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.

using System;
using System.Collections.Generic;
using System.Reflection;
using Xtensive.Core;
using Xtensive.Orm.Internals;
Expand All @@ -14,21 +12,21 @@

namespace Xtensive.Orm.Linq.Materialization
{
internal sealed class ItemMaterializationContext
internal readonly struct ItemMaterializationContext
{
public static readonly MethodInfo IsMaterializedMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(IsMaterialized));
public static readonly MethodInfo GetEntityMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(GetEntity));
public static readonly MethodInfo MaterializeMethodInfo = WellKnownOrmTypes.ItemMaterializationContext.GetMethod(nameof(Materialize));
public static readonly System.Reflection.FieldInfo SessionFieldInfo = WellKnownOrmTypes.ItemMaterializationContext.GetField(nameof(Session));
public static readonly System.Reflection.PropertyInfo SessionPropertyInfo = WellKnownOrmTypes.ItemMaterializationContext.GetProperty(nameof(Session));

public readonly Session Session;
public readonly MaterializationContext MaterializationContext;

private readonly TypeIdRegistry typeIdRegistry;
private readonly Entity[] entities;

public ParameterContext ParameterContext { get; }

public Session Session => MaterializationContext.Session;
private TypeIdRegistry typeIdRegistry => Session.StorageNode.TypeIdRegistry;

public bool IsMaterialized(int index) => entities[index] != null;

public Entity GetEntity(int index) => entities[index];
Expand Down Expand Up @@ -75,9 +73,7 @@ public ItemMaterializationContext(MaterializationContext materializationContext,
{
ParameterContext = parameterContext;
MaterializationContext = materializationContext;
Session = materializationContext.Session;

typeIdRegistry = Session.StorageNode.TypeIdRegistry;
entities = new Entity[materializationContext.EntitiesInRow];
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@
// Created by: Alexis Kochetov
// Created: 2009.05.29

using System;
using System.Collections.Generic;
using System.Linq;
using Xtensive.Core;
using Xtensive.Tuples.Transform;
using Xtensive.Orm.Internals;
using Xtensive.Orm.Model;
Expand All @@ -29,29 +25,24 @@ private struct EntityMappingCache
private readonly EntityMappingCache[] entityMappings;

/// <summary>
/// Gets model of current <see cref="DomainModel">domain model.</see>
/// Gets the session in which materialization is executing.
/// </summary>
public DomainModel Model { get; private set; }
public Session Session { get; }

/// <summary>
/// Gets the session in which materialization is executing.
/// Gets model of current <see cref="DomainModel">domain model.</see>
/// </summary>
public Session Session { get; private set; }
public DomainModel Model => Session.Domain.Model;

/// <summary>
/// Gets count of entities in query row.
/// </summary>
public int EntitiesInRow { get; private set; }
public int EntitiesInRow => entityMappings.Length;

/// <summary>
/// Gets <see cref="StorageNode">node</see> specific type identifiers registry of current node.
/// </summary>
public TypeIdRegistry TypeIdRegistry
{
get {
return Session.StorageNode.TypeIdRegistry;
}
}
public TypeIdRegistry TypeIdRegistry => Session.StorageNode.TypeIdRegistry;

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

private int ResolveTypeToNodeSpecificTypeIdentifier(TypeInfo typeInfo)
{
ArgumentNullException.ThrowIfNull(typeInfo);
return TypeIdRegistry[typeInfo];
}

private int ResolveTypeToNodeSpecificTypeIdentifier(TypeInfo typeInfo) => TypeIdRegistry[typeInfo];

// Constructors

public MaterializationContext(Session session, int entityCount)
{
Session = session;
Model = session.Domain.Model;
EntitiesInRow = entityCount;

entityMappings = new EntityMappingCache[entityCount];

for (int i = 0; i < entityMappings.Length; i++)
entityMappings[i] = new EntityMappingCache {
Items = new Dictionary<int, TypeMapping>()
};
entityMappings[i] = new() { Items = new Dictionary<int, TypeMapping>() };
}
}
}
}