Skip to content

Commit 17ee758

Browse files
committed
Optimize PersistRequest constructor
1 parent b7bdc50 commit 17ee758

File tree

13 files changed

+38
-49
lines changed

13 files changed

+38
-49
lines changed

Orm/Xtensive.Orm/Orm/Providers/Requests/ParameterBinding.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@ public abstract class ParameterBinding
2020

2121
public SqlExpression ParameterReference { get; }
2222

23-
public static IReadOnlyCollection<T> NormalizeBindings<T>(IEnumerable<T> bindings) where T : ParameterBinding =>
24-
bindings != null ? new HashSet<T>(bindings) : Array.Empty<T>();
25-
26-
2723
// Constructors
2824

2925
protected ParameterBinding(TypeMapping typeMapping, ParameterTransmissionType transmissionType)

Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ namespace Xtensive.Orm.Providers
1818
/// </summary>
1919
public sealed class PersistRequest
2020
{
21+
private static readonly IReadOnlySet<PersistParameterBinding> EmptyBindings = new HashSet<PersistParameterBinding>();
22+
2123
private readonly StorageDriver driver;
2224

2325
private SqlCompilationResult compiledStatement;
@@ -43,7 +45,7 @@ public void Prepare()
4345
// Constructors
4446

4547
public PersistRequest(
46-
StorageDriver driver, SqlStatement statement, IEnumerable<PersistParameterBinding> parameterBindings)
48+
StorageDriver driver, SqlStatement statement, IReadOnlySet<PersistParameterBinding> parameterBindings)
4749
{
4850
ArgumentNullException.ThrowIfNull(driver);
4951
ArgumentNullException.ThrowIfNull(statement);
@@ -54,7 +56,7 @@ public PersistRequest(
5456
this.driver = driver;
5557
Statement = statement;
5658
CompileUnit = compileUnit;
57-
ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings);
59+
ParameterBindings = parameterBindings ?? EmptyBindings;
5860
}
5961
}
6062
}

Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilder.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ protected virtual List<PersistRequest> BuildInsertRequest(in PersistRequestBuild
7070
var table = context.Mapping[index.ReflectedType];
7171
var tableRef = SqlDml.TableRef(table);
7272
var query = SqlDml.Insert(tableRef);
73-
var bindings = new List<PersistParameterBinding>();
73+
var bindings = new HashSet<PersistParameterBinding>();
7474

7575
var row = new Dictionary<SqlColumn, SqlExpression>(index.Columns.Count);
7676
foreach (var column in index.Columns) {
@@ -95,7 +95,7 @@ protected virtual List<PersistRequest> BuildUpdateRequest(in PersistRequestBuild
9595
var table = context.Mapping[index.ReflectedType];
9696
var tableRef = SqlDml.TableRef(table);
9797
var query = SqlDml.Update(tableRef);
98-
var bindings = new List<PersistParameterBinding>();
98+
var bindings = new HashSet<PersistParameterBinding>();
9999

100100
foreach (var column in index.Columns) {
101101
var fieldIndex = GetFieldIndex(context.Type, column);
@@ -137,7 +137,7 @@ protected virtual List<PersistRequest> BuildRemoveRequest(in PersistRequestBuild
137137
var index = context.AffectedIndexes[i];
138138
var tableRef = SqlDml.TableRef(context.Mapping[index.ReflectedType]);
139139
var query = SqlDml.Delete(tableRef);
140-
var bindings = new List<PersistParameterBinding>();
140+
var bindings = new HashSet<PersistParameterBinding>();
141141
query.Where = BuildKeyFilter(context, tableRef, bindings);
142142
if (context.Task.ValidateVersion) {
143143
query.Where &= BuildVersionFilter(context, tableRef, bindings);
@@ -147,7 +147,7 @@ protected virtual List<PersistRequest> BuildRemoveRequest(in PersistRequestBuild
147147
return result;
148148
}
149149

150-
private SqlExpression BuildKeyFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, List<PersistParameterBinding> currentBindings)
150+
private SqlExpression BuildKeyFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, ISet<PersistParameterBinding> currentBindings)
151151
{
152152
SqlExpression result = null;
153153
foreach (var column in context.PrimaryIndex.KeyColumns.Keys) {
@@ -163,7 +163,7 @@ private SqlExpression BuildKeyFilter(in PersistRequestBuilderContext context, Sq
163163
return result;
164164
}
165165

166-
private SqlExpression BuildVersionFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, List<PersistParameterBinding> currentBindings)
166+
private SqlExpression BuildVersionFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, ISet<PersistParameterBinding> currentBindings)
167167
{
168168
SqlExpression result = null;
169169
foreach (var column in context.Type.GetVersionColumns()) {

Orm/Xtensive.Orm/Orm/Providers/Requests/QueryRequest.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
// Created by: Dmitri Maximov
55
// Created: 2008.08.22
66

7-
using System;
8-
using System.Collections.Generic;
9-
using System.Linq;
10-
using Xtensive.Core;
117
using Xtensive.Orm.Configuration;
128
using Xtensive.Sql.Compiler;
139
using Xtensive.Sql.Dml;
@@ -20,16 +16,18 @@ namespace Xtensive.Orm.Providers
2016
/// </summary>
2117
public sealed class QueryRequest : IQueryRequest
2218
{
19+
private static readonly IReadOnlySet<QueryParameterBinding> EmptyBindings = new HashSet<QueryParameterBinding>();
20+
2321
private readonly StorageDriver driver;
2422

2523
private DbDataReaderAccessor? accessor;
2624
private SqlCompilationResult compiledStatement;
2725

2826
public SqlSelect Statement { get; private set; }
29-
public IEnumerable<QueryParameterBinding> ParameterBindings { get; private set; }
27+
public IEnumerable<QueryParameterBinding> ParameterBindings { get; }
3028

31-
public TupleDescriptor TupleDescriptor { get; private set; }
32-
public QueryRequestOptions Options { get; private set; }
29+
public TupleDescriptor TupleDescriptor { get; }
30+
public QueryRequestOptions Options { get; }
3331

3432
public NodeConfiguration NodeConfiguration { get; private set; }
3533

@@ -60,7 +58,7 @@ public DbDataReaderAccessor GetAccessor() =>
6058
// Constructors
6159

6260
public QueryRequest(
63-
StorageDriver driver, SqlSelect statement, IEnumerable<QueryParameterBinding> parameterBindings,
61+
StorageDriver driver, SqlSelect statement, IReadOnlySet<QueryParameterBinding> parameterBindings,
6462
TupleDescriptor tupleDescriptor, QueryRequestOptions options)
6563
{
6664
ArgumentNullException.ThrowIfNull(driver);
@@ -69,13 +67,13 @@ public QueryRequest(
6967

7068
this.driver = driver;
7169
Statement = statement;
72-
ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings);
70+
ParameterBindings = parameterBindings ?? EmptyBindings;
7371
TupleDescriptor = tupleDescriptor;
7472
Options = options;
7573
}
7674

7775
public QueryRequest(
78-
StorageDriver driver, SqlSelect statement, IEnumerable<QueryParameterBinding> parameterBindings,
76+
StorageDriver driver, SqlSelect statement, IReadOnlySet<QueryParameterBinding> parameterBindings,
7977
TupleDescriptor tupleDescriptor, QueryRequestOptions options, NodeConfiguration nodeConfiguration)
8078
{
8179
ArgumentNullException.ThrowIfNull(driver);
@@ -84,10 +82,10 @@ public QueryRequest(
8482

8583
this.driver = driver;
8684
Statement = statement;
87-
ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings);
85+
ParameterBindings = parameterBindings ?? EmptyBindings;
8886
TupleDescriptor = tupleDescriptor;
8987
Options = options;
9088
NodeConfiguration = nodeConfiguration;
9189
}
9290
}
93-
}
91+
}

Orm/Xtensive.Orm/Orm/Providers/Requests/UserQueryRequest.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
// Created by: Denis Krjuchkov
55
// Created: 2012.02.25
66

7-
using System.Collections.Generic;
8-
using Xtensive.Core;
97
using Xtensive.Sql.Compiler;
108

119
namespace Xtensive.Orm.Providers
@@ -19,17 +17,17 @@ public SqlCompilationResult GetCompiledStatement()
1917
return compiledStatement;
2018
}
2119

22-
public IEnumerable<QueryParameterBinding> ParameterBindings { get; private set; }
20+
public IEnumerable<QueryParameterBinding> ParameterBindings { get; }
2321

2422
// Constructors
2523

26-
public UserQueryRequest(SqlCompilationResult compiledStatement, IEnumerable<QueryParameterBinding> parameterBindings)
24+
public UserQueryRequest(SqlCompilationResult compiledStatement, IReadOnlySet<QueryParameterBinding> parameterBindings)
2725
{
2826
ArgumentNullException.ThrowIfNull(compiledStatement);
2927
ArgumentNullException.ThrowIfNull(parameterBindings);
3028

3129
this.compiledStatement = compiledStatement;
32-
ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings);
30+
ParameterBindings = parameterBindings;
3331
}
3432
}
35-
}
33+
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ protected SqlProvider CreateProvider(SqlSelect statement, IEnumerable<QueryParam
3636
CompilableProvider origin, params ExecutableProvider[] sources)
3737
{
3838
var allowBatching = true;
39-
var parameterBindings = extraBindings ?? Enumerable.Empty<QueryParameterBinding>();
39+
var parameterBindings = extraBindings?.ToHashSet() ?? new();
4040
foreach (var provider in sources.OfType<SqlProvider>()) {
4141
var queryRequest = provider.Request;
4242
allowBatching &= queryRequest.CheckOptions(QueryRequestOptions.AllowOptimization);
43-
parameterBindings = parameterBindings.Concat(queryRequest.ParameterBindings);
43+
parameterBindings.UnionWith(queryRequest.ParameterBindings);
4444
}
4545

4646
var tupleDescriptor = origin.Header.TupleDescriptor;
@@ -136,7 +136,7 @@ protected SqlExpression GetBooleanColumnExpression(SqlExpression originalExpress
136136
: booleanExpressionConverter.BooleanToInt(originalExpression);
137137

138138
protected QueryRequest CreateQueryRequest(StorageDriver driver, SqlSelect statement,
139-
IEnumerable<QueryParameterBinding> parameterBindings,
139+
IReadOnlySet<QueryParameterBinding> parameterBindings,
140140
TupleDescriptor tupleDescriptor, QueryRequestOptions options)
141141
{
142142
if (Handlers.Domain.Configuration.ShareStorageSchemaOverNodes) {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal protected override SqlProvider VisitInclude(IncludeProvider provider)
2424
var source = Compile(provider.Source);
2525
var resultQuery = ExtractSqlSelect(provider, source);
2626
var sourceColumns = ExtractColumnExpressions(resultQuery);
27-
var bindings = source.Request.ParameterBindings;
27+
var bindings = source.Request.ParameterBindings.ToHashSet();
2828
var filterDataSource = provider.FilterDataSource.CachingCompile();
2929
var requestOptions = QueryRequestOptions.Empty;
3030
SqlExpression resultExpression;
@@ -82,8 +82,8 @@ internal protected override SqlProvider VisitInclude(IncludeProvider provider)
8282
resultExpression = GetBooleanColumnExpression(resultExpression);
8383
var calculatedColumn = provider.Header.Columns[provider.Header.Length - 1];
8484
AddInlinableColumn(provider, calculatedColumn, resultQuery, resultExpression);
85-
if (extraBinding!=null) {
86-
bindings = bindings.Append(extraBinding);
85+
if (extraBinding != null) {
86+
bindings.Add(extraBinding);
8787
}
8888

8989
var request = CreateQueryRequest(Driver, resultQuery, bindings, provider.Header.TupleDescriptor, requestOptions);

Orm/Xtensive.Orm/Orm/Providers/TemporaryTables/TemporaryTableManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public TemporaryTableDescriptor BuildDescriptor(ModelMapping modelMapping, strin
109109
Lazy<PersistRequest> CreateLazyPersistRequest(ushort batchSize)
110110
{
111111
return new Lazy<PersistRequest>(() => {
112-
var bindings = new List<PersistParameterBinding>(batchSize);
112+
var bindings = new HashSet<PersistParameterBinding>(batchSize);
113113
var statement = MakeUpInsertQuery(tableRef, typeMappings, bindings, hasColumns, batchSize);
114114
var persistRequest = new PersistRequest(driver, statement, bindings);
115115
persistRequest.Prepare();
@@ -214,7 +214,7 @@ private SqlSelect MakeUpSelectQuery(SqlTableRef temporaryTable, bool hasColumns)
214214
}
215215

216216
private SqlInsert MakeUpInsertQuery(SqlTableRef temporaryTable,
217-
TypeMapping[] typeMappings, List<PersistParameterBinding> storeRequestBindings, bool hasColumns, ushort rows = 1)
217+
TypeMapping[] typeMappings, ISet<PersistParameterBinding> storeRequestBindings, bool hasColumns, ushort rows = 1)
218218
{
219219
var insertStatement = SqlDml.Insert(temporaryTable);
220220
if (!hasColumns) {

Orm/Xtensive.Orm/Orm/Services/QueryBuilding/QueryBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public QueryRequest CreateRequest(SqlCompilationResult compiledQuery, IEnumerabl
9595

9696
return new QueryRequest(new UserQueryRequest(
9797
compiledQuery,
98-
bindings.Select(b => b.RealBinding)));
98+
bindings.Select(b => b.RealBinding).ToHashSet()));
9999
}
100100

101101
/// <summary>

Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@ private IPersistDescriptor CreateDescriptor(string tableName,
109109
var tableRef = SqlDml.TableRef(table);
110110

111111
var insert = SqlDml.Insert(tableRef);
112-
var bindings = new PersistParameterBinding[columns.Count];
112+
var bindings = new HashSet<PersistParameterBinding>(columns.Count);
113113
var row = new Dictionary<SqlColumn, SqlExpression>(columns.Count);
114114
for (ColNum i = 0; i < columns.Count; i++) {
115115
var binding = new PersistParameterBinding(mappings[i], i, transmissionTypes[i]);
116116
row.Add(tableRef.Columns[i], binding.ParameterReference);
117-
bindings[i] = binding;
117+
bindings.Add(binding);
118118
}
119119
insert.ValueRows.Add(row);
120120

0 commit comments

Comments
 (0)