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: Denis Krjuchkov
55// Created: 2009.11.13
66
77using System ;
88using System . Collections . Generic ;
99using System . Linq ;
1010using System . Linq . Expressions ;
11- using Xtensive . Collections ;
1211using Xtensive . Core ;
1312using Xtensive . Orm . Rse ;
1413using Xtensive . Orm . Rse . Transformation ;
@@ -22,31 +21,31 @@ namespace Xtensive.Orm.Providers
2221 partial class SqlCompiler
2322 {
2423 protected SqlProvider CreateProvider ( SqlSelect statement ,
25- CompilableProvider origin , params ExecutableProvider [ ] sources )
26- {
27- return CreateProvider ( statement , ( IEnumerable < QueryParameterBinding > ) null , origin , sources ) ;
28- }
24+ CompilableProvider origin , params ExecutableProvider [ ] sources ) =>
25+ CreateProvider ( statement , ( IEnumerable < QueryParameterBinding > ) null , origin , sources ) ;
2926
3027 protected SqlProvider CreateProvider ( SqlSelect statement , QueryParameterBinding extraBinding ,
3128 CompilableProvider origin , params ExecutableProvider [ ] sources )
3229 {
33- var extraBindings = extraBinding != null ? EnumerableUtils . One ( extraBinding ) : null ;
30+ var extraBindings = extraBinding != null ? Enumerable . Repeat ( extraBinding , 1 ) : null ;
3431 return CreateProvider ( statement , extraBindings , origin , sources ) ;
3532 }
3633
3734 protected SqlProvider CreateProvider ( SqlSelect statement , IEnumerable < QueryParameterBinding > extraBindings ,
3835 CompilableProvider origin , params ExecutableProvider [ ] sources )
3936 {
40- var sqlSources = sources . OfType < SqlProvider > ( ) ;
37+ var allowBatching = true ;
38+ var parameterBindings = Enumerable . Empty < QueryParameterBinding > ( ) ;
39+ foreach ( var provider in sources . OfType < SqlProvider > ( ) ) {
40+ var queryRequest = provider . Request ;
41+ allowBatching &= queryRequest . CheckOptions ( QueryRequestOptions . AllowOptimization ) ;
42+ parameterBindings = parameterBindings . Concat ( queryRequest . ParameterBindings ) ;
43+ }
4144
42- var parameterBindings = sqlSources . SelectMany ( p => p . Request . ParameterBindings ) ;
43- if ( extraBindings != null ) {
45+ if ( extraBindings != null ) {
4446 parameterBindings = parameterBindings . Concat ( extraBindings ) ;
4547 }
4648
47- var allowBatching = sqlSources
48- . Aggregate ( true , ( current , provider ) =>
49- current && provider . Request . CheckOptions ( QueryRequestOptions . AllowOptimization ) ) ;
5049 var tupleDescriptor = origin . Header . TupleDescriptor ;
5150
5251 var options = QueryRequestOptions . Empty ;
@@ -63,10 +62,7 @@ protected SqlProvider CreateProvider(SqlSelect statement, IEnumerable<QueryParam
6362 return new SqlProvider ( Handlers , request , origin , sources ) ;
6463 }
6564
66- protected virtual string ProcessAliasedName ( string name )
67- {
68- return name ;
69- }
65+ protected virtual string ProcessAliasedName ( string name ) => name ;
7066
7167 protected Pair < SqlExpression , IEnumerable < QueryParameterBinding > > ProcessExpression ( LambdaExpression le ,
7268 params IReadOnlyList < SqlExpression > [ ] sourceColumns )
@@ -101,22 +97,13 @@ protected SqlExpression ExtractColumnExpression(SqlColumn column)
10197 SqlExpression expression ;
10298 if ( IsColumnStub ( column ) ) {
10399 expression = stubColumnMap [ ExtractColumnStub ( column ) ] ;
104- var subQuery = expression as SqlSubQuery ;
105- if ( ! subQuery . IsNullReference ( ) ) {
106- var subSelect = subQuery . Query as SqlSelect ;
107- if ( subSelect != null ) {
108- if ( subSelect . Columns . Count == 1 && subSelect . From == null ) {
109- var userColumn = subSelect . Columns [ 0 ] as SqlUserColumn ;
110- if ( ! userColumn . IsNullReference ( ) ) {
111- var cast = userColumn . Expression as SqlCast ;
112- if ( ! cast . IsNullReference ( ) && cast . Type . Type == SqlType . Boolean ) {
113- var sqlCase = cast . Operand as SqlCase ;
114- if ( ! sqlCase . IsNullReference ( ) && sqlCase . Count == 1 ) {
115- var pair = sqlCase . First ( ) ;
116- var key = pair . Key as SqlUnary ;
117- if ( ! key . IsNullReference ( ) && pair . Value is SqlLiteral < int > )
118- expression = cast ;
119- }
100+ if ( expression is SqlSubQuery subQuery && subQuery . Query is SqlSelect subSelect && subSelect . From == null ) {
101+ if ( subSelect . Columns . Count == 1 && subSelect . Columns [ 0 ] is SqlUserColumn userColumn ) {
102+ if ( userColumn . Expression is SqlCast cast && cast . Type . Type == SqlType . Boolean ) {
103+ if ( cast . Operand is SqlCase sqlCase && sqlCase . Count == 1 ) {
104+ var pair = sqlCase . First ( ) ;
105+ if ( pair . Key is SqlUnary && pair . Value is SqlLiteral < int > ) {
106+ expression = cast ;
120107 }
121108 }
122109 }
@@ -127,8 +114,7 @@ protected SqlExpression ExtractColumnExpression(SqlColumn column)
127114 expression = column ;
128115 }
129116
130- var columnRef = expression as SqlColumnRef ;
131- if ( ! columnRef . IsNullReference ( ) ) {
117+ if ( expression is SqlColumnRef columnRef ) {
132118 expression = columnRef . SqlColumn ;
133119 }
134120
@@ -150,12 +136,10 @@ protected void AddInlinableColumn(IInlinableProvider provider, Column column,
150136 }
151137 }
152138
153- protected SqlExpression GetBooleanColumnExpression ( SqlExpression originalExpression )
154- {
155- return providerInfo . Supports ( ProviderFeatures . FullFeaturedBooleanExpressions )
139+ protected SqlExpression GetBooleanColumnExpression ( SqlExpression originalExpression ) =>
140+ providerInfo . Supports ( ProviderFeatures . FullFeaturedBooleanExpressions )
156141 ? originalExpression
157142 : booleanExpressionConverter . BooleanToInt ( originalExpression ) ;
158- }
159143
160144 protected QueryRequest CreateQueryRequest ( StorageDriver driver , SqlSelect statement ,
161145 IEnumerable < QueryParameterBinding > parameterBindings ,
@@ -173,8 +157,8 @@ private static bool IsCalculatedColumn(SqlColumn column)
173157 if ( column is SqlUserColumn ) {
174158 return true ;
175159 }
176- var cRef = column as SqlColumnRef ;
177- return cRef ? . SqlColumn is SqlUserColumn ;
160+
161+ return column is SqlColumnRef columnRef && columnRef . SqlColumn is SqlUserColumn ;
178162 }
179163
180164 private static bool IsColumnStub ( SqlColumn column )
@@ -183,38 +167,25 @@ private static bool IsColumnStub(SqlColumn column)
183167 return true ;
184168 }
185169
186- var cRef = column as SqlColumnRef ;
187- return cRef ? . SqlColumn is SqlColumnStub ;
170+ return column is SqlColumnRef columnRef && columnRef . SqlColumn is SqlColumnStub ;
188171 }
189172
190- private static SqlColumnStub ExtractColumnStub ( SqlColumn column )
191- {
192- switch ( column ) {
193- case SqlColumnStub columnStub :
194- return columnStub ;
195- case SqlColumnRef columnRef :
196- return ( SqlColumnStub ) columnRef . SqlColumn ;
197- default :
198- return ( SqlColumnStub ) column ;
199- }
200- }
173+ private static SqlColumnStub ExtractColumnStub ( SqlColumn column ) =>
174+ column switch {
175+ SqlColumnRef columnRef => ( SqlColumnStub ) columnRef . SqlColumn ,
176+ _ => ( SqlColumnStub ) column
177+ } ;
201178
202- private static SqlUserColumn ExtractUserColumn ( SqlColumn column )
203- {
204- switch ( column ) {
205- case SqlUserColumn userColumn :
206- return userColumn ;
207- case SqlColumnRef columnRef :
208- return ( SqlUserColumn ) columnRef . SqlColumn ;
209- default :
210- return ( SqlUserColumn ) column ;
211- }
212- }
179+ private static SqlUserColumn ExtractUserColumn ( SqlColumn column ) =>
180+ column switch {
181+ SqlColumnRef columnRef => ( SqlUserColumn ) columnRef . SqlColumn ,
182+ _ => ( SqlUserColumn ) column
183+ } ;
213184
214185 private static bool ShouldUseQueryReference ( CompilableProvider origin , SqlProvider compiledSource )
215186 {
216187 var sourceSelect = compiledSource . Request . Statement ;
217- if ( sourceSelect . From == null ) {
188+ if ( sourceSelect . From == null ) {
218189 return false ;
219190 }
220191
@@ -226,8 +197,10 @@ private static bool ShouldUseQueryReference(CompilableProvider origin, SqlProvid
226197 calculatedColumnIndexes . Add ( columnIndex ) ;
227198 rowNumberIsUsed = rowNumberIsUsed || ExtractUserColumn ( column ) . Expression is SqlRowNumber ;
228199 }
200+
229201 columnIndex ++ ;
230202 }
203+
231204 var containsCalculatedColumns = calculatedColumnIndexes . Count > 0 ;
232205 var pagingIsUsed = rowNumberIsUsed
233206 || ! sourceSelect . Limit . IsNullReference ( ) || ! sourceSelect . Offset . IsNullReference ( ) ;
@@ -260,7 +233,7 @@ private static bool ShouldUseQueryReference(CompilableProvider origin, SqlProvid
260233 return usedColumnIndexes . Any ( calculatedColumnIndexes . Contains ) ;
261234 }
262235 case ProviderType . Aggregate : {
263- var aggregateProvider = ( AggregateProvider ) origin ;
236+ var aggregateProvider = ( AggregateProvider ) origin ;
264237 var usedColumnIndexes = ( aggregateProvider . AggregateColumns ?? Enumerable . Empty < AggregateColumn > ( ) )
265238 . Select ( ac => ac . SourceIndex )
266239 . Concat ( aggregateProvider . GroupColumnIndexes ) ;
0 commit comments