diff --git a/Orm/Xtensive.Orm/Orm/Providers/Requests/ParameterBinding.cs b/Orm/Xtensive.Orm/Orm/Providers/Requests/ParameterBinding.cs index bd0d826de..4b0f120d3 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Requests/ParameterBinding.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Requests/ParameterBinding.cs @@ -20,10 +20,6 @@ public abstract class ParameterBinding public SqlExpression ParameterReference { get; } - public static IReadOnlyCollection NormalizeBindings(IEnumerable bindings) where T : ParameterBinding => - bindings != null ? new HashSet(bindings) : Array.Empty(); - - // Constructors protected ParameterBinding(TypeMapping typeMapping, ParameterTransmissionType transmissionType) diff --git a/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequest.cs b/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequest.cs index 5a1e8d76f..6ac2ec8f7 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequest.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequest.cs @@ -18,6 +18,8 @@ namespace Xtensive.Orm.Providers /// public sealed class PersistRequest { + private static readonly IReadOnlySet EmptyBindings = new HashSet(); + private readonly StorageDriver driver; private SqlCompilationResult compiledStatement; @@ -43,7 +45,7 @@ public void Prepare() // Constructors public PersistRequest( - StorageDriver driver, SqlStatement statement, IEnumerable parameterBindings) + StorageDriver driver, SqlStatement statement, IReadOnlySet parameterBindings) { ArgumentNullException.ThrowIfNull(driver); ArgumentNullException.ThrowIfNull(statement); @@ -54,7 +56,7 @@ public PersistRequest( this.driver = driver; Statement = statement; CompileUnit = compileUnit; - ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings); + ParameterBindings = parameterBindings ?? EmptyBindings; } } } diff --git a/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilder.cs b/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilder.cs index 255776f57..51603e326 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilder.cs @@ -70,7 +70,7 @@ protected virtual List BuildInsertRequest(in PersistRequestBuild var table = context.Mapping[index.ReflectedType]; var tableRef = SqlDml.TableRef(table); var query = SqlDml.Insert(tableRef); - var bindings = new List(); + var bindings = new HashSet(); var row = new Dictionary(index.Columns.Count); foreach (var column in index.Columns) { @@ -95,7 +95,7 @@ protected virtual List BuildUpdateRequest(in PersistRequestBuild var table = context.Mapping[index.ReflectedType]; var tableRef = SqlDml.TableRef(table); var query = SqlDml.Update(tableRef); - var bindings = new List(); + var bindings = new HashSet(); foreach (var column in index.Columns) { var fieldIndex = GetFieldIndex(context.Type, column); @@ -137,7 +137,7 @@ protected virtual List BuildRemoveRequest(in PersistRequestBuild var index = context.AffectedIndexes[i]; var tableRef = SqlDml.TableRef(context.Mapping[index.ReflectedType]); var query = SqlDml.Delete(tableRef); - var bindings = new List(); + var bindings = new HashSet(); query.Where = BuildKeyFilter(context, tableRef, bindings); if (context.Task.ValidateVersion) { query.Where &= BuildVersionFilter(context, tableRef, bindings); @@ -147,7 +147,7 @@ protected virtual List BuildRemoveRequest(in PersistRequestBuild return result; } - private SqlExpression BuildKeyFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, List currentBindings) + private SqlExpression BuildKeyFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, ISet currentBindings) { SqlExpression result = null; foreach (var column in context.PrimaryIndex.KeyColumns.Keys) { @@ -163,7 +163,7 @@ private SqlExpression BuildKeyFilter(in PersistRequestBuilderContext context, Sq return result; } - private SqlExpression BuildVersionFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, List currentBindings) + private SqlExpression BuildVersionFilter(in PersistRequestBuilderContext context, SqlTableRef filteredTable, ISet currentBindings) { SqlExpression result = null; foreach (var column in context.Type.GetVersionColumns()) { diff --git a/Orm/Xtensive.Orm/Orm/Providers/Requests/QueryRequest.cs b/Orm/Xtensive.Orm/Orm/Providers/Requests/QueryRequest.cs index 43b3cfe96..66b5953ea 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Requests/QueryRequest.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Requests/QueryRequest.cs @@ -4,10 +4,6 @@ // Created by: Dmitri Maximov // Created: 2008.08.22 -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; using Xtensive.Orm.Configuration; using Xtensive.Sql.Compiler; using Xtensive.Sql.Dml; @@ -20,16 +16,18 @@ namespace Xtensive.Orm.Providers /// public sealed class QueryRequest : IQueryRequest { + private static readonly IReadOnlySet EmptyBindings = new HashSet(); + private readonly StorageDriver driver; private DbDataReaderAccessor? accessor; private SqlCompilationResult compiledStatement; public SqlSelect Statement { get; private set; } - public IEnumerable ParameterBindings { get; private set; } + public IEnumerable ParameterBindings { get; } - public TupleDescriptor TupleDescriptor { get; private set; } - public QueryRequestOptions Options { get; private set; } + public TupleDescriptor TupleDescriptor { get; } + public QueryRequestOptions Options { get; } public NodeConfiguration NodeConfiguration { get; private set; } @@ -60,7 +58,7 @@ public DbDataReaderAccessor GetAccessor() => // Constructors public QueryRequest( - StorageDriver driver, SqlSelect statement, IEnumerable parameterBindings, + StorageDriver driver, SqlSelect statement, IReadOnlySet parameterBindings, TupleDescriptor tupleDescriptor, QueryRequestOptions options) { ArgumentNullException.ThrowIfNull(driver); @@ -69,13 +67,13 @@ public QueryRequest( this.driver = driver; Statement = statement; - ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings); + ParameterBindings = parameterBindings ?? EmptyBindings; TupleDescriptor = tupleDescriptor; Options = options; } public QueryRequest( - StorageDriver driver, SqlSelect statement, IEnumerable parameterBindings, + StorageDriver driver, SqlSelect statement, IReadOnlySet parameterBindings, TupleDescriptor tupleDescriptor, QueryRequestOptions options, NodeConfiguration nodeConfiguration) { ArgumentNullException.ThrowIfNull(driver); @@ -84,10 +82,10 @@ public QueryRequest( this.driver = driver; Statement = statement; - ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings); + ParameterBindings = parameterBindings ?? EmptyBindings; TupleDescriptor = tupleDescriptor; Options = options; NodeConfiguration = nodeConfiguration; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Providers/Requests/UserQueryRequest.cs b/Orm/Xtensive.Orm/Orm/Providers/Requests/UserQueryRequest.cs index 8a7c8e48e..f5508b9f1 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Requests/UserQueryRequest.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Requests/UserQueryRequest.cs @@ -4,8 +4,6 @@ // Created by: Denis Krjuchkov // Created: 2012.02.25 -using System.Collections.Generic; -using Xtensive.Core; using Xtensive.Sql.Compiler; namespace Xtensive.Orm.Providers @@ -19,17 +17,17 @@ public SqlCompilationResult GetCompiledStatement() return compiledStatement; } - public IEnumerable ParameterBindings { get; private set; } + public IEnumerable ParameterBindings { get; } // Constructors - public UserQueryRequest(SqlCompilationResult compiledStatement, IEnumerable parameterBindings) + public UserQueryRequest(SqlCompilationResult compiledStatement, IReadOnlySet parameterBindings) { ArgumentNullException.ThrowIfNull(compiledStatement); ArgumentNullException.ThrowIfNull(parameterBindings); this.compiledStatement = compiledStatement; - ParameterBindings = ParameterBinding.NormalizeBindings(parameterBindings); + ParameterBindings = parameterBindings; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs index 57fded2d9..e27a7ec43 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs @@ -36,11 +36,11 @@ protected SqlProvider CreateProvider(SqlSelect statement, IEnumerable(); + var parameterBindings = extraBindings?.ToHashSet() ?? new(); foreach (var provider in sources.OfType()) { var queryRequest = provider.Request; allowBatching &= queryRequest.CheckOptions(QueryRequestOptions.AllowOptimization); - parameterBindings = parameterBindings.Concat(queryRequest.ParameterBindings); + parameterBindings.UnionWith(queryRequest.ParameterBindings); } var tupleDescriptor = origin.Header.TupleDescriptor; @@ -136,7 +136,7 @@ protected SqlExpression GetBooleanColumnExpression(SqlExpression originalExpress : booleanExpressionConverter.BooleanToInt(originalExpression); protected QueryRequest CreateQueryRequest(StorageDriver driver, SqlSelect statement, - IEnumerable parameterBindings, + IReadOnlySet parameterBindings, TupleDescriptor tupleDescriptor, QueryRequestOptions options) { if (Handlers.Domain.Configuration.ShareStorageSchemaOverNodes) { diff --git a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Include.cs b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Include.cs index b3da1fa6f..4ad7b3d25 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Include.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Include.cs @@ -24,7 +24,7 @@ internal protected override SqlProvider VisitInclude(IncludeProvider provider) var source = Compile(provider.Source); var resultQuery = ExtractSqlSelect(provider, source); var sourceColumns = ExtractColumnExpressions(resultQuery); - var bindings = source.Request.ParameterBindings; + var bindings = source.Request.ParameterBindings.ToHashSet(); var filterDataSource = provider.FilterDataSource.CachingCompile(); var requestOptions = QueryRequestOptions.Empty; SqlExpression resultExpression; @@ -82,8 +82,8 @@ internal protected override SqlProvider VisitInclude(IncludeProvider provider) resultExpression = GetBooleanColumnExpression(resultExpression); var calculatedColumn = provider.Header.Columns[provider.Header.Length - 1]; AddInlinableColumn(provider, calculatedColumn, resultQuery, resultExpression); - if (extraBinding!=null) { - bindings = bindings.Append(extraBinding); + if (extraBinding != null) { + bindings.Add(extraBinding); } var request = CreateQueryRequest(Driver, resultQuery, bindings, provider.Header.TupleDescriptor, requestOptions); diff --git a/Orm/Xtensive.Orm/Orm/Providers/TemporaryTables/TemporaryTableManager.cs b/Orm/Xtensive.Orm/Orm/Providers/TemporaryTables/TemporaryTableManager.cs index 7d5199e8d..ed7d228cc 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/TemporaryTables/TemporaryTableManager.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/TemporaryTables/TemporaryTableManager.cs @@ -109,7 +109,7 @@ public TemporaryTableDescriptor BuildDescriptor(ModelMapping modelMapping, strin Lazy CreateLazyPersistRequest(ushort batchSize) { return new Lazy(() => { - var bindings = new List(batchSize); + var bindings = new HashSet(batchSize); var statement = MakeUpInsertQuery(tableRef, typeMappings, bindings, hasColumns, batchSize); var persistRequest = new PersistRequest(driver, statement, bindings); persistRequest.Prepare(); @@ -214,7 +214,7 @@ private SqlSelect MakeUpSelectQuery(SqlTableRef temporaryTable, bool hasColumns) } private SqlInsert MakeUpInsertQuery(SqlTableRef temporaryTable, - TypeMapping[] typeMappings, List storeRequestBindings, bool hasColumns, ushort rows = 1) + TypeMapping[] typeMappings, ISet storeRequestBindings, bool hasColumns, ushort rows = 1) { var insertStatement = SqlDml.Insert(temporaryTable); if (!hasColumns) { diff --git a/Orm/Xtensive.Orm/Orm/Services/QueryBuilding/QueryBuilder.cs b/Orm/Xtensive.Orm/Orm/Services/QueryBuilding/QueryBuilder.cs index 9ff63b12f..8844f421a 100644 --- a/Orm/Xtensive.Orm/Orm/Services/QueryBuilding/QueryBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Services/QueryBuilding/QueryBuilder.cs @@ -95,7 +95,7 @@ public QueryRequest CreateRequest(SqlCompilationResult compiledQuery, IEnumerabl return new QueryRequest(new UserQueryRequest( compiledQuery, - bindings.Select(b => b.RealBinding))); + bindings.Select(b => b.RealBinding).ToHashSet())); } /// diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs index 016ed510c..dcba4e003 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs @@ -109,12 +109,12 @@ private IPersistDescriptor CreateDescriptor(string tableName, var tableRef = SqlDml.TableRef(table); var insert = SqlDml.Insert(tableRef); - var bindings = new PersistParameterBinding[columns.Count]; + var bindings = new HashSet(columns.Count); var row = new Dictionary(columns.Count); for (ColNum i = 0; i < columns.Count; i++) { var binding = new PersistParameterBinding(mappings[i], i, transmissionTypes[i]); row.Add(tableRef.Columns[i], binding.ParameterReference); - bindings[i] = binding; + bindings.Add(binding); } insert.ValueRows.Add(row); diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs index d96c44d7c..948459825 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs @@ -19,8 +19,6 @@ public sealed class SqlCompilationResult private readonly IReadOnlyDictionary parameterNames; private volatile int lastResultLength; - private readonly TypeIdRegistry typeIdRegistry; - /// public override string ToString() { @@ -75,9 +73,7 @@ public string GetCommandText(SqlPostCompilerConfiguration configuration) // Constructors internal SqlCompilationResult(IReadOnlyList result, - IReadOnlyDictionary parameterNames, - TypeIdRegistry typeIdRegistry - ) + IReadOnlyDictionary parameterNames) { switch (result.Count) { case 0: @@ -91,7 +87,6 @@ TypeIdRegistry typeIdRegistry break; } this.parameterNames = parameterNames.Count > 0 ? parameterNames : null; - this.typeIdRegistry = typeIdRegistry; } } } diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs index afe06962e..dfc78a4ff 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs @@ -45,7 +45,7 @@ public SqlCompilationResult Compile(ISqlCompileUnit unit, SqlCompilerConfigurati configuration = compilerConfiguration; context = new SqlCompilerContext(configuration); unit.AcceptVisitor(this); - return new SqlCompilationResult(context.Output.Children, context.ParameterNameProvider.NameTable, typeIdRegistry); + return new SqlCompilationResult(context.Output.Children, context.ParameterNameProvider.NameTable); } #region Visitors diff --git a/Orm/Xtensive.Orm/Sql/SqlDriver.cs b/Orm/Xtensive.Orm/Sql/SqlDriver.cs index 051622255..76521d801 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDriver.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDriver.cs @@ -62,7 +62,7 @@ public abstract class SqlDriver public SqlCompilationResult Compile(ISqlCompileUnit statement) { ArgumentNullException.ThrowIfNull(statement); - return CreateCompiler().Compile(statement, new SqlCompilerConfiguration(), null); + return CreateCompiler().Compile(statement, new SqlCompilerConfiguration()); } /// @@ -77,7 +77,7 @@ public SqlCompilationResult Compile(ISqlCompileUnit statement, SqlCompilerConfig ArgumentNullException.ThrowIfNull(statement); ArgumentNullException.ThrowIfNull(configuration); ValidateCompilerConfiguration(configuration); - return CreateCompiler().Compile(statement, configuration, typeIdRegistry); + return CreateCompiler().Compile(statement, configuration); } ///