Skip to content

Commit 387bbcb

Browse files
committed
SqlCompiler improvements
1 parent f51475a commit 387bbcb

12 files changed

Lines changed: 114 additions & 75 deletions

File tree

Orm/Xtensive.Orm/Modelling/Actions/CreateNodeAction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ protected override void PerformExecute(IModel model, IPathNode item)
102102
protected Node TryConstructor(IModel model, params object[] arguments)
103103
{
104104
if (parameters!=null)
105-
arguments = arguments.Concat(parameters.Select(p => PathNodeReference.Resolve(model, p))).ToArray();
106-
var argTypes = arguments.Select(a => a.GetType()).ToArray();
105+
arguments = arguments.Concat(parameters.Select(p => PathNodeReference.Resolve(model, p))).ToArray(arguments.Length + parameters.Length);
106+
var argTypes = arguments.SelectToArray(a => a.GetType());
107107
var ci = type.GetConstructor(argTypes);
108108
if (ci==null)
109109
return null;

Orm/Xtensive.Orm/Orm/Model/TypeDiscriminatorMap.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public object this[TypeInfo typeInfo]
6868
}
6969
}
7070

71+
public int Count => map.Count;
72+
7173
public void RegisterTypeMapping(TypeInfo type, object typeDiscriminatorValue)
7274
{
7375
this.EnsureNotLocked();

Orm/Xtensive.Orm/Orm/Providers/Expressions/ExpressionProcessor.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,10 @@ private enum ProcessorOptions
4848
private readonly ProviderInfo providerInfo;
4949
private readonly ProcessorOptions options;
5050

51-
private readonly List<ParameterExpression> activeParameters
52-
= new List<ParameterExpression>();
53-
private readonly Dictionary<ParameterExpression, IReadOnlyList<SqlExpression>> sourceMapping
54-
= new Dictionary<ParameterExpression, IReadOnlyList<SqlExpression>>();
55-
private readonly Dictionary<QueryParameterIdentity, QueryParameterBinding> bindingsWithIdentity
56-
= new Dictionary<QueryParameterIdentity, QueryParameterBinding>();
57-
private readonly List<QueryParameterBinding> otherBindings
58-
= new List<QueryParameterBinding>();
51+
private readonly List<ParameterExpression> activeParameters = new();
52+
private readonly Dictionary<ParameterExpression, IReadOnlyList<SqlExpression>> sourceMapping = new();
53+
private readonly Dictionary<QueryParameterIdentity, QueryParameterBinding> bindingsWithIdentity = new();
54+
private readonly List<QueryParameterBinding> otherBindings = new();
5955

6056
private bool executed;
6157

@@ -183,7 +179,7 @@ protected override SqlExpression VisitBinary(BinaryExpression expression)
183179
{
184180
// handle x.CompareTo(y) > 0 and similar comparisons
185181
var result = TryTranslateCompareExpression(expression);
186-
if (!result.IsNullReference()) {
182+
if (result is not null) {
187183
return result;
188184
}
189185

@@ -260,7 +256,7 @@ protected override SqlExpression VisitBinary(BinaryExpression expression)
260256

261257
// handle special cases
262258
result = TryTranslateBinaryExpressionSpecialCases(expression, left, right);
263-
if (!result.IsNullReference()) {
259+
if (result is not null) {
264260
return result;
265261
}
266262

@@ -353,7 +349,7 @@ protected override SqlExpression VisitConditional(ConditionalExpression expressi
353349
: check;
354350
var varCheck = boolCheck as SqlVariant;
355351

356-
if (!PreferCaseOverVariant && !varCheck.IsNullReference()) {
352+
if (!PreferCaseOverVariant && varCheck is not null) {
357353
return SqlDml.Variant(varCheck.Id, ifFalse, ifTrue);
358354
}
359355
var @case = SqlDml.Case();
@@ -401,7 +397,7 @@ protected override SqlExpression VisitMethodCall(MethodCallExpression mc)
401397
if (mc.AsTupleAccess(activeParameters) != null)
402398
return VisitTupleAccess(mc);
403399

404-
var arguments = mc.Arguments.Select(a => Visit(a)).ToArray();
400+
var arguments = mc.Arguments.SelectToArray(a => Visit(a));
405401
var mi = mc.Method;
406402

407403
if (mc.Object!=null && mc.Object.Type!=mi.ReflectedType)
@@ -434,7 +430,7 @@ protected override SqlExpression VisitLambda(LambdaExpression l)
434430
if (activeParameters.Count>0)
435431
throw new InvalidOperationException();
436432
activeParameters.AddRange(l.Parameters);
437-
for (int i = 0; i < l.Parameters.Count; i++) {
433+
for (int i = 0, count = l.Parameters.Count; i < count; i++) {
438434
var p = l.Parameters[i];
439435
sourceMapping[p] = sourceColumns[i];
440436
}
@@ -447,14 +443,14 @@ protected override SqlExpression VisitLambda(LambdaExpression l)
447443

448444
protected override SqlExpression VisitNew(NewExpression n)
449445
{
450-
return CompileMember(n.Constructor, null, n.Arguments.Select(a => Visit(a)).ToArray());
446+
return CompileMember(n.Constructor, null, n.Arguments.SelectToArray(a => Visit(a)));
451447
}
452448

453449
protected override SqlExpression VisitNewArray(NewArrayExpression expression)
454450
{
455451
if (expression.NodeType!=ExpressionType.NewArrayInit)
456452
throw new NotSupportedException();
457-
var expressions = expression.Expressions.Select(e => Visit(e)).ToArray();
453+
var expressions = expression.Expressions.SelectToArray(e => Visit(e));
458454
return SqlDml.Container(expressions);
459455
}
460456

@@ -496,7 +492,7 @@ public ExpressionProcessor(LambdaExpression lambda,
496492

497493
if (lambda.Parameters.Count != sourceColumns.Length)
498494
throw Exceptions.InternalError(Strings.ExParametersCountIsNotSameAsSourceColumnListsCount, OrmLog.Instance);
499-
if (sourceColumns.Any(list => list.Any(c => c.IsNullReference())))
495+
if (sourceColumns.Any(list => list.Any(c => c is null)))
500496
throw Exceptions.InternalError(Strings.ExSourceColumnListContainsNullValues, OrmLog.Instance);
501497

502498
this.compiler = compiler; // This might be null, check before use!

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Aggregate.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
using Xtensive.Sql.Dml;
1212
using Xtensive.Orm.Rse;
1313
using Xtensive.Orm.Rse.Providers;
14+
using Xtensive.Core;
1415

1516
namespace Xtensive.Orm.Providers
1617
{
17-
partial class SqlCompiler
18+
public partial class SqlCompiler
1819
{
1920
/// <inheritdoc/>
2021
protected override SqlProvider VisitAggregate(AggregateProvider provider)
@@ -27,10 +28,12 @@ protected override SqlProvider VisitAggregate(AggregateProvider provider)
2728
var columnNames = columns.Select((c, i) =>
2829
i >= sqlSelect.Columns.Count
2930
? sqlSelect.From.Columns[i].Name
30-
: sqlSelect.Columns[i].Name).ToList();
31+
: sqlSelect.Columns[i].Name).ToArray(columns.Count);
3132
sqlSelect.Columns.Clear();
3233

33-
for (int i = 0; i < provider.GroupColumnIndexes.Length; i++) {
34+
var groupColumnIndexes = provider.GroupColumnIndexes;
35+
sqlSelect.Columns.Capacity = groupColumnIndexes.Length + provider.AggregateColumns.Length;
36+
for (int i = 0, length = groupColumnIndexes.Length; i < length; i++) {
3437
var columnIndex = provider.GroupColumnIndexes[i];
3538
var column = columns[columnIndex];
3639
sqlSelect.GroupBy.Add(column);

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
namespace Xtensive.Orm.Providers
2121
{
22-
partial class SqlCompiler
22+
public partial class SqlCompiler
2323
{
2424
protected SqlProvider CreateProvider(SqlSelect statement,
2525
CompilableProvider origin, params ExecutableProvider[] sources) =>
@@ -207,7 +207,7 @@ private static bool ShouldUseQueryReference(CompilableProvider origin, SqlProvid
207207

208208
var containsCalculatedColumns = calculatedColumnIndexes.Count > 0;
209209
var pagingIsUsed = rowNumberIsUsed
210-
|| !sourceSelect.Limit.IsNullReference() || !sourceSelect.Offset.IsNullReference();
210+
|| sourceSelect.Limit is not null || sourceSelect.Offset is not null;
211211
var groupByIsUsed = sourceSelect.GroupBy.Count > 0;
212212
var distinctIsUsed = sourceSelect.Distinct;
213213
var filterIsUsed = !sourceSelect.Where.IsNullReference();

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Include.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
namespace Xtensive.Orm.Providers
1717
{
18-
partial class SqlCompiler
18+
public partial class SqlCompiler
1919
{
2020
/// <inheritdoc/>
2121
protected override SqlProvider VisitInclude(IncludeProvider provider)
@@ -90,12 +90,14 @@ protected SqlExpression CreateIncludeViaTemporaryTableExpression(
9090
out TemporaryTableDescriptor tableDescriptor)
9191
{
9292
var filterTupleDescriptor = provider.FilteredColumnsExtractionTransform.Descriptor;
93-
var filteredColumns = provider.FilteredColumns.Select(index => sourceColumns[index]).ToList();
93+
var filteredColumns = provider.FilteredColumns
94+
.Select(index => sourceColumns[index])
95+
.ToArray(provider.FilteredColumns.Count);
9496
tableDescriptor = DomainHandler.TemporaryTableManager
9597
.BuildDescriptor(Mapping, Guid.NewGuid().ToString(), filterTupleDescriptor);
9698
var filterQuery = tableDescriptor.QueryStatement.ShallowClone();
9799
var tableRef = filterQuery.From;
98-
for (int i = 0; i < filterTupleDescriptor.Count; i++)
100+
for (int i = 0, count = filterTupleDescriptor.Count; i < count; i++)
99101
filterQuery.Where &= filteredColumns[i]==tableRef[i];
100102
var resultExpression = SqlDml.Exists(filterQuery);
101103
return resultExpression;

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System;
88
using System.Collections.Generic;
99
using System.Linq;
10+
using Xtensive.Core;
1011
using Xtensive.Orm.Model;
1112
using Xtensive.Orm.Rse.Providers;
1213
using Xtensive.Sql;
@@ -15,18 +16,8 @@
1516

1617
namespace Xtensive.Orm.Providers
1718
{
18-
partial class SqlCompiler
19+
public partial class SqlCompiler
1920
{
20-
protected override SqlProvider VisitFreeText(FreeTextProvider provider)
21-
{
22-
throw new NotSupportedException();
23-
}
24-
25-
protected override SqlProvider VisitContainsTable(ContainsTableProvider provider)
26-
{
27-
throw new NotSupportedException();
28-
}
29-
3021
/// <inheritdoc/>
3122
protected override SqlProvider VisitIndex(IndexProvider provider)
3223
{
@@ -111,11 +102,11 @@ private SqlSelect BuildJoinQuery(IndexInfo index)
111102
var underlyingQueries = index.UnderlyingIndexes.Select(BuildProviderQuery);
112103

113104
var sourceTables = index.UnderlyingIndexes.Any(i => i.IsVirtual)
114-
? underlyingQueries.Select(SqlDml.QueryRef).Cast<SqlTable>().ToList()
105+
? underlyingQueries.Select(SqlDml.QueryRef).Cast<SqlTable>().ToList(index.UnderlyingIndexes.Count)
115106
: underlyingQueries.Select(q => {
116-
var tableRef = (SqlTableRef) q.From;
117-
return (SqlTable) SqlDml.TableRef(tableRef.DataTable, tableRef.Name, q.Columns.Select(c => c.Name));
118-
}).ToList();
107+
var tableRef = (SqlTableRef) q.From;
108+
return (SqlTable) SqlDml.TableRef(tableRef.DataTable, tableRef.Name, q.Columns.Select(c => c.Name));
109+
}).ToList(index.UnderlyingIndexes.Count);
119110

120111
foreach (var table in sourceTables) {
121112
if (resultTable==null)
@@ -124,7 +115,7 @@ private SqlSelect BuildJoinQuery(IndexInfo index)
124115
SqlExpression joinExpression = null;
125116
for (int i = 0; i < keyColumnCount; i++) {
126117
var binary = (table.Columns[i]==rootTable.Columns[i]);
127-
if (joinExpression.IsNullReference())
118+
if (joinExpression is null)
128119
joinExpression = binary;
129120
else
130121
joinExpression &= binary;
@@ -173,27 +164,27 @@ private SqlSelect BuildFilteredQuery(IndexInfo index)
173164
.Single().i;
174165
var discriminatorColumn = baseQuery.From.Columns[discriminatorColumnIndex];
175166
var containsDefault = filterByTypes.Contains(discriminatorMap.Default);
176-
var values = filterByTypes
177-
.Select(t => GetDiscriminatorValue(discriminatorMap, t.TypeDiscriminatorValue));
167+
178168
if (filterByTypes.Count == 1) {
179169
var discriminatorValue = GetDiscriminatorValue(discriminatorMap, filterByTypes.First().TypeDiscriminatorValue);
180170
filter = discriminatorColumn == SqlDml.Literal(discriminatorValue);
181171
}
182172
else {
173+
var values = filterByTypes
174+
.SelectToArray(t => GetDiscriminatorValue(discriminatorMap, t.TypeDiscriminatorValue));
183175
filter = SqlDml.In(discriminatorColumn, SqlDml.Array(values));
184176
if (containsDefault) {
185177
var allValues = discriminatorMap
186-
.Select(p => GetDiscriminatorValue(discriminatorMap, p.First));
178+
.Select(p => GetDiscriminatorValue(discriminatorMap, p.First)).ToArray(discriminatorMap.Count);
187179
filter |= SqlDml.NotIn(discriminatorColumn, SqlDml.Array(allValues));
188180
}
189181
}
190182
}
191183
else {
192184
var typeIdColumn = baseQuery.Columns[Handlers.Domain.Handlers.NameBuilder.TypeIdColumnName];
193-
var typeIds = filterByTypes.Select(t => TypeIdRegistry[t]).ToArray();
194185
filter = filterByTypes.Count == 1
195186
? typeIdColumn == TypeIdRegistry[filterByTypes.First()]
196-
: SqlDml.In(typeIdColumn, SqlDml.Array(typeIds));
187+
: SqlDml.In(typeIdColumn, SqlDml.Array(filterByTypes.SelectToArray(t=> TypeIdRegistry[t])));
197188
}
198189
var query = SqlDml.Select(baseQuery.From);
199190
query.Columns.AddRange(baseQuery.Columns);

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.NotSupported.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,24 @@
99

1010
namespace Xtensive.Orm.Providers
1111
{
12-
partial class SqlCompiler
12+
public partial class SqlCompiler
1313
{
1414
/// <inheritdoc/>
1515
protected override SqlProvider VisitRaw(RawProvider provider)
1616
{
1717
throw new NotSupportedException();
1818
}
19+
20+
/// <inheritdoc/>
21+
protected override SqlProvider VisitFreeText(FreeTextProvider provider)
22+
{
23+
throw new NotSupportedException();
24+
}
25+
26+
/// <inheritdoc/>
27+
protected override SqlProvider VisitContainsTable(ContainsTableProvider provider)
28+
{
29+
throw new NotSupportedException();
30+
}
1931
}
2032
}

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Paging.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
namespace Xtensive.Orm.Providers
1717
{
18-
partial class SqlCompiler
18+
public partial class SqlCompiler
1919
{
2020
/// <inheritdoc/>
2121
protected override SqlProvider VisitTake(TakeProvider provider)

0 commit comments

Comments
 (0)