Skip to content

Commit 9b66a45

Browse files
committed
Refactor BuildEntitySetTypeState
1 parent 9c5f79c commit 9b66a45

1 file changed

Lines changed: 39 additions & 36 deletions

File tree

Orm/Xtensive.Orm/Orm/EntitySetBase.cs

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -42,41 +42,7 @@ public abstract class EntitySetBase : SessionBound,
4242
private static readonly Parameter<Tuple> keyParameter = new Parameter<Tuple>(WellKnown.KeyFieldName);
4343
internal static readonly Parameter<Entity> ownerParameter = new Parameter<Entity>("Owner");
4444

45-
private static readonly Func<FieldInfo, EntitySetBase, EntitySetTypeState> BuildEntitySetTypeState = (FieldInfo field, EntitySetBase entitySet) => {
46-
var association = field.Associations.Last();
47-
var query = association.UnderlyingIndex.GetQuery().Seek(context => context.GetValue(keyParameter));
48-
var seek = entitySet.Session.Compile(query);
49-
var ownerDescriptor = association.OwnerType.Key.TupleDescriptor;
50-
var targetDescriptor = association.TargetType.Key.TupleDescriptor;
51-
52-
var itemColumnOffsets = association.AuxiliaryType == null
53-
? association.UnderlyingIndex.ValueColumns
54-
.Where(ci => ci.IsPrimaryKey)
55-
.Select(ci => ci.Field.MappingInfo.Offset)
56-
.ToList()
57-
: Enumerable.Range(0, targetDescriptor.Count).ToList();
58-
59-
var keyFieldCount = ownerDescriptor.Count + itemColumnOffsets.Count;
60-
var keyFieldTypes = ownerDescriptor
61-
.Concat(itemColumnOffsets.Select(i => targetDescriptor[i]))
62-
.ToArray(keyFieldCount);
63-
var keyDescriptor = TupleDescriptor.Create(keyFieldTypes);
64-
65-
var map = Enumerable.Range(0, ownerDescriptor.Count)
66-
.Select(i => new Pair<int, int>(0, i))
67-
.Concat(itemColumnOffsets.Select(i => new Pair<int, int>(1, i)))
68-
.ToArray(keyFieldCount);
69-
var seekTransform = new MapTransform(true, keyDescriptor, map);
70-
71-
Func<Tuple, Entity> itemCtor = null;
72-
if (association.AuxiliaryType != null) {
73-
itemCtor = DelegateHelper.CreateDelegate<Func<Tuple, Entity>>(null,
74-
association.AuxiliaryType.UnderlyingType, DelegateHelper.AspectedFactoryMethodName,
75-
Array.Empty<Type>());
76-
}
77-
78-
return new EntitySetTypeState(seek, seekTransform, itemCtor, entitySet.GetItemCountQueryDelegate(field));
79-
};
45+
private static readonly Func<FieldInfo, EntitySetBase, EntitySetTypeState> EntitySetTypeStateFactory = BuildEntitySetTypeState;
8046

8147
private readonly Entity owner;
8248
private readonly CombineTransform auxilaryTypeKeyTransform;
@@ -958,7 +924,44 @@ private static Key GetOwnerKey(Persistent owner)
958924
private EntitySetTypeState GetEntitySetTypeState()
959925
{
960926
EnsureOwnerIsNotRemoved();
961-
return Session.StorageNode.InternalEntitySetCache.GetOrAdd(Field, BuildEntitySetTypeState, this);
927+
return Session.StorageNode.InternalEntitySetCache.GetOrAdd(Field, EntitySetTypeStateFactory, this);
928+
}
929+
930+
private static EntitySetTypeState BuildEntitySetTypeState(FieldInfo field, EntitySetBase entitySet)
931+
{
932+
var association = field.Associations.Last();
933+
var query = association.UnderlyingIndex.GetQuery().Seek(context => context.GetValue(keyParameter));
934+
var seek = entitySet.Session.Compile(query);
935+
var ownerDescriptor = association.OwnerType.Key.TupleDescriptor;
936+
var targetDescriptor = association.TargetType.Key.TupleDescriptor;
937+
938+
var itemColumnOffsets = association.AuxiliaryType == null
939+
? association.UnderlyingIndex.ValueColumns
940+
.Where(ci => ci.IsPrimaryKey)
941+
.Select(ci => ci.Field.MappingInfo.Offset)
942+
.ToList()
943+
: Enumerable.Range(0, targetDescriptor.Count).ToList();
944+
945+
var keyFieldCount = ownerDescriptor.Count + itemColumnOffsets.Count;
946+
var keyFieldTypes = ownerDescriptor
947+
.Concat(itemColumnOffsets.Select(i => targetDescriptor[i]))
948+
.ToArray(keyFieldCount);
949+
var keyDescriptor = TupleDescriptor.Create(keyFieldTypes);
950+
951+
var map = Enumerable.Range(0, ownerDescriptor.Count)
952+
.Select(i => new Pair<int, int>(0, i))
953+
.Concat(itemColumnOffsets.Select(i => new Pair<int, int>(1, i)))
954+
.ToArray(keyFieldCount);
955+
var seekTransform = new MapTransform(true, keyDescriptor, map);
956+
957+
Func<Tuple, Entity> itemCtor = null;
958+
if (association.AuxiliaryType != null) {
959+
itemCtor = DelegateHelper.CreateDelegate<Func<Tuple, Entity>>(null,
960+
association.AuxiliaryType.UnderlyingType, DelegateHelper.AspectedFactoryMethodName,
961+
Array.Empty<Type>());
962+
}
963+
964+
return new EntitySetTypeState(seek, seekTransform, itemCtor, entitySet.GetItemCountQueryDelegate(field));
962965
}
963966

964967
private int? GetItemIndex(EntitySetState state, Key key)

0 commit comments

Comments
 (0)