From 3bf00b3db7bbfa2752b55a0fd281396b15ddf315 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Wed, 1 Sep 2021 03:58:58 -0700 Subject: [PATCH 1/2] Optimize TypeId accesssors --- .../Orm/Providers/SqlCompiler.Index.cs | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs index fb75cfa99e..03d6fd093f 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs @@ -5,6 +5,7 @@ // Created: 2009.11.13 using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -17,6 +18,7 @@ using Xtensive.Sql; using Xtensive.Sql.Dml; using IndexInfo = Xtensive.Orm.Model.IndexInfo; +using TypeMapping = Xtensive.Sql.TypeMapping; namespace Xtensive.Orm.Providers { @@ -39,6 +41,13 @@ public QueryAndBindings(SqlSelect initialQuery, List bind } } + private static readonly ConcurrentDictionary> typeIdParameterAccessorByTypeId = + new ConcurrentDictionary>(); + + private static readonly Func> AccessorFactory = typeId => _ => typeId; + + private TypeMapping int32typeMapping; + protected override SqlProvider VisitFreeText(FreeTextProvider provider) { throw new NotSupportedException(); @@ -249,20 +258,15 @@ private QueryAndBindings BuildFilteredQuery(IndexInfo index) SqlDml.Array(filterByTypes.Select(t => TypeIdRegistry[t]).ToArray(filterByTypes.Count))); } else { - var typeMapping = Driver.GetTypeMapping(WellKnownTypes.Int32); if (filterByTypes.Count == 1) { - var binding = new QueryParameterBinding(typeMapping, - CreateTypeIdAccessor(TypeIdRegistry[type]).CachingCompile(), - QueryParameterBindingType.Regular); + var binding = CreateQueryParameterBinding(type); bindings.Add(binding); filter = typeIdColumn == binding.ParameterReference; } else { var typeIdParameters = filterByTypes .Select(t => { - var binding = new QueryParameterBinding(typeMapping, - CreateTypeIdAccessor(TypeIdRegistry[t]).CachingCompile(), - QueryParameterBindingType.Regular); + var binding = CreateQueryParameterBinding(t); bindings.Add(binding); return binding.ParameterReference; }) @@ -308,8 +312,7 @@ private QueryAndBindings BuildTypedQuery(IndexInfo index) SqlUserColumn typeIdColumn; if (useParameterForTypeId) { - var typeMapping = Driver.GetTypeMapping(WellKnownTypes.Int32); - var binding = new QueryParameterBinding(typeMapping, CreateTypeIdAccessor(TypeIdRegistry[type]).CachingCompile(), QueryParameterBindingType.Regular); + var binding = CreateQueryParameterBinding(type); typeIdColumn = SqlDml.Column(binding.ParameterReference); bindings.Add(binding); @@ -352,11 +355,11 @@ private object GetDiscriminatorValue(TypeDiscriminatorMap discriminatorMap, obje : fieldValue; } - private Expression> CreateTypeIdAccessor(int value) - { - var bodyExpression = Expression.Convert(Expression.Constant(value),WellKnownTypes.Object); - var lambdaParemeter = Expression.Parameter(WellKnownOrmTypes.ParameterContext, "context"); - return (Expression>) FastExpression.Lambda(bodyExpression, lambdaParemeter); - } + private QueryParameterBinding CreateQueryParameterBinding(TypeInfo type) => + new QueryParameterBinding( + int32typeMapping ??= Driver.GetTypeMapping(WellKnownTypes.Int32), + typeIdParameterAccessorByTypeId.GetOrAdd(TypeIdRegistry[type], AccessorFactory), + QueryParameterBindingType.Regular + ); } } From 0cdd0e3e5c6f1796e665170ba03626292a3872ab Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Thu, 2 Sep 2021 00:15:08 -0700 Subject: [PATCH 2/2] name styling --- Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs index 03d6fd093f..2bdf4cd01a 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs @@ -41,12 +41,12 @@ public QueryAndBindings(SqlSelect initialQuery, List bind } } - private static readonly ConcurrentDictionary> typeIdParameterAccessorByTypeId = + private static readonly ConcurrentDictionary> typeIdParameterAccessorCache = new ConcurrentDictionary>(); private static readonly Func> AccessorFactory = typeId => _ => typeId; - private TypeMapping int32typeMapping; + private TypeMapping int32TypeMapping; protected override SqlProvider VisitFreeText(FreeTextProvider provider) { @@ -357,8 +357,8 @@ private object GetDiscriminatorValue(TypeDiscriminatorMap discriminatorMap, obje private QueryParameterBinding CreateQueryParameterBinding(TypeInfo type) => new QueryParameterBinding( - int32typeMapping ??= Driver.GetTypeMapping(WellKnownTypes.Int32), - typeIdParameterAccessorByTypeId.GetOrAdd(TypeIdRegistry[type], AccessorFactory), + int32TypeMapping ??= Driver.GetTypeMapping(WellKnownTypes.Int32), + typeIdParameterAccessorCache.GetOrAdd(TypeIdRegistry[type], AccessorFactory), QueryParameterBindingType.Regular ); }