Skip to content

Commit b2c61f5

Browse files
committed
Get rid of custom Copy methods for arrays. Plus this eliminates creation of unnecessary array copies.
# Conflicts: # Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/IncludeProvider.cs
1 parent 4bb2ba0 commit b2c61f5

22 files changed

Lines changed: 132 additions & 118 deletions

Orm/Xtensive.Orm/Collections/ThreadSafeList.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public void SetValue(int index, TItem item)
137137
length *= 2;
138138
}
139139
TItem[] tmp = new TItem[length];
140-
implementation.Copy(tmp, 0);
140+
implementation.CopyTo(tmp, 0);
141141
tmp[index] = item;
142142
Thread.MemoryBarrier(); // Ensures item and tmp are fully written
143143
implementation = tmp;

Orm/Xtensive.Orm/Comparison/ComparisonRules.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
// Created: 2008.02.04
66

77
using System;
8+
using System.Collections.Generic;
89
using System.Diagnostics;
910
using System.Text;
10-
using Xtensive.Collections;
1111
using Xtensive.Core;
1212

1313

@@ -142,10 +142,9 @@ public Direction GetDefaultRuleDirection(int index)
142142
/// Gets a copy of internal array of composite rules
143143
/// that are used to order composite values.
144144
/// </summary>
145-
public ComparisonRules[] Composite {
146-
get {
147-
return composite.Copy();
148-
}
145+
public IReadOnlyList<ComparisonRules> Composite {
146+
[DebuggerStepThrough]
147+
get => Array.AsReadOnly(composite);
149148
}
150149

151150
/// <summary>

Orm/Xtensive.Orm/Core/Extensions/ArrayExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ public static class ArrayExtensions
2525
/// <typeparam name="TItem">The type of array items.</typeparam>
2626
/// <param name="source">Array to clone.</param>
2727
/// <returns>An array containing all the items from the <paramref name="source"/>.</returns>
28+
[Obsolete]
2829
public static TItem[] Copy<TItem>(this TItem[] source)
2930
{
3031
var items = new TItem[source.Length];
31-
source.Copy(items, 0);
32+
source.CopyTo(items, 0);
3233
return items;
3334
}
3435

@@ -43,6 +44,7 @@ public static TItem[] Copy<TItem>(this TItem[] source)
4344
/// <param name="targetIndex">Index in <paramref name="target"/> array to start from.</param>
4445
/// <exception cref="ArgumentOutOfRangeException"><paramref name="targetIndex"/> is out of range.</exception>
4546
/// <exception cref="ArgumentException"><paramref name="target"/> array is too small.</exception>
47+
[Obsolete]
4648
public static void Copy<TItem>(this TItem[] source, TItem[] target, int targetIndex)
4749
{
4850
ArgumentValidator.EnsureArgumentNotNull(source, "source");

Orm/Xtensive.Orm/Core/Extensions/ListExtensions.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using System;
99
using System.Collections;
1010
using System.Collections.Generic;
11-
using Xtensive.Core;
1211

1312

1413
namespace Xtensive.Core
@@ -18,6 +17,18 @@ namespace Xtensive.Core
1817
/// </summary>
1918
public static class ListExtensions
2019
{
20+
public static int IndexOf<T>(this IReadOnlyList<T> list, T item)
21+
{
22+
var comparer = EqualityComparer<T>.Default;
23+
for (int index = 0, count = list.Count; index < count; index++) {
24+
if (comparer.Equals(list[index], item)) {
25+
return index;
26+
}
27+
}
28+
29+
return -1;
30+
}
31+
2132
#region Copy methods
2233

2334
/// <summary>

Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntityGroupTask.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System;
88
using System.Collections.Generic;
99
using System.Linq;
10-
using Xtensive.Collections;
1110
using Xtensive.Core;
1211
using Xtensive.Orm.Model;
1312
using Xtensive.Orm.Rse;
@@ -167,12 +166,15 @@ private static CompilableProvider CreateRecordSet(object cachingKey)
167166
{
168167
var pair = (Pair<object, CacheKey>) cachingKey;
169168
var selectedColumnIndexes = pair.Second.ColumnIndexes;
170-
var keyColumnIndexes = EnumerableUtils.Unfold(0, i => i + 1)
171-
.Take(pair.Second.Type.Indexes.PrimaryIndex.KeyColumns.Count).ToArray();
172-
var columnCollectionLenght = pair.Second.Type.Indexes.PrimaryIndex.Columns.Count;
169+
var keyColumnsCount = pair.Second.Type.Indexes.PrimaryIndex.KeyColumns.Count;
170+
var keyColumnIndexes = new int[keyColumnsCount];
171+
foreach (var index in Enumerable.Range(0, keyColumnsCount)) {
172+
keyColumnIndexes[index] = index;
173+
}
174+
var columnCollectionLength = pair.Second.Type.Indexes.PrimaryIndex.Columns.Count;
173175
return pair.Second.Type.Indexes.PrimaryIndex.GetQuery().Include(IncludeAlgorithm.ComplexCondition,
174-
true, () => includeParameter.Value, String.Format("includeColumnName-{0}", Guid.NewGuid()),
175-
keyColumnIndexes).Filter(t => t.GetValue<bool>(columnCollectionLenght)).Select(selectedColumnIndexes);
176+
true, () => includeParameter.Value, $"includeColumnName-{Guid.NewGuid()}",
177+
keyColumnIndexes).Filter(t => t.GetValue<bool>(columnCollectionLength)).Select(selectedColumnIndexes);
176178
}
177179

178180
private void PutLoadedStatesInCache(IEnumerable<Tuple> queryResult, RecordSetReader reader,

Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// Created: 2009.02.27
66

77
using System;
8-
using System.Collections;
98
using System.Collections.Generic;
109
using System.Linq;
1110
using System.Linq.Expressions;
@@ -1306,7 +1305,7 @@ private Expression VisitExistsAsInclude(Expression source, LambdaExpression pred
13061305
predicateLambda.Body, predicateLambda.Parameters[0], filteredTuple, filterColumnCount);
13071306

13081307
// Mapping from filter data column to filtered column
1309-
var filteredColumns = Enumerable.Repeat(-1, filterColumnCount).ToArray();
1308+
var filteredColumns = new int[filterColumnCount];
13101309
for (int i = 0; i < filterColumnCount; i++) {
13111310
var mapping = filteredColumnMappings[i];
13121311
if (mapping.ColumnIndex >= 0)

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using System.Collections.Generic;
99
using System.Diagnostics;
1010
using System.Linq.Expressions;
11-
using Xtensive.Collections;
1211
using Xtensive.Core;
1312

1413
using Xtensive.Tuples;
@@ -27,8 +26,6 @@ namespace Xtensive.Orm.Rse.Providers
2726
public sealed class IncludeProvider: UnaryProvider,
2827
IInlinableProvider
2928
{
30-
private readonly int[] filteredColumns;
31-
3229
/// <summary>
3330
/// Gets a value indicating whether result column should be inlined.
3431
/// </summary>
@@ -40,18 +37,15 @@ public sealed class IncludeProvider: UnaryProvider,
4037
public string ResultColumnName { get; private set; }
4138

4239
/// <summary>
43-
/// Gets the algorithm that performes filtering.
40+
/// Gets the algorithm that performs filtering.
4441
/// For non-SQL storages value of this field has no effect.
4542
/// </summary>
4643
public IncludeAlgorithm Algorithm { get; private set; }
4744

4845
/// <summary>
4946
/// Gets the filtered columns.
5047
/// </summary>
51-
public int[] FilteredColumns {
52-
[DebuggerStepThrough]
53-
get { return filteredColumns.Copy(); }
54-
}
48+
public IReadOnlyList<int> FilteredColumns { [DebuggerStepThrough] get; }
5549

5650
/// <summary>
5751
/// Gets filter data.
@@ -66,9 +60,13 @@ public int[] FilteredColumns {
6660
protected override RecordSetHeader BuildHeader()
6761
{
6862
var newHeader = Source.Header.Add(new SystemColumn(ResultColumnName, 0, typeof(bool)));
69-
var types = FilteredColumns.Select(m => newHeader.Columns[m].Type);
70-
FilteredColumnsExtractionTransform = new MapTransform(true, TupleDescriptor.Create(types), FilteredColumns);
71-
ResultTransform = new CombineTransform(true, Source.Header.TupleDescriptor, TupleDescriptor.Create(new []{typeof(bool)}));
63+
var fieldTypes = new Type[FilteredColumns.Count];
64+
for (var index = 0; index < fieldTypes.Length; index++) {
65+
fieldTypes[index] = newHeader.Columns[FilteredColumns[index]].Type;
66+
}
67+
var tupleDescriptor = TupleDescriptor.Create(fieldTypes);
68+
FilteredColumnsExtractionTransform = new MapTransform(true, tupleDescriptor, FilteredColumns);
69+
ResultTransform = new CombineTransform(true, Source.Header.TupleDescriptor, TupleDescriptor.Create<bool>());
7270
return newHeader;
7371
}
7472

@@ -85,7 +83,7 @@ protected override RecordSetHeader BuildHeader()
8583
/// <param name="resultColumnName">A value for <see cref="ResultColumnName"/>.</param>
8684
/// <param name="filteredColumns">A value for <see cref="FilteredColumns"/>.</param>
8785
public IncludeProvider(CompilableProvider source, IncludeAlgorithm algorithm, bool isInlined,
88-
Expression<Func<IEnumerable<Tuple>>> filterDataSource, string resultColumnName, int[] filteredColumns)
86+
Expression<Func<IEnumerable<Tuple>>> filterDataSource, string resultColumnName, IReadOnlyList<int> filteredColumns)
8987
: base(ProviderType.Include, source)
9088
{
9189
ArgumentValidator.EnsureArgumentNotNull(filterDataSource, "filterDataSource");
@@ -95,7 +93,7 @@ public IncludeProvider(CompilableProvider source, IncludeAlgorithm algorithm, bo
9593
IsInlined = isInlined;
9694
FilterDataSource = filterDataSource;
9795
ResultColumnName = resultColumnName;
98-
this.filteredColumns = filteredColumns.Copy();
96+
FilteredColumns = filteredColumns is int[] columns ? Array.AsReadOnly(columns) : filteredColumns;
9997
Initialize();
10098
}
10199
}

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88
using System.Collections.Generic;
99
using System.Diagnostics;
1010
using System.Linq;
11-
using Xtensive.Collections;
1211
using Xtensive.Core;
1312

14-
using Xtensive.Orm.Rse.Providers;
15-
1613
namespace Xtensive.Orm.Rse.Providers
1714
{
1815
/// <summary>
@@ -21,15 +18,10 @@ namespace Xtensive.Orm.Rse.Providers
2118
[Serializable]
2219
public sealed class SelectProvider : UnaryProvider
2320
{
24-
private readonly int[] columnIndexes;
25-
2621
/// <summary>
2722
/// Indexes of columns that should be selected from the <see cref="UnaryProvider.Source"/>.
2823
/// </summary>
29-
public int[] ColumnIndexes {
30-
[DebuggerStepThrough]
31-
get { return columnIndexes.Copy(); }
32-
}
24+
public IReadOnlyList<int> ColumnIndexes { [DebuggerStepThrough] get; }
3325

3426
/// <inheritdoc/>
3527
protected override RecordSetHeader BuildHeader()
@@ -52,7 +44,17 @@ protected override string ParametersToString()
5244
public SelectProvider(CompilableProvider provider, int[] columnIndexes)
5345
: base(ProviderType.Select, provider)
5446
{
55-
this.columnIndexes = columnIndexes;
47+
this.ColumnIndexes = Array.AsReadOnly(columnIndexes);
48+
Initialize();
49+
}
50+
51+
/// <summary>
52+
/// Initializes a new instance of this class.
53+
/// </summary>
54+
public SelectProvider(CompilableProvider provider, IReadOnlyList<int> columnIndexes)
55+
: base(ProviderType.Select, provider)
56+
{
57+
this.ColumnIndexes = columnIndexes is int[] indexes ? indexes : columnIndexes;
5658
Initialize();
5759
}
5860
}

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/OrderingRewriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ protected override Provider VisitSelect(SelectProvider provider)
7171

7272
if (sortOrder.Count > 0) {
7373
var selectOrdering = new DirectionCollection<int>();
74+
var columnIndexes = result.ColumnIndexes;
7475
foreach (var pair in sortOrder) {
75-
var columnIndex = result.ColumnIndexes.IndexOf(pair.Key);
76+
var columnIndex = columnIndexes.IndexOf(pair.Key);
7677
if (columnIndex < 0) {
7778
if (selectOrdering.Count > 0)
7879
selectOrdering.Clear();

Orm/Xtensive.Orm/Tuples/Transform/CombineTransform.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88
using System.Collections.Generic;
99
using System.Diagnostics;
1010
using System.Linq;
11-
using Xtensive.Collections;
1211
using Xtensive.Core;
1312
using Xtensive.Reflection;
14-
using Xtensive.Tuples.Transform;
15-
1613

1714

1815
namespace Xtensive.Tuples.Transform
@@ -28,10 +25,10 @@ public sealed class CombineTransform : MapTransform
2825
/// <summary>
2926
/// Gets tuple descriptors this transform merges.
3027
/// </summary>
31-
public TupleDescriptor[] Sources
28+
public IReadOnlyList<TupleDescriptor> Sources
3229
{
3330
[DebuggerStepThrough]
34-
get { return sources.Copy(); }
31+
get => Array.AsReadOnly(sources);
3532
}
3633

3734
/// <see cref="MapTransform.Apply(TupleTransformType,Tuple,Tuple)" copy="true" />
@@ -84,7 +81,7 @@ public CombineTransform(bool isReadOnly, params TupleDescriptor[] sources)
8481
}
8582
this.sources = sources;
8683
Descriptor = TupleDescriptor.Create(types);
87-
Map = map;
84+
SetMap(map);
8885
}
8986
}
9087
}

0 commit comments

Comments
 (0)