Skip to content

Commit a811f76

Browse files
authored
Merge pull request #464 from DataObjects-NET/cached-correctors
Cached instances of correctors
2 parents e264d43 + f0d0b58 commit a811f76

File tree

4 files changed

+47
-31
lines changed

4 files changed

+47
-31
lines changed

Orm/Xtensive.Orm/Orm/Providers/DomainHandler.cs

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ namespace Xtensive.Orm.Providers
2222
/// </summary>
2323
public abstract class DomainHandler : DomainBoundHandler
2424
{
25-
private static readonly OrderingCorrector OrderingCorrector = new OrderingCorrector(ResolveOrderingDescriptor);
26-
2725
private Dictionary<Type, IMemberCompilerProvider> memberCompilerProviders;
2826

2927
/// <summary>
@@ -93,16 +91,20 @@ protected virtual IPreCompiler CreatePreCompiler(CompilerConfiguration configura
9391
{
9492
var providerInfo = Handlers.ProviderInfo;
9593

96-
var applyCorrector = new ApplyProviderCorrector(
97-
!providerInfo.Supports(ProviderFeatures.Apply));
98-
var skipTakeCorrector = new SkipTakeCorrector(
99-
providerInfo.Supports(ProviderFeatures.NativeTake),
100-
providerInfo.Supports(ProviderFeatures.NativeSkip));
94+
var applyCorrector = providerInfo.Supports(ProviderFeatures.Apply)
95+
? ApplyProviderCorrector.SilentCorrector
96+
: ApplyProviderCorrector.ExceptionThrowingCorrector;
97+
98+
var skipTakeCorrector = (providerInfo.Supports(ProviderFeatures.NativeTake | ProviderFeatures.NativeSkip))
99+
? SkipTakeCorrector.FullPaginationSupportCorrector
100+
: new SkipTakeCorrector(providerInfo.Supports(ProviderFeatures.NativeTake),
101+
providerInfo.Supports(ProviderFeatures.NativeSkip));
102+
101103
return new CompositePreCompiler(
102104
applyCorrector,
103105
skipTakeCorrector,
104106
RedundantColumnOptimizer.Instance,
105-
OrderingCorrector);
107+
OrderingCorrector.DefaultInstance);
106108
}
107109

108110
/// <summary>
@@ -194,29 +196,6 @@ private void BuildQueryPreprocessors()
194196
QueryPreprocessors = ordered ?? throw new InvalidOperationException(Strings.ExCyclicDependencyInQueryPreprocessorGraphIsDetected);
195197
}
196198

197-
private static ProviderOrderingDescriptor ResolveOrderingDescriptor(CompilableProvider provider)
198-
{
199-
var isOrderSensitive = provider.Type is ProviderType.Skip
200-
or ProviderType.Take
201-
or ProviderType.Seek
202-
or ProviderType.Paging
203-
or ProviderType.RowNumber;
204-
var preservesOrder = provider.Type is ProviderType.Skip
205-
or ProviderType.Take
206-
or ProviderType.Seek
207-
or ProviderType.Paging
208-
or ProviderType.RowNumber
209-
or ProviderType.Distinct
210-
or ProviderType.Alias;
211-
var isOrderBreaker = provider.Type is ProviderType.Except
212-
or ProviderType.Intersect
213-
or ProviderType.Union
214-
or ProviderType.Concat
215-
or ProviderType.Existence;
216-
var isSorter = provider.Type is ProviderType.Sort or ProviderType.Index;
217-
return new ProviderOrderingDescriptor(isOrderSensitive, preservesOrder, isOrderBreaker, isSorter);
218-
}
219-
220199
#endregion
221200

222201

Orm/Xtensive.Orm/Orm/Rse/Transformation/ApplyProviderCorrector.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ namespace Xtensive.Orm.Rse.Transformation
1515
/// </summary>
1616
public sealed class ApplyProviderCorrector : IPreCompiler
1717
{
18+
public static ApplyProviderCorrector ExceptionThrowingCorrector { get; } = new ApplyProviderCorrector(true);
19+
public static ApplyProviderCorrector SilentCorrector { get; } = new ApplyProviderCorrector(false);
20+
21+
1822
private readonly bool throwOnCorrectionFault;
1923

2024
/// <inheritdoc/>

Orm/Xtensive.Orm/Orm/Rse/Transformation/OrderingCorrector.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ namespace Xtensive.Orm.Rse.Transformation
1818
[Serializable]
1919
public sealed class OrderingCorrector : IPreCompiler
2020
{
21+
public static OrderingCorrector DefaultInstance { get; } = new OrderingCorrector();
22+
23+
2124
private readonly Func<CompilableProvider, ProviderOrderingDescriptor> orderingDescriptorResolver;
2225

2326
/// <inheritdoc/>
@@ -26,6 +29,29 @@ CompilableProvider IPreCompiler.Process(CompilableProvider rootProvider)
2629
return OrderingRewriter.Rewrite(rootProvider, orderingDescriptorResolver);
2730
}
2831

32+
private static ProviderOrderingDescriptor ResolveOrderingDescriptor(CompilableProvider provider)
33+
{
34+
var isOrderSensitive = provider.Type is ProviderType.Skip
35+
or ProviderType.Take
36+
or ProviderType.Seek
37+
or ProviderType.Paging
38+
or ProviderType.RowNumber;
39+
var preservesOrder = provider.Type is ProviderType.Skip
40+
or ProviderType.Take
41+
or ProviderType.Seek
42+
or ProviderType.Paging
43+
or ProviderType.RowNumber
44+
or ProviderType.Distinct
45+
or ProviderType.Alias;
46+
var isOrderBreaker = provider.Type is ProviderType.Except
47+
or ProviderType.Intersect
48+
or ProviderType.Union
49+
or ProviderType.Concat
50+
or ProviderType.Existence;
51+
var isSorter = provider.Type is ProviderType.Sort or ProviderType.Index;
52+
return new ProviderOrderingDescriptor(isOrderSensitive, preservesOrder, isOrderBreaker, isSorter);
53+
}
54+
2955

3056
// Constructors
3157

@@ -38,5 +64,10 @@ public OrderingCorrector(Func<CompilableProvider, ProviderOrderingDescriptor> or
3864
{
3965
this.orderingDescriptorResolver = orderingDescriptorResolver ?? throw new ArgumentNullException(nameof(orderingDescriptorResolver));
4066
}
67+
68+
private OrderingCorrector()
69+
{
70+
this.orderingDescriptorResolver = ResolveOrderingDescriptor;
71+
}
4172
}
4273
}

Orm/Xtensive.Orm/Orm/Rse/Transformation/SkipTakeCorrector.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ namespace Xtensive.Orm.Rse.Transformation
1616
[Serializable]
1717
public sealed class SkipTakeCorrector : IPreCompiler
1818
{
19+
public static SkipTakeCorrector FullPaginationSupportCorrector { get; } = new(true, true);
20+
1921
private readonly bool takeSupported;
2022
private readonly bool skipSupported;
2123

0 commit comments

Comments
 (0)