Skip to content

Commit 8f47b28

Browse files
committed
Replaces certain parameters with calculated column parameter
1 parent 0f5e585 commit 8f47b28

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

Orm/Xtensive.Orm/Orm/Linq/Expressions/Visitors/IncludeFilterMappingGatherer.cs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2010 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2009-2020 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Alexey Gamzov
55
// Created: 2009.11.16
66

@@ -39,16 +39,14 @@ public MappingEntry(LambdaExpression calculatedColumn)
3939
private readonly ApplyParameter filteredTuple;
4040
private readonly MappingEntry[] resultMapping;
4141

42-
private int tupleIndex = -1;
43-
private int providerIndex = -1;
44-
4542
public static MappingEntry[] Gather(Expression filterExpression, Expression filterDataTuple, ApplyParameter filteredTuple, int columnCount)
4643
{
4744
var mapping = Enumerable.Repeat((MappingEntry) null, columnCount).ToArray();
4845
var visitor = new IncludeFilterMappingGatherer(filterDataTuple, filteredTuple, mapping);
49-
visitor.Visit(filterExpression);
50-
if (mapping.Contains(null))
46+
_ = visitor.Visit(filterExpression);
47+
if (mapping.Contains(null)) {
5148
throw Exceptions.InternalError("Failed to gather mappings for IncludeProvider", OrmLog.Instance);
49+
}
5250
return mapping;
5351
}
5452

@@ -59,42 +57,51 @@ protected override Expression VisitBinary(BinaryExpression b)
5957

6058
var filterDataAccessor = expressions.FirstOrDefault(e => {
6159
var tupleAccess = e.StripCasts().AsTupleAccess();
62-
return tupleAccess!=null && tupleAccess.Object==filterDataTuple;
60+
return tupleAccess != null && tupleAccess.Object == filterDataTuple;
6361
});
64-
if (filterDataAccessor==null)
62+
if (filterDataAccessor == null) {
6563
return result;
64+
}
6665

6766
var filteredExpression = expressions.FirstOrDefault(e => e!=filterDataAccessor);
68-
if (filteredExpression==null)
67+
if (filteredExpression == null) {
6968
return result;
69+
}
7070

7171
var filterDataIndex = filterDataAccessor.StripCasts().GetTupleAccessArgument();
72+
if (resultMapping.Length <= filterDataIndex) {
73+
return result;
74+
}
7275
resultMapping[filterDataIndex] = CreateMappingEntry(filteredExpression);
73-
7476
return result;
7577
}
7678

7779
protected override Expression VisitMemberAccess(MemberExpression m)
7880
{
7981
var target = m.Expression;
80-
if (target==null)
82+
if (target == null) {
8183
return base.VisitMemberAccess(m);
82-
if (target.NodeType==ExpressionType.Constant && ((ConstantExpression) target).Value==filteredTuple)
84+
}
85+
86+
if (target.NodeType == ExpressionType.Constant && ((ConstantExpression) target).Value == filteredTuple) {
8387
return calculatedColumnParameter;
88+
}
8489
return base.VisitMemberAccess(m);
8590
}
8691

8792
private MappingEntry CreateMappingEntry(Expression expression)
8893
{
8994
var tupleAccess = expression.StripCasts().AsTupleAccess();
90-
if (tupleAccess!=null)
95+
if (tupleAccess!=null) {
9196
return new MappingEntry(tupleAccess.GetTupleAccessArgument());
97+
}
98+
expression = ExpressionReplacer.Replace(expression, filterDataTuple, calculatedColumnParameter);
9299
return new MappingEntry(FastExpression.Lambda(expression, calculatedColumnParameter));
93100
}
94101

95102
private IncludeFilterMappingGatherer(Expression filterDataTuple, ApplyParameter filteredTuple, MappingEntry[] resultMapping)
96103
{
97-
calculatedColumnParameter = Expression.Parameter(typeof (Tuple), "filteredRow");
104+
calculatedColumnParameter = Expression.Parameter(typeof(Tuple), "filteredRow");
98105

99106
this.filterDataTuple = filterDataTuple;
100107
this.filteredTuple = filteredTuple;

0 commit comments

Comments
 (0)