Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ internal sealed partial class ExpressionProcessor : ExpressionVisitor<SqlExpress
private readonly StorageDriver driver;
private readonly BooleanExpressionConverter booleanExpressionConverter;
private readonly IMemberCompilerProvider<SqlExpression> memberCompilerProvider;
private readonly List<SqlExpression>[] sourceColumns;
private readonly IReadOnlyList<SqlExpression>[] sourceColumns;
private readonly ExpressionEvaluator evaluator;
private readonly ParameterExtractor parameterExtractor;
private readonly LambdaExpression lambda;
private readonly HashSet<QueryParameterBinding> bindings;
private readonly List<ParameterExpression> activeParameters;
private readonly Dictionary<ParameterExpression, List<SqlExpression>> sourceMapping;
private readonly Dictionary<ParameterExpression, IReadOnlyList<SqlExpression>> sourceMapping;
private readonly SqlCompiler compiler;

private readonly Dictionary<QueryParameterIdentity, QueryParameterBinding> bindingsWithIdentity
Expand Down Expand Up @@ -448,7 +448,7 @@ private SqlExpression TryUnwrapEnum(SqlContainer container)
// Constructors

public ExpressionProcessor(
LambdaExpression lambda, HandlerAccessor handlers, SqlCompiler compiler, params List<SqlExpression>[] sourceColumns)
LambdaExpression lambda, HandlerAccessor handlers, SqlCompiler compiler, params IReadOnlyList<SqlExpression>[] sourceColumns)
{
ArgumentValidator.EnsureArgumentNotNull(lambda, "lambda");
ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers");
Expand Down Expand Up @@ -478,7 +478,7 @@ public ExpressionProcessor(
throw Exceptions.InternalError(Strings.ExParametersCountIsNotSameAsSourceColumnListsCount, OrmLog.Instance);
if (sourceColumns.Any(list => list.Any(c => c.IsNullReference())))
throw Exceptions.InternalError(Strings.ExSourceColumnListContainsNullValues, OrmLog.Instance);
sourceMapping = new Dictionary<ParameterExpression, List<SqlExpression>>();
sourceMapping = new Dictionary<ParameterExpression, IReadOnlyList<SqlExpression>>();
}
}
}
13 changes: 7 additions & 6 deletions Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Apply.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,11 @@ private SqlSelect ProcessApplyViaSubqueries(ApplyProvider provider, SqlProvider
if (shouldUseQueryReference) {
var leftTable = left.PermanentReference;
query = SqlDml.Select(leftTable);
query.Columns.AddRange(leftTable.Columns.Cast<SqlColumn>());
query.Columns.AddRange(leftTable.Columns);
}
else
else {
query = left.Request.Statement.ShallowClone();
}

var isApplyExistence =
provider.Right.Type==ProviderType.Existence ||
Expand Down Expand Up @@ -166,15 +167,15 @@ private SqlSelect ProcessApplyViaCrossApply(ApplyProvider provider, SqlProvider
? left.PermanentReference
: left.Request.Statement.From;
var leftColumns = leftShouldUseReference
? leftTable.Columns.Cast<SqlColumn>()
? (IReadOnlyList<SqlColumn>) leftTable.Columns
: left.Request.Statement.Columns;

var rightShouldUseReference = ShouldUseQueryReference(provider, right);
var rightTable = rightShouldUseReference
? right.PermanentReference
: right.Request.Statement.From;
var rightColumns = rightShouldUseReference
? rightTable.Columns.Cast<SqlColumn>()
? (IReadOnlyList<SqlColumn>) rightTable.Columns
: right.Request.Statement.Columns;

var joinType = provider.ApplyType==JoinType.LeftOuter
Expand All @@ -185,8 +186,8 @@ private SqlSelect ProcessApplyViaCrossApply(ApplyProvider provider, SqlProvider
joinType,
leftTable,
rightTable,
leftColumns.ToList(),
rightColumns.ToList());
leftColumns,
rightColumns);

var query = SqlDml.Select(joinedTable);
if (!leftShouldUseReference)
Expand Down
4 changes: 2 additions & 2 deletions Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ protected virtual string ProcessAliasedName(string name)
}

protected Pair<SqlExpression, IEnumerable<QueryParameterBinding>> ProcessExpression(LambdaExpression le,
params List<SqlExpression>[] sourceColumns)
params IReadOnlyList<SqlExpression>[] sourceColumns)
{
var processor = new ExpressionProcessor(le, Handlers, this, sourceColumns);
var result = new Pair<SqlExpression, IEnumerable<QueryParameterBinding>>(
Expand All @@ -81,7 +81,7 @@ protected static SqlSelect ExtractSqlSelect(CompilableProvider origin, SqlProvid
if (ShouldUseQueryReference(origin, compiledSource)) {
var queryRef = compiledSource.PermanentReference;
var query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);
return query;
}
return sourceSelect.ShallowClone();
Expand Down
2 changes: 1 addition & 1 deletion Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private SqlSelect BuildUnionQuery(IndexInfo index)

var unionRef = SqlDml.QueryRef(result);
var query = SqlDml.Select(unionRef);
query.Columns.AddRange(unionRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(unionRef.Columns);
return query;
}

Expand Down
6 changes: 3 additions & 3 deletions Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Paging.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ private SqlProvider VisitSkipRowNumber(SkipProvider provider)
var source = compiledSource.Request.Statement;
var queryRef = SqlDml.QueryRef(source);
var query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);
query.Where = queryRef.Columns.Last() > skipParameterBinding.ParameterReference;
return CreateProvider(query, bindings, provider, compiledSource);
}
Expand All @@ -101,7 +101,7 @@ private SqlProvider VisitTakeRowNumber(TakeProvider provider)
var source = compiledSource.Request.Statement;
var queryRef = SqlDml.QueryRef(source);
var query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);
query.Where = queryRef.Columns.Last() <= takeParameterBinding.ParameterReference;
return CreateProvider(query, bindings, provider, compiledSource);
}
Expand All @@ -116,7 +116,7 @@ private SqlProvider VisitPagingRowNumber(PagingProvider provider)
var queryRef = SqlDml.QueryRef(source);
var query = SqlDml.Select(queryRef);
var rowNumberColumn = queryRef.Columns.Last();
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);
query.Where = SqlDml.Between(rowNumberColumn,
fromParameterBinding.ParameterReference,
toParameterBinding.ParameterReference);
Expand Down
50 changes: 30 additions & 20 deletions Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,12 @@ protected override SqlProvider VisitDistinct(DistinctProvider provider)
if (!sourceSelect.Limit.IsNullReference() || !sourceSelect.Offset.IsNullReference()) {
var queryRef = SqlDml.QueryRef(sourceSelect);
query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);
}
else
else {
query = sourceSelect.ShallowClone();
}

query.Distinct = true;
return CreateProvider(query, provider, source);
}
Expand Down Expand Up @@ -173,7 +175,7 @@ protected override SqlProvider VisitJoin(JoinProvider provider)
? left.PermanentReference
: left.Request.Statement.From;
var leftColumns = leftShouldUseReference
? leftTable.Columns.Cast<SqlColumn>()
? (IReadOnlyList<SqlColumn>) leftTable.Columns
: left.Request.Statement.Columns;
var leftExpressions = leftShouldUseReference
? leftTable.Columns.Cast<SqlExpression>().ToList()
Expand All @@ -184,7 +186,7 @@ protected override SqlProvider VisitJoin(JoinProvider provider)
? right.PermanentReference
: right.Request.Statement.From;
var rightColumns = rightShouldUseReference
? rightTable.Columns.Cast<SqlColumn>()
? (IReadOnlyList<SqlColumn>) rightTable.Columns
: right.Request.Statement.Columns;
var rightExpressions = rightShouldUseReference
? rightTable.Columns.Cast<SqlExpression>().ToList()
Expand All @@ -205,8 +207,8 @@ protected override SqlProvider VisitJoin(JoinProvider provider)
joinType,
leftTable,
rightTable,
leftColumns.ToList(),
rightColumns.ToList(),
leftColumns,
rightColumns,
joinExpression);

var query = SqlDml.Select(joinedTable);
Expand All @@ -229,21 +231,21 @@ protected override SqlProvider VisitPredicateJoin(PredicateJoinProvider provider
? left.PermanentReference
: left.Request.Statement.From;
var leftColumns = leftShouldUseReference
? leftTable.Columns.Cast<SqlColumn>()
? (IReadOnlyList<SqlColumn>) leftTable.Columns
: left.Request.Statement.Columns;
var leftExpressions = leftShouldUseReference
? leftTable.Columns.Cast<SqlExpression>().ToList()
? (IReadOnlyList<SqlExpression>) leftTable.Columns
: ExtractColumnExpressions(left.Request.Statement);

var rightShouldUseReference = ShouldUseQueryReference(provider, right);
var rightTable = rightShouldUseReference
? right.PermanentReference
: right.Request.Statement.From;
var rightColumns = rightShouldUseReference
? rightTable.Columns.Cast<SqlColumn>()
? (IReadOnlyList<SqlColumn>) rightTable.Columns
: right.Request.Statement.Columns;
var rightExpressions = rightShouldUseReference
? rightTable.Columns.Cast<SqlExpression>().ToList()
? (IReadOnlyList<SqlExpression>) rightTable.Columns
: ExtractColumnExpressions(right.Request.Statement);


Expand All @@ -257,8 +259,8 @@ protected override SqlProvider VisitPredicateJoin(PredicateJoinProvider provider
joinType,
leftTable,
rightTable,
leftColumns.ToList(),
rightColumns.ToList(),
leftColumns,
rightColumns,
joinExpression);

var query = SqlDml.Select(joinedTable);
Expand Down Expand Up @@ -308,10 +310,18 @@ protected override SqlProvider VisitSelect(SelectProvider provider)
{
var compiledSource = Compile(provider.Source);

SqlSelect query = ExtractSqlSelect(provider, compiledSource);
var originalColumns = query.Columns.ToList();
query.Columns.Clear();
query.Columns.AddRange(provider.ColumnIndexes.Select(i => originalColumns[i]));
var query = ExtractSqlSelect(provider, compiledSource);
var queryColumns = query.Columns;
var columnIndexes = provider.ColumnIndexes;

var newIndex = 0;
var newColumns = new SqlColumn[columnIndexes.Count];
foreach (var index in columnIndexes) {
newColumns[newIndex++] = queryColumns[index];
}

queryColumns.Clear();
queryColumns.AddRange(newColumns);

return CreateProvider(query, provider, compiledSource);
}
Expand Down Expand Up @@ -407,7 +417,7 @@ protected override SqlProvider VisitIntersect(IntersectProvider provider)
var queryRef = SqlDml.QueryRef(result);

SqlSelect query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);

return CreateProvider(query, provider, left, right);
}
Expand All @@ -431,7 +441,7 @@ protected override SqlProvider VisitExcept(ExceptProvider provider)
var result = SqlDml.Except(leftSelect, rightSelect);
var queryRef = SqlDml.QueryRef(result);
SqlSelect query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);

return CreateProvider(query, provider, left, right);
}
Expand All @@ -455,7 +465,7 @@ protected override SqlProvider VisitConcat(ConcatProvider provider)
var result = SqlDml.UnionAll(leftSelect, rightSelect);
var queryRef = SqlDml.QueryRef(result);
SqlSelect query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);

return CreateProvider(query, provider, left, right);
}
Expand All @@ -479,7 +489,7 @@ protected override SqlProvider VisitUnion(UnionProvider provider)
var result = SqlDml.Union(leftSelect, rightSelect);
var queryRef = SqlDml.QueryRef(result);
SqlSelect query = SqlDml.Select(queryRef);
query.Columns.AddRange(queryRef.Columns.Cast<SqlColumn>());
query.Columns.AddRange(queryRef.Columns);

return CreateProvider(query, provider, left, right);
}
Expand Down
Loading