Skip to content

Commit 2b27576

Browse files
authored
Optimization: Refactor common code in IMappedExpression.Remap() implementation (#187)
1 parent 0fe2e87 commit 2b27576

15 files changed

+142
-197
lines changed

Orm/Xtensive.Orm/Orm/Linq/Expressions/ColumnExpression.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,19 @@
1111

1212
namespace Xtensive.Orm.Linq.Expressions
1313
{
14-
internal class ColumnExpression : ParameterizedExpression,
15-
IMappedExpression
14+
internal class ColumnExpression : ParameterizedExpression
1615
{
1716
internal readonly Segment<ColNum> Mapping;
1817

19-
public Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
18+
public override ColumnExpression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
2019
{
2120
if (!CanRemap)
2221
return this;
2322
var newMapping = new Segment<ColNum>((ColNum) (Mapping.Offset + offset), 1);
2423
return new ColumnExpression(Type, newMapping, OuterParameter, DefaultIfEmpty);
2524
}
2625

27-
public Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
26+
public override ColumnExpression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
2827
{
2928
if (!CanRemap)
3029
return this;
@@ -37,12 +36,12 @@ public Expression BindParameter(ParameterExpression parameter)
3736
return BindParameter(parameter, new Dictionary<Expression, Expression>());
3837
}
3938

40-
public Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
39+
public override ColumnExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
4140
{
4241
return new ColumnExpression(Type, Mapping, parameter, DefaultIfEmpty);
4342
}
4443

45-
public Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
44+
public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
4645
{
4746
return new ColumnExpression(Type, Mapping, null, DefaultIfEmpty);
4847
}

Orm/Xtensive.Orm/Orm/Linq/Expressions/ConstructorExpression.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
namespace Xtensive.Orm.Linq
1919
{
2020
[Serializable]
21-
internal class ConstructorExpression : ParameterizedExpression,
22-
IMappedExpression
21+
internal class ConstructorExpression : ParameterizedExpression
2322
{
2423
public Dictionary<MemberInfo, Expression> Bindings { get; }
2524

@@ -29,7 +28,7 @@ internal class ConstructorExpression : ParameterizedExpression,
2928

3029
public IReadOnlyList<Expression> ConstructorArguments { get; }
3130

32-
public Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
31+
public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
3332
{
3433
Func<Expression, Expression> genericBinder =
3534
e => GenericExpressionVisitor<IMappedExpression>.Process(e, mapped => mapped.BindParameter(parameter, processedExpressions));
@@ -41,7 +40,7 @@ public Expression BindParameter(ParameterExpression parameter, Dictionary<Expres
4140
ConstructorArguments.Select(genericBinder).ToList());
4241
}
4342

44-
public Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
43+
public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
4544
{
4645
Func<Expression, Expression> genericRemover =
4746
e => GenericExpressionVisitor<IMappedExpression>.Process(e, mapped => mapped.RemoveOuterParameter(processedExpressions));
@@ -54,7 +53,7 @@ public Expression RemoveOuterParameter(Dictionary<Expression, Expression> proces
5453
return result;
5554
}
5655

57-
public Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
56+
public override Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
5857
{
5958
Func<IMappedExpression, Expression> remapper = delegate(IMappedExpression mapped) {
6059
var parametrizedExpression = mapped as ParameterizedExpression;
@@ -75,7 +74,7 @@ public Expression Remap(ColNum offset, Dictionary<Expression, Expression> proces
7574
return result;
7675
}
7776

78-
public Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
77+
public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
7978
{
8079
Func<IMappedExpression, Expression> remapper = delegate(IMappedExpression mapped) {
8180
var parametrizedExpression = mapped as ParameterizedExpression;
@@ -98,4 +97,4 @@ public ConstructorExpression(Type type, Dictionary<MemberInfo, Expression> bindi
9897
Constructor = constructor;
9998
}
10099
}
101-
}
100+
}

Orm/Xtensive.Orm/Orm/Linq/Expressions/EntityExpression.cs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212

1313
namespace Xtensive.Orm.Linq.Expressions
1414
{
15-
internal class EntityExpression : ParameterizedExpression,
16-
IEntityExpression
15+
internal class EntityExpression : ParameterizedExpression, IEntityExpression
1716
{
1817
private List<PersistentFieldExpression> fields;
1918

@@ -34,41 +33,31 @@ private set {
3433

3534
public bool IsNullable { get; set; }
3635

37-
public Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
36+
public override EntityExpression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
3837
{
39-
if (!CanRemap) {
40-
return this;
41-
}
42-
43-
if (processedExpressions.TryGetValue(this, out var value)) {
38+
if (TryProcessed<EntityExpression>(processedExpressions, out var value))
4439
return value;
45-
}
4640

47-
var keyExpression = (KeyExpression) Key.Remap(offset, processedExpressions);
41+
var keyExpression = Key.Remap(offset, processedExpressions);
4842
var result = new EntityExpression(PersistentType, keyExpression, OuterParameter, DefaultIfEmpty);
4943
processedExpressions.Add(this, result);
5044
result.IsNullable = IsNullable;
5145
var processedFields = new List<PersistentFieldExpression>(fields.Count);
5246
foreach (var field in fields) {
5347
// Do not convert to LINQ. We want to avoid a closure creation here.
54-
processedFields.Add((PersistentFieldExpression) field.Remap(offset, processedExpressions));
48+
processedFields.Add(field.Remap(offset, processedExpressions));
5549
}
5650

5751
result.Fields = processedFields;
5852
return result;
5953
}
6054

61-
public Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
55+
public override EntityExpression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
6256
{
63-
if (!CanRemap) {
64-
return this;
65-
}
66-
67-
if (processedExpressions.TryGetValue(this, out var value)) {
57+
if (TryProcessed<EntityExpression>(processedExpressions, out var value))
6858
return value;
69-
}
7059

71-
var keyExpression = (KeyExpression) Key.Remap(map, processedExpressions);
60+
var keyExpression = Key.Remap(map, processedExpressions);
7261
if (keyExpression == null) {
7362
return null;
7463
}
@@ -91,7 +80,7 @@ public Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expres
9180
return result;
9281
}
9382

94-
public Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
83+
public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
9584
{
9685
if (processedExpressions.TryGetValue(this, out var value)) {
9786
return value;
@@ -111,7 +100,7 @@ public Expression BindParameter(ParameterExpression parameter, Dictionary<Expres
111100
return result;
112101
}
113102

114-
public Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
103+
public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
115104
{
116105
if (processedExpressions.TryGetValue(this, out var value)) {
117106
return value;

Orm/Xtensive.Orm/Orm/Linq/Expressions/EntityFieldExpression.cs

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,20 @@ public void RegisterEntityExpression(ColNum offset)
3030
Entity.IsNullable = IsNullable;
3131
}
3232

33-
public override Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
33+
public override EntityFieldExpression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
3434
{
35-
if (!CanRemap) {
36-
return this;
37-
}
38-
39-
if (processedExpressions.TryGetValue(this, out var result)) {
40-
return result;
41-
}
35+
if (TryProcessed<EntityFieldExpression>(processedExpressions, out var value))
36+
return value;
4237

4338
var newFields = new List<PersistentFieldExpression>(fields.Count);
4439
foreach (var field in fields) {
4540
// Do not convert to LINQ. We want to avoid a closure creation here.
46-
newFields.Add((PersistentFieldExpression) field.Remap(offset, processedExpressions));
41+
newFields.Add(field.Remap(offset, processedExpressions));
4742
}
4843

49-
var keyExpression = (KeyExpression) Key.Remap(offset, processedExpressions);
50-
var entity = (EntityExpression) Entity?.Remap(offset, processedExpressions);
51-
result = new EntityFieldExpression(
44+
var keyExpression = Key.Remap(offset, processedExpressions);
45+
var entity = Entity?.Remap(offset, processedExpressions);
46+
var result = new EntityFieldExpression(
5247
PersistentType, Field, newFields, keyExpression.Mapping, keyExpression, entity, OuterParameter, DefaultIfEmpty);
5348
if (Owner == null) {
5449
return result;
@@ -59,15 +54,10 @@ public override Expression Remap(ColNum offset, Dictionary<Expression, Expressio
5954
return result;
6055
}
6156

62-
public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
57+
public override EntityFieldExpression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
6358
{
64-
if (!CanRemap) {
65-
return this;
66-
}
67-
68-
if (processedExpressions.TryGetValue(this, out var result)) {
69-
return result;
70-
}
59+
if (TryProcessed<EntityFieldExpression>(processedExpressions, out var value))
60+
return value;
7161

7262
var newFields = new List<PersistentFieldExpression>(fields.Count);
7363
using (new SkipOwnerCheckScope()) {
@@ -87,13 +77,13 @@ public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expressio
8777
return null;
8878
}
8979

90-
var keyExpression = (KeyExpression) Key.Remap(map, processedExpressions);
80+
var keyExpression = Key.Remap(map, processedExpressions);
9181
EntityExpression entity;
9282
using (new SkipOwnerCheckScope()) {
93-
entity = (EntityExpression) Entity?.Remap(map, processedExpressions);
83+
entity = Entity?.Remap(map, processedExpressions);
9484
}
9585

96-
result = new EntityFieldExpression(
86+
var result = new EntityFieldExpression(
9787
PersistentType, Field, newFields, keyExpression.Mapping, keyExpression, entity, OuterParameter, DefaultIfEmpty);
9888
if (Owner == null) {
9989
return result;
@@ -104,11 +94,11 @@ public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expressio
10494
return result;
10595
}
10696

107-
public override Expression BindParameter(
97+
public override EntityFieldExpression BindParameter(
10898
ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
10999
{
110-
if (processedExpressions.TryGetValue(this, out var result)) {
111-
return result;
100+
if (processedExpressions.TryGetValue(this, out var r)) {
101+
return (EntityFieldExpression)r;
112102
}
113103

114104
var newFields = new List<PersistentFieldExpression>(fields.Count);
@@ -118,7 +108,7 @@ public override Expression BindParameter(
118108
}
119109
var keyExpression = (KeyExpression) Key.BindParameter(parameter, processedExpressions);
120110
var entity = (EntityExpression) Entity?.BindParameter(parameter, processedExpressions);
121-
result = new EntityFieldExpression(
111+
var result = new EntityFieldExpression(
122112
PersistentType, Field, newFields, Mapping, keyExpression, entity, parameter, DefaultIfEmpty);
123113
if (Owner == null) {
124114
return result;

Orm/Xtensive.Orm/Orm/Linq/Expressions/EntitySetExpression.cs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,44 +44,41 @@ public override FieldExpression RemoveOwner()
4444
throw Exceptions.InternalError(Strings.ExUnableToRemoveOwnerFromEntitySetExpression, OrmLog.Instance);
4545
}
4646

47-
public override Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
47+
public override FieldExpression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
4848
{
4949
if (!CanRemap)
5050
return this;
5151

52-
Expression result;
53-
if (processedExpressions.TryGetValue(this, out result))
54-
return result;
55-
result = new EntitySetExpression(Field, null, DefaultIfEmpty);
52+
if (processedExpressions.TryGetValue(this, out var r))
53+
return (FieldExpression)r;
54+
var result = new EntitySetExpression(Field, null, DefaultIfEmpty);
5655
if (base.Owner==null)
5756
return result;
5857
processedExpressions.Add(this, result);
5958
Owner.Remap(offset, processedExpressions);
6059
return result;
6160
}
6261

63-
public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
62+
public override EntitySetExpression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
6463
{
6564
if (!CanRemap)
6665
return this;
6766

68-
Expression result;
69-
if (processedExpressions.TryGetValue(this, out result))
70-
return result;
71-
result = new EntitySetExpression(Field, null, DefaultIfEmpty);
67+
if (processedExpressions.TryGetValue(this, out var r))
68+
return (EntitySetExpression)r;
69+
var result = new EntitySetExpression(Field, null, DefaultIfEmpty);
7270
if (base.Owner==null)
7371
return result;
7472
processedExpressions.Add(this, result);
7573
Owner.Remap(map, processedExpressions);
7674
return result;
7775
}
7876

79-
public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
77+
public override EntitySetExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
8078
{
81-
Expression result;
82-
if (processedExpressions.TryGetValue(this, out result))
83-
return result;
84-
result = new EntitySetExpression(Field, parameter, DefaultIfEmpty);
79+
if (processedExpressions.TryGetValue(this, out var r))
80+
return (EntitySetExpression)r;
81+
var result = new EntitySetExpression(Field, parameter, DefaultIfEmpty);
8582
if (base.Owner==null)
8683
return result;
8784
processedExpressions.Add(this, result);

Orm/Xtensive.Orm/Orm/Linq/Expressions/FieldExpression.cs

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,13 @@ internal set {
3030
}
3131
}
3232

33-
public override Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
33+
public override FieldExpression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
3434
{
35-
if (!CanRemap) {
36-
return this;
37-
}
38-
39-
if (processedExpressions.TryGetValue(this, out var result)) {
40-
return result;
41-
}
35+
if (TryProcessed<FieldExpression>(processedExpressions, out var value))
36+
return value;
4237

4338
var newMapping = new Segment<ColNum>((ColNum)(Mapping.Offset + offset), Mapping.Length);
44-
result = new FieldExpression(ExtendedExpressionType.Field, Field, newMapping, OuterParameter, DefaultIfEmpty);
39+
var result = new FieldExpression(ExtendedExpressionType.Field, Field, newMapping, OuterParameter, DefaultIfEmpty);
4540
if (owner == null) {
4641
return result;
4742
}
@@ -51,15 +46,10 @@ public override Expression Remap(ColNum offset, Dictionary<Expression, Expressio
5146
return result;
5247
}
5348

54-
public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
49+
public override FieldExpression Remap(IReadOnlyList<ColNum> map, Dictionary<Expression, Expression> processedExpressions)
5550
{
56-
if (!CanRemap) {
57-
return this;
58-
}
59-
60-
if (processedExpressions.TryGetValue(this, out var result)) {
61-
return result;
62-
}
51+
if (TryProcessed<FieldExpression>(processedExpressions, out var value))
52+
return value;
6353

6454
var offset = (ColNum)map.IndexOf(Mapping.Offset);
6555
if (offset < 0) {
@@ -75,7 +65,7 @@ public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expressio
7565
return null;
7666
}
7767
var newMapping = new Segment<ColNum>(offset, Mapping.Length);
78-
result = new FieldExpression(ExtendedExpressionType.Field, Field, newMapping, OuterParameter, DefaultIfEmpty);
68+
var result = new FieldExpression(ExtendedExpressionType.Field, Field, newMapping, OuterParameter, DefaultIfEmpty);
7969
if (owner == null) {
8070
return result;
8171
}
@@ -85,13 +75,13 @@ public override Expression Remap(IReadOnlyList<ColNum> map, Dictionary<Expressio
8575
return result;
8676
}
8777

88-
public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
78+
public override FieldExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
8979
{
90-
if (processedExpressions.TryGetValue(this, out var result)) {
91-
return result;
80+
if (processedExpressions.TryGetValue(this, out var r)) {
81+
return (FieldExpression)r;
9282
}
9383

94-
result = new FieldExpression(ExtendedExpressionType.Field, Field, Mapping, parameter, DefaultIfEmpty);
84+
var result = new FieldExpression(ExtendedExpressionType.Field, Field, Mapping, parameter, DefaultIfEmpty);
9585
if (owner == null) {
9686
return result;
9787
}
@@ -144,4 +134,4 @@ protected FieldExpression(
144134
Field = field;
145135
}
146136
}
147-
}
137+
}

0 commit comments

Comments
 (0)