Skip to content

Commit 435d1d3

Browse files
committed
Get rid of virtual method calls in the Provider descendant constructors
1 parent 98d418a commit 435d1d3

39 files changed

Lines changed: 319 additions & 502 deletions

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<IncludeSymbols Condition="$(GeneratePackageOnBuild) == 'true'">true</IncludeSymbols>
8383
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
8484
<EmbedUntrackedSources>true</EmbedUntrackedSources>
85-
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
85+
<ContinuousIntegrationBuild>false</ContinuousIntegrationBuild>
8686
</PropertyGroup>
8787

8888
<ItemGroup>

Orm/Xtensive.Orm/Orm/Providers/SqlIncludeProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ public SqlIncludeProvider(
9898
: base(handlers, request, tableDescriptor, origin, new []{source})
9999
{
100100
this.filterDataSource = filterDataSource;
101-
Initialize();
102101
}
103102
}
104103
}

Orm/Xtensive.Orm/Orm/Providers/SqlProvider.cs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,23 +92,6 @@ public SqlProvider(HandlerAccessor handlers, QueryRequest request,
9292
{
9393
this.handlers = handlers;
9494
Request = request;
95-
if (typeof (SqlProvider)==GetType())
96-
Initialize();
97-
}
98-
99-
/// <summary>
100-
/// Initializes a new instance of this class.
101-
/// </summary>
102-
/// <param name="provider">The provider.</param>
103-
/// <param name="permanentReference">The permanent reference.</param>
104-
public SqlProvider(SqlProvider provider, SqlTable permanentReference)
105-
: base(provider.Origin, provider.Sources.Cast<ExecutableProvider>().ToArray())
106-
{
107-
this.permanentReference = permanentReference;
108-
handlers = provider.handlers;
109-
Request = provider.Request;
110-
if (typeof (SqlProvider)==GetType())
111-
Initialize();
11295
}
11396
}
11497
}

Orm/Xtensive.Orm/Orm/Providers/SqlStoreProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public SqlStoreProvider(
5252
StoreProvider origin, ExecutableProvider source)
5353
: base(handlers, request, descriptor, origin, new[] {source})
5454
{
55-
Initialize();
5655
}
5756
}
5857
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/AggregateProvider.cs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,6 @@ public sealed class AggregateProvider : UnaryProvider
3131
/// </summary>
3232
public int[] GroupColumnIndexes { get; }
3333

34-
/// <inheritdoc/>
35-
protected override RecordSetHeader BuildHeader()
36-
{
37-
return Source.Header
38-
.Select(GroupColumnIndexes)
39-
.Add(AggregateColumns);
40-
}
41-
4234
/// <inheritdoc/>
4335
protected override string ParametersToString()
4436
{
@@ -160,6 +152,22 @@ private static NotSupportedException AggregateNotSupported(Type sourceColumnType
160152

161153
#endregion
162154

155+
private static RecordSetHeader BuildHeaderAndColumns(
156+
CompilableProvider source, ref int[] groupIndexes, AggregateColumnDescriptor[] columnDescriptors, out AggregateColumn[] aggregateColumns)
157+
{
158+
groupIndexes ??= Array.Empty<int>();
159+
aggregateColumns = new AggregateColumn[columnDescriptors.Length];
160+
var sourceHeader = source.Header;
161+
var sourceHeaderColumns = sourceHeader.Columns;
162+
for (int i = 0; i < columnDescriptors.Length; i++) {
163+
AggregateColumnDescriptor descriptor = columnDescriptors[i];
164+
var type = GetAggregateColumnType(sourceHeaderColumns[descriptor.SourceIndex].Type, descriptor.AggregateType);
165+
aggregateColumns[i] = new AggregateColumn(descriptor, groupIndexes.Length + i, type);
166+
}
167+
168+
return sourceHeader.Select(groupIndexes).Add(aggregateColumns);
169+
}
170+
163171
// Constructors
164172

165173
/// <summary>
@@ -169,18 +177,11 @@ private static NotSupportedException AggregateNotSupported(Type sourceColumnType
169177
/// <param name="columnDescriptors">The descriptors of <see cref="AggregateColumns"/>.</param>
170178
/// <param name="groupIndexes">The column indexes to group by.</param>
171179
public AggregateProvider(CompilableProvider source, int[] groupIndexes, params AggregateColumnDescriptor[] columnDescriptors)
172-
: base(ProviderType.Aggregate, source)
180+
: base(ProviderType.Aggregate, BuildHeaderAndColumns(source, ref groupIndexes, columnDescriptors, out var columns), source)
173181
{
174182
groupIndexes = groupIndexes ?? Array.Empty<int>();
175-
var columns = new AggregateColumn[columnDescriptors.Length];
176-
for (int i = 0; i < columnDescriptors.Length; i++) {
177-
AggregateColumnDescriptor descriptor = columnDescriptors[i];
178-
var type = GetAggregateColumnType(Source.Header.Columns[descriptor.SourceIndex].Type, descriptor.AggregateType);
179-
columns[i] = new AggregateColumn(descriptor, groupIndexes.Length + i, type);
180-
}
181183
AggregateColumns = columns;
182184
GroupColumnIndexes = groupIndexes;
183-
Initialize();
184185
}
185186
}
186187
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/AliasProvider.cs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,7 @@ public sealed class AliasProvider : UnaryProvider
2020
/// <summary>
2121
/// Alias of the result.
2222
/// </summary>
23-
public string Alias { get; private set; }
24-
25-
/// <inheritdoc/>
26-
protected override RecordSetHeader BuildHeader()
27-
{
28-
return base.BuildHeader().Alias(Alias);
29-
}
23+
public string Alias { get; }
3024

3125
/// <inheritdoc/>
3226
protected override string ParametersToString()
@@ -43,10 +37,9 @@ protected override string ParametersToString()
4337
/// <param name="source">The <see cref="UnaryProvider.Source"/> property value.</param>
4438
/// <param name="alias">The <see cref="Alias"/> property value.</param>
4539
public AliasProvider(CompilableProvider source, string alias)
46-
: base(ProviderType.Alias, source)
40+
: base(ProviderType.Alias, source.Header.Alias(alias), source)
4741
{
4842
Alias = alias;
49-
Initialize();
5043
}
5144
}
5245
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/ApplyProvider.cs

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,22 @@ public sealed class ApplyProvider : BinaryProvider,
2424
/// <summary>
2525
/// Gets the apply parameter.
2626
/// </summary>
27-
public ApplyParameter ApplyParameter { get; private set; }
27+
public ApplyParameter ApplyParameter { get; }
2828

2929
/// <summary>
3030
/// Gets a value indicating whether columns of this provider should be inlined.
3131
/// </summary>
32-
public bool IsInlined { get; private set; }
32+
public bool IsInlined { get; }
3333

3434
/// <summary>
3535
/// Gets apply type.
3636
/// </summary>
37-
public JoinType ApplyType { get; private set; }
37+
public JoinType ApplyType { get; }
3838

3939
/// <summary>
4040
/// Gets a value indicating whether applying of single or first row expected.
4141
/// </summary>
42-
public ApplySequenceType SequenceType { get; private set;}
43-
44-
/// <inheritdoc/>
45-
protected override RecordSetHeader BuildHeader()
46-
{
47-
switch (ApplyType) {
48-
case JoinType.Inner:
49-
case JoinType.LeftOuter:
50-
return base.BuildHeader();
51-
default:
52-
throw new ArgumentOutOfRangeException();
53-
}
54-
}
42+
public ApplySequenceType SequenceType { get; }
5543

5644
/// <inheritdoc/>
5745
protected override string ParametersToString()
@@ -77,11 +65,13 @@ public ApplyProvider(ApplyParameter applyParameter, CompilableProvider left, Com
7765
public ApplyProvider(ApplyParameter applyParameter, CompilableProvider left, CompilableProvider right, bool isInlined, ApplySequenceType applySequenceType, JoinType applyType)
7866
: base(ProviderType.Apply, left, right)
7967
{
68+
if (applyType is not JoinType.Inner and not JoinType.LeftOuter) {
69+
throw new ArgumentOutOfRangeException(nameof(applyType));
70+
}
8071
ApplyParameter = applyParameter;
8172
IsInlined = isInlined;
8273
SequenceType = applySequenceType;
8374
ApplyType = applyType;
84-
Initialize();
8575
}
8676
}
8777
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/BinaryProvider.cs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,12 @@ public abstract class BinaryProvider : CompilableProvider
2020
/// <summary>
2121
/// Left source.
2222
/// </summary>
23-
public CompilableProvider Left { get; private set; }
23+
public CompilableProvider Left { get; }
2424

2525
/// <summary>
2626
/// Right source.
2727
/// </summary>
28-
public CompilableProvider Right { get; private set; }
29-
30-
/// <inheritdoc/>
31-
protected override RecordSetHeader BuildHeader()
32-
{
33-
return Left.Header.Join(Right.Header);
34-
}
28+
public CompilableProvider Right { get; }
3529

3630

3731
// Constructors
@@ -41,12 +35,25 @@ protected override RecordSetHeader BuildHeader()
4135
/// </summary>
4236
/// <param name="type">The type of provider.</param>
4337
/// <param name="left">The <see cref="Left"/> provider.</param>
44-
/// <param name="right">The <see cref="Left"/> provider.</param>
38+
/// <param name="right">The <see cref="Right"/> provider.</param>
4539
protected BinaryProvider(ProviderType type, CompilableProvider left, CompilableProvider right)
46-
: base(type, left, right)
40+
: this(type, left.Header.Join(right.Header), left, right)
41+
{
42+
}
43+
44+
/// <summary>
45+
/// Initializes a new instance of this class.
46+
/// </summary>
47+
/// <param name="type">The type of provider.</param>
48+
/// <param name="header">The header of the resulting record set.</param>
49+
/// <param name="left">The <see cref="Left"/> provider.</param>
50+
/// <param name="right">The <see cref="Right"/> provider.</param>
51+
protected BinaryProvider(ProviderType type, RecordSetHeader header, CompilableProvider left, CompilableProvider right)
52+
: base(type, header, left, right)
4753
{
48-
ArgumentValidator.EnsureArgumentNotNull(left, "left");
49-
ArgumentValidator.EnsureArgumentNotNull(right, "right");
54+
ArgumentValidator.EnsureArgumentNotNull(header, nameof(header));
55+
ArgumentValidator.EnsureArgumentNotNull(left, nameof(left));
56+
ArgumentValidator.EnsureArgumentNotNull(right, nameof(right));
5057
Left = left;
5158
Right = right;
5259
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/CalculateProvider.cs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@ public class CalculateProvider : UnaryProvider,
2626
/// </summary>
2727
public CalculatedColumn[] CalculatedColumns { get; }
2828

29-
/// <inheritdoc/>
30-
protected override RecordSetHeader BuildHeader()
31-
{
32-
return Source.Header.Add(CalculatedColumns);
33-
}
34-
3529
/// <inheritdoc/>
3630
protected override string ParametersToString()
3731
{
@@ -41,6 +35,19 @@ protected override string ParametersToString()
4135

4236
// Constructors
4337

38+
private static RecordSetHeader BuildHeaderAndColumns(
39+
CompilableProvider source, CalculatedColumnDescriptor[] columnDescriptors, out CalculatedColumn[] calculatedColumns)
40+
{
41+
var sourceHeader = source.Header;
42+
var sourceHeaderLength = sourceHeader.Length;
43+
calculatedColumns = new CalculatedColumn[columnDescriptors.Length];
44+
for (int i = 0; i < columnDescriptors.Length; i++) {
45+
calculatedColumns[i] = new CalculatedColumn(columnDescriptors[i], sourceHeaderLength + i);
46+
}
47+
48+
return sourceHeader.Add(calculatedColumns);
49+
}
50+
4451
/// <summary>
4552
/// Initializes a new instance of this class.
4653
/// </summary>
@@ -58,16 +65,10 @@ public CalculateProvider(CompilableProvider source, params CalculatedColumnDescr
5865
/// <param name="isInlined">The <see cref="IsInlined"/> property value.</param>
5966
/// <param name="columnDescriptors">The descriptors of <see cref="CalculatedColumns"/>.</param>
6067
public CalculateProvider(CompilableProvider source, bool isInlined, params CalculatedColumnDescriptor[] columnDescriptors)
61-
: base(ProviderType.Calculate, source)
68+
: base(ProviderType.Calculate, BuildHeaderAndColumns(source, columnDescriptors, out var calculatedColumns), source)
6269
{
6370
IsInlined = isInlined;
64-
var sourceHeaderLength = Source.Header.Length;
65-
var columns = new CalculatedColumn[columnDescriptors.Length];
66-
for (int i = 0; i < columnDescriptors.Length; i++) {
67-
columns[i] = new CalculatedColumn(columnDescriptors[i], sourceHeaderLength + i);
68-
}
69-
CalculatedColumns = columns;
70-
Initialize();
71+
CalculatedColumns = calculatedColumns;
7172
}
7273
}
7374
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/ConcatProvider.cs

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66

77
using System;
88
using System.Collections.Generic;
9-
using Xtensive.Collections;
10-
11-
129
using System.Linq;
1310

1411
namespace Xtensive.Orm.Rse.Providers
@@ -20,58 +17,60 @@ namespace Xtensive.Orm.Rse.Providers
2017
[Serializable]
2118
public sealed class ConcatProvider : BinaryProvider
2219
{
23-
protected override RecordSetHeader BuildHeader()
20+
21+
22+
// Constructors
23+
24+
private static RecordSetHeader BuildHeader(CompilableProvider left, CompilableProvider right)
2425
{
25-
EnsureConcatIsPossible();
26+
var leftHeader = left.Header;
27+
var rightHeader = right.Header;
28+
EnsureConcatIsPossible(leftHeader, rightHeader);
2629
var mappedColumnIndexes = new List<int>();
2730
var columns = new List<Column>();
28-
for (int i = 0; i < Left.Header.Columns.Count; i++) {
29-
var leftColumn = Left.Header.Columns[i];
30-
var rightColumn = Right.Header.Columns[i];
31-
if (leftColumn is MappedColumn && rightColumn is MappedColumn) {
32-
var leftMappedColumn = (MappedColumn) leftColumn;
33-
var rightMappedColumn = (MappedColumn) rightColumn;
31+
for (int i = 0; i < leftHeader.Columns.Count; i++) {
32+
var leftColumn = leftHeader.Columns[i];
33+
var rightColumn = rightHeader.Columns[i];
34+
if (leftColumn is MappedColumn leftMappedColumn && rightColumn is MappedColumn rightMappedColumn) {
3435
if (leftMappedColumn.ColumnInfoRef.Equals(rightMappedColumn.ColumnInfoRef)) {
3536
columns.Add(leftMappedColumn);
3637
mappedColumnIndexes.Add(i);
37-
}
38-
else
38+
}
39+
else {
3940
columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
41+
}
4042
}
41-
else
43+
else {
4244
columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
45+
}
4346
}
44-
var columnGroups = Left.Header.ColumnGroups.Where(cg => cg.Keys.All(mappedColumnIndexes.Contains)).ToList();
47+
var columnGroups = leftHeader.ColumnGroups.Where(cg => cg.Keys.All(mappedColumnIndexes.Contains)).ToList();
4548

4649
return new RecordSetHeader(
47-
Left.Header.TupleDescriptor,
48-
columns,
50+
leftHeader.TupleDescriptor,
51+
columns,
4952
columnGroups,
5053
null,
5154
null);
5255
}
5356

54-
/// <exception cref="InvalidOperationException">Something went wrong.</exception>
55-
private void EnsureConcatIsPossible()
57+
private static void EnsureConcatIsPossible(RecordSetHeader leftHeader, RecordSetHeader rightHeader)
5658
{
57-
var left = Left.Header.TupleDescriptor;
58-
var right = Right.Header.TupleDescriptor;
59-
if (!left.Equals(right))
59+
var left = leftHeader.TupleDescriptor;
60+
var right = rightHeader.TupleDescriptor;
61+
if (!left.Equals(right)) {
6062
throw new InvalidOperationException(String.Format(Strings.ExXCantBeExecuted, "Concatenation"));
63+
}
6164
}
6265

63-
64-
// Constructors
65-
6666
/// <summary>
6767
/// Initializes a new instance of this class.
6868
/// </summary>
6969
/// <param name="left">The left provider to intersect.</param>
7070
/// <param name="right">The right provider to intersect.</param>
7171
public ConcatProvider(CompilableProvider left, CompilableProvider right)
72-
: base(ProviderType.Concat, left, right)
72+
: base(ProviderType.Concat, BuildHeader(left, right), left, right)
7373
{
74-
Initialize();
7574
}
7675
}
7776
}

0 commit comments

Comments
 (0)