Skip to content

Commit 0e95fb8

Browse files
committed
More enumeration improvements
1 parent 6ef8cc8 commit 0e95fb8

8 files changed

Lines changed: 56 additions & 33 deletions

File tree

Orm/Xtensive.Orm/Core/Extensions/EnumerableExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ public static List<TValue> SortTopologically<TValue>(this IEnumerable<TValue> va
601601
if (edgeTester.Invoke(left.Value, right.Value))
602602
new Edge(left, right);
603603
var result = TopologicalSorter.Sort(graph);
604-
return result.HasLoops ? null : result.SortedNodes.Select(node => node.Value).ToList();
604+
return result.HasLoops ? null : result.SortedNodes.SelectToList(node => node.Value);
605605
}
606606

607607
/// <summary>

Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntitySetTask.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ private static CompilableProvider CreateQueryForDirectAssociation(Pair<object, C
237237
AddResultColumnIndexes(resultColumns, primaryTargetIndex, 0);
238238
var association = pair.Second.ReferencingField.Associations.Last();
239239
var field = association.Reversed.OwnerField;
240-
var keyColumnTypes = field.Columns.Select(column => column.ValueType).ToList();
240+
var keyColumnTypes = field.Columns.SelectToArray(column => column.ValueType);
241241
return primaryTargetIndex
242242
.GetQuery()
243243
.Filter(QueryHelper.BuildFilterLambda(field.MappingInfo.Offset, keyColumnTypes, ownerParameter));

Orm/Xtensive.Orm/Orm/Linq/Translator.Materialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ private static ProjectionExpression Optimize(ProjectionExpression origin)
8787
if (usedColumns.Count==0)
8888
usedColumns.Add(0);
8989
if (usedColumns.Count < origin.ItemProjector.DataSource.Header.Length) {
90-
var resultProvider = new SelectProvider(originProvider, usedColumns.ToArray());
90+
var resultProvider = new SelectProvider(originProvider, usedColumns);
9191
var itemProjector = origin.ItemProjector.Remap(resultProvider, usedColumns.ToArray());
9292
var result = new ProjectionExpression(
9393
origin.Type,

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -957,8 +957,7 @@ private ProjectionExpression VisitGroupBy(Type returnType, Expression source, La
957957
SubQueryIndex = subqueryIndex,
958958
GroupIndex = groupIndex,
959959
Type = keyDataSource.Header.Columns[groupIndex].Type.ToNullable()
960-
})
961-
.ToList();
960+
});
962961
var applyParameter = context.GetApplyParameter(groupingProjection);
963962
var tupleParameter = Expression.Parameter(WellKnownOrmTypes.Tuple, "tuple");
964963

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Index.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private SqlSelect BuildUnionQuery(IndexInfo index)
8080
{
8181
ISqlQueryExpression result = null;
8282

83-
var baseQueries = index.UnderlyingIndexes.Select(BuildProviderQuery).ToList();
83+
var baseQueries = index.UnderlyingIndexes.Select(BuildProviderQuery);
8484
foreach (var select in baseQueries) {
8585
result = result==null
8686
? (ISqlQueryExpression) select
@@ -154,7 +154,7 @@ private SqlSelect BuildFilteredQuery(IndexInfo index)
154154
SqlExpression filter = null;
155155
var type = index.ReflectedType;
156156
var discriminatorMap = type.Hierarchy.TypeDiscriminatorMap;
157-
var filterByTypes = index.FilterByTypes.ToList();
157+
var filterByTypes = index.FilterByTypes;
158158
if (underlyingIndex.IsTyped && discriminatorMap != null) {
159159
var columnType = discriminatorMap.Column.ValueType;
160160
var discriminatorColumnIndex = underlyingIndex.Columns

Orm/Xtensive.Orm/Orm/Rse/ColumnCollection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public ColumnCollection Join(IEnumerable<Column> joined)
5555
public ColumnCollection Alias(string alias)
5656
{
5757
ArgumentValidator.EnsureArgumentNotNullOrEmpty(alias, "alias");
58-
return new ColumnCollection(this.Select(column => column.Clone(alias + "." + column.Name)));
58+
return new ColumnCollection(this.SelectToList(column => column.Clone(alias + "." + column.Name)));
5959
}
6060

6161
// Constructors

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public ContainsTableProvider(FullTextIndexInfo index, Func<ParameterContext, str
5353
SearchCriteria = searchCriteria;
5454
FullFeatured = fullFeatured;
5555
PrimaryIndex = new IndexInfoRef(index.PrimaryIndex);
56-
TargetColumns = new ReadOnlyList<FullTextColumnInfo>(targetColumns.Select(tc=>index.Columns.First(c=>c.Column==tc)).ToList());
56+
TargetColumns = new ReadOnlyList<FullTextColumnInfo>(targetColumns.SelectToList(tc=>index.Columns.First(c=>c.Column==tc)));
5757
TopN = topNByRank;
5858
if (FullFeatured) {
5959
var primaryIndexRecordsetHeader =

Orm/Xtensive.Orm/Orm/Rse/RecordSetHeader.cs

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,13 @@ public TupleDescriptor OrderTupleDescriptor {
6262
get {
6363
if (Order.Count==0)
6464
return null;
65-
if (orderTupleDescriptor==null) lock(this) if (orderTupleDescriptor==null) {
66-
var fieldTypes = Order.Select(p => Columns[p.Key].Type).ToArray(Order.Count);
67-
orderTupleDescriptor = TupleDescriptor.Create(fieldTypes);
65+
if (orderTupleDescriptor==null) {
66+
lock (this) {
67+
if (orderTupleDescriptor==null) {
68+
var fieldTypes = Order.SelectToArray(p => Columns[p.Key].Type);
69+
orderTupleDescriptor = TupleDescriptor.Create(fieldTypes);
70+
}
71+
}
6872
}
6973

7074
return orderTupleDescriptor;
@@ -141,15 +145,21 @@ public RecordSetHeader Join(RecordSetHeader joined)
141145
var groups = new List<ColumnGroup>(columnGroupCount + joined.ColumnGroups.Count);
142146
groups.AddRange(ColumnGroups);
143147
foreach (var g in joined.ColumnGroups) {
144-
var keys = new List<int>(g.Keys.Count);
148+
//var keys = new List<int>(g.Keys.Count);
149+
var keys1 = new int[g.Keys.Count];
150+
var ai = 0;
145151
foreach (var i in g.Keys) {
146-
keys.Add(columnCount + i);
152+
keys1[ai++] = columnCount + i;
153+
//keys.Add(columnCount + i);
147154
}
148-
var columns = new List<int>(g.Columns.Count);
155+
//var columns = new List<int>(g.Columns.Count);
156+
var columns1 = new int[g.Columns.Count];
157+
ai = 0;
149158
foreach (var i in g.Columns) {
150-
columns.Add(columnCount + i);
159+
columns1[ai++] = columnCount + i;
160+
//columns.Add(columnCount + i);
151161
}
152-
groups.Add(new ColumnGroup(g.TypeInfoRef, keys, columns));
162+
groups.Add(new ColumnGroup(g.TypeInfoRef, keys1, columns1));
153163
}
154164

155165
return new RecordSetHeader(
@@ -167,8 +177,11 @@ public RecordSetHeader Join(RecordSetHeader joined)
167177
/// <returns>A new header containing only specified columns.</returns>
168178
public RecordSetHeader Select(IEnumerable<int> selectedColumns)
169179
{
170-
var columns = new List<int>(selectedColumns);
171-
var columnsMap = new List<int>(Enumerable.Repeat(-1, Columns.Count));
180+
var columns = (selectedColumns is IReadOnlyList<int> rList) ? rList : new List<int>(selectedColumns);
181+
182+
var columnsMap = new int[Columns.Count];
183+
Array.Fill(columnsMap, -1);
184+
172185
for (int newIndex = 0; newIndex < columns.Count; newIndex++) {
173186
var oldIndex = columns[newIndex];
174187
columnsMap[oldIndex] = newIndex;
@@ -179,9 +192,9 @@ public RecordSetHeader Select(IEnumerable<int> selectedColumns)
179192
var resultOrder = new DirectionCollection<int>(
180193
Order
181194
.Select(o => new KeyValuePair<int, Direction>(columnsMap[o.Key], o.Value))
182-
.TakeWhile(o => o.Key >= 0));
195+
.TakeWhile(static o => o.Key >= 0));
183196

184-
var resultColumns = columns.Select((oldIndex, newIndex) => Columns[oldIndex].Clone(newIndex));
197+
var resultColumns = columns.Select((oldIndex, newIndex) => Columns[oldIndex].Clone(newIndex)).ToList(columns.Count);
185198

186199
var resultGroups = ColumnGroups
187200
.Where(g => g.Keys.All(k => columnsMap[k]>=0))
@@ -190,7 +203,7 @@ public RecordSetHeader Select(IEnumerable<int> selectedColumns)
190203
g.Keys.Select(k => columnsMap[k]),
191204
g.Columns
192205
.Select(c => columnsMap[c])
193-
.Where(c => c >= 0)));
206+
.Where(static c => c >= 0)));
194207

195208
return new RecordSetHeader(
196209
resultTupleDescriptor,
@@ -231,27 +244,38 @@ private static RecordSetHeader CreateHeader(IndexInfo indexInfo)
231244
var indexInfoColumns = indexInfo.Columns;
232245
var indexInfoKeyColumns = indexInfo.KeyColumns;
233246

234-
var resultFieldTypes = indexInfoColumns.Select(columnInfo => columnInfo.ValueType).ToArray(indexInfoColumns.Count);
247+
var resultFieldTypes = indexInfoColumns.SelectToArray(columnInfo => columnInfo.ValueType);
235248
var resultTupleDescriptor = TupleDescriptor.Create(resultFieldTypes);
236249

237-
var keyOrder = new List<KeyValuePair<int, Direction>>(
238-
indexInfoKeyColumns.Select((p, i) => new KeyValuePair<int, Direction>(i, p.Value)));
250+
//var keyOrder = new List<KeyValuePair<int, Direction>>(
251+
// indexInfoKeyColumns.Select((p, i) => new KeyValuePair<int, Direction>(i, p.Value)));
252+
253+
var keyOrderEnumerable = indexInfoKeyColumns.Select(static (p, i) => new KeyValuePair<int, Direction>(i, p.Value));
239254
if (!indexInfo.IsPrimary) {
240255
var pkKeys = indexInfo.ReflectedType.Indexes.PrimaryIndex.KeyColumns;
241-
keyOrder.AddRange(
242-
indexInfo.ValueColumns
243-
.Select((c, i) => new Pair<ColumnInfo, int>(c, i + indexInfoKeyColumns.Count))
244-
.Where(pair => pair.First.IsPrimaryKey)
256+
var offset = indexInfoKeyColumns.Count;
257+
keyOrderEnumerable = keyOrderEnumerable
258+
.Concat(indexInfo.ValueColumns
259+
.Select((c, i) => new Pair<ColumnInfo, int>(c, i + offset))
260+
.Where(static pair => pair.First.IsPrimaryKey)
245261
.Select(pair => new KeyValuePair<int, Direction>(pair.Second, pkKeys[pair.First])));
246262
}
247-
var order = new DirectionCollection<int>(keyOrder);
263+
264+
//if (!indexInfo.IsPrimary) {
265+
// var pkKeys = indexInfo.ReflectedType.Indexes.PrimaryIndex.KeyColumns;
266+
// keyOrder.AddRange(
267+
// indexInfo.ValueColumns
268+
// .Select((c, i) => new Pair<ColumnInfo, int>(c, i + indexInfoKeyColumns.Count))
269+
// .Where(pair => pair.First.IsPrimaryKey)
270+
// .Select(pair => new KeyValuePair<int, Direction>(pair.Second, pkKeys[pair.First])));
271+
//}
272+
var order = new DirectionCollection<int>(keyOrderEnumerable);
248273

249274
var keyFieldTypes = indexInfoKeyColumns
250-
.Select(columnInfo => columnInfo.Key.ValueType)
251-
.ToArray(indexInfoKeyColumns.Count);
275+
.SelectToArray(static columnInfo => columnInfo.Key.ValueType);
252276
var keyDescriptor = TupleDescriptor.Create(keyFieldTypes);
253277

254-
var resultColumns = indexInfoColumns.Select((c,i) => (Column) new MappedColumn(c,i,c.ValueType));
278+
var resultColumns = indexInfoColumns.Select(static (c,i) => (Column) new MappedColumn(c,i,c.ValueType));
255279
var resultGroups = new[]{indexInfo.Group};
256280

257281
return new RecordSetHeader(

0 commit comments

Comments
 (0)