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