Skip to content

Commit 3bdded4

Browse files
committed
Revert "Caching IPreCompiler wrappers for rewriters"
This reverts commit 63ebab5.
1 parent 8cdffe7 commit 3bdded4

4 files changed

Lines changed: 35 additions & 77 deletions

File tree

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

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

2729
/// <summary>
@@ -91,13 +93,16 @@ protected virtual IPreCompiler CreatePreCompiler(CompilerConfiguration configura
9193
{
9294
var providerInfo = Handlers.ProviderInfo;
9395

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));
94101
return new CompositePreCompiler(
95-
ApplyProviderCorrector.GetOrCreate(!providerInfo.Supports(ProviderFeatures.Apply)),
96-
SkipTakeCorrector.GetOrCreate(
97-
providerInfo.Supports(ProviderFeatures.NativeTake),
98-
providerInfo.Supports(ProviderFeatures.NativeSkip)),
102+
applyCorrector,
103+
skipTakeCorrector,
99104
RedundantColumnOptimizer.Instance,
100-
OrderingCorrector.DefaultResolverInstance);
105+
OrderingCorrector);
101106
}
102107

103108
/// <summary>
@@ -189,6 +194,29 @@ private void BuildQueryPreprocessors()
189194
QueryPreprocessors = ordered ?? throw new InvalidOperationException(Strings.ExCyclicDependencyInQueryPreprocessorGraphIsDetected);
190195
}
191196

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+
192220
#endregion
193221

194222

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,8 @@ namespace Xtensive.Orm.Rse.Transformation
1515
/// </summary>
1616
public sealed class ApplyProviderCorrector : IPreCompiler
1717
{
18-
private static readonly Lazy<ApplyProviderCorrector> exceptionThrowingCorrector = new(() => new ApplyProviderCorrector(true));
19-
private static readonly Lazy<ApplyProviderCorrector> silentCorrector = new(() => new ApplyProviderCorrector(false));
20-
2118
private readonly bool throwOnCorrectionFault;
2219

23-
/// <summary>
24-
/// Gets existing instance or creates new one and cache it.
25-
/// </summary>
26-
/// <param name="throwOnCorrectionFault">if set to <see langword="true"/>
27-
/// then <see cref="InvalidOperationException"/> will be thrown in case of
28-
/// the correction's fault; otherwise the origin <see cref="CompilableProvider"/>
29-
/// will be returned.</param>
30-
public static ApplyProviderCorrector GetOrCreate(bool throwOnCorrectionFault) =>
31-
(throwOnCorrectionFault)
32-
? exceptionThrowingCorrector.Value
33-
: silentCorrector.Value;
34-
35-
3620
/// <inheritdoc/>
3721
public CompilableProvider Process(CompilableProvider rootProvider)
3822
{
@@ -49,7 +33,7 @@ public CompilableProvider Process(CompilableProvider rootProvider)
4933
/// then <see cref="InvalidOperationException"/> will be thrown in case of
5034
/// the correction's fault; otherwise the origin <see cref="CompilableProvider"/>
5135
/// will be returned.</param>
52-
private ApplyProviderCorrector(bool throwOnCorrectionFault)
36+
public ApplyProviderCorrector(bool throwOnCorrectionFault)
5337
{
5438
this.throwOnCorrectionFault = throwOnCorrectionFault;
5539
}

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

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

2523
/// <inheritdoc/>
@@ -28,28 +26,6 @@ CompilableProvider IPreCompiler.Process(CompilableProvider rootProvider)
2826
return OrderingRewriter.Rewrite(rootProvider, orderingDescriptorResolver);
2927
}
3028

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

5430
// Constructors
5531

@@ -62,13 +38,5 @@ public OrderingCorrector(Func<CompilableProvider, ProviderOrderingDescriptor> or
6238
{
6339
this.orderingDescriptorResolver = orderingDescriptorResolver ?? throw new ArgumentNullException(nameof(orderingDescriptorResolver));
6440
}
65-
66-
/// <summary>
67-
/// Initializes a new instance of this class with default resolver
68-
/// </summary>
69-
public OrderingCorrector()
70-
{
71-
this.orderingDescriptorResolver = ResolveOrderingDescriptor;
72-
}
7341
}
7442
}

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

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,9 @@ namespace Xtensive.Orm.Rse.Transformation
1616
[Serializable]
1717
public sealed class SkipTakeCorrector : IPreCompiler
1818
{
19-
private static readonly Lazy<SkipTakeCorrector> fullPagingSupport = new(() => new SkipTakeCorrector(true, true));
20-
private static readonly Lazy<SkipTakeCorrector> takeOnlySupport = new(() => new SkipTakeCorrector(true, false));
21-
private static readonly Lazy<SkipTakeCorrector> skipOnlySupport = new(() => new SkipTakeCorrector(false, true));
22-
private static readonly Lazy<SkipTakeCorrector> noPagingSupport = new(() => new SkipTakeCorrector(false, false));
23-
2419
private readonly bool takeSupported;
2520
private readonly bool skipSupported;
2621

27-
28-
/// <summary>
29-
/// Gets cached instance of create and cache new one
30-
/// </summary>
31-
/// <param name="takeSupported">Take operation is supported.</param>
32-
/// <param name="skipSupported">Skip operation is supported.</param>
33-
/// <returns>Cached instance of corrector.</returns>
34-
public static SkipTakeCorrector GetOrCreate(bool takeSupported, bool skipSupported)
35-
{
36-
return (takeSupported, skipSupported) switch {
37-
(true, true) => fullPagingSupport.Value,
38-
(false, true) => skipOnlySupport.Value,
39-
(true, false) => takeOnlySupport.Value,
40-
(false, false) => noPagingSupport.Value
41-
};
42-
}
43-
4422
/// <inheritdoc/>
4523
CompilableProvider IPreCompiler.Process(CompilableProvider rootProvider)
4624
{
@@ -50,7 +28,7 @@ CompilableProvider IPreCompiler.Process(CompilableProvider rootProvider)
5028

5129
// Constructors
5230

53-
private SkipTakeCorrector(bool takeSupported, bool skipSupported)
31+
public SkipTakeCorrector(bool takeSupported, bool skipSupported)
5432
{
5533
this.takeSupported = takeSupported;
5634
this.skipSupported = skipSupported;

0 commit comments

Comments
 (0)