Skip to content

Commit 6fcddc3

Browse files
committed
IndexBuilder: Less enumerations + ChainedBuffer instead of .ToList
1 parent 4284628 commit 6fcddc3

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,7 @@ private void BuildInterfaceIndexes()
191191
case InheritanceSchema.ConcreteTable: {
192192
var grouping = hierarchy;
193193
var allImplementors = @interface.AllImplementors
194-
.Where(t => t.Hierarchy == grouping.Key && !t.IsAbstract)
195-
.ToList();
194+
.Where(t => t.Hierarchy == grouping.Key && !t.IsAbstract);
196195
var primaryIndexes = allImplementors
197196
.Select(t => (Index: t.Indexes.Single(static i => i.IsPrimary && !i.IsVirtual), Type: t))
198197
.Select(p => untypedIndexes.Contains(p.Index)
@@ -580,12 +579,14 @@ private IndexInfo BuildJoinIndex(TypeInfo reflectedType, IEnumerable<IndexInfo>
580579
}
581580

582581
// Adding value columns
583-
var typeOrder = reflectedType.Ancestors
584-
.Append(reflectedType)
585-
.Select(static (t, i) => (Type: t, Index: i))
586-
.ToDictionary(static a => a.Type, static a => a.Index);
587-
var types = reflectedType.Ancestors.ToHashSet();
588-
types.Add(reflectedType);
582+
var typeOrder = new Dictionary<TypeInfo, int>(reflectedType.Ancestors.Count + 1);
583+
var types = new HashSet<TypeInfo>(reflectedType.Ancestors.Count + 1);
584+
585+
var indx = 0;
586+
foreach (var t in reflectedType.Ancestors.Append(reflectedType)) {
587+
typeOrder.Add(t, indx++);
588+
_ = types.Add(t);
589+
}
589590

590591
var valueColumnMap = new List<List<int>>();
591592
foreach (var index in indexesToJoin) {
@@ -618,13 +619,11 @@ private IndexInfo BuildJoinIndex(TypeInfo reflectedType, IEnumerable<IndexInfo>
618619
}
619620
var orderedIndexes = indexesToJoin
620621
.Select((index, i) => (index, columns: valueColumnMap[i], i))
621-
.OrderBy(a => typeOrder[a.index.ValueColumns.First().Field.ReflectedType])
622-
.ToList();
622+
.OrderBy(a => typeOrder[a.index.ValueColumns.First().Field.ReflectedType]);
623623

624624
var columnsToAdd = new List<ColumnInfo>();
625625
var valueColumnMapping = new List<Pair<int, List<int>>>();
626-
for (var i = 0; i < orderedIndexes.Count; i++) {
627-
var item = orderedIndexes[i];
626+
foreach(var item in orderedIndexes) {
628627
if (valueColumnMapping.Count == 0)
629628
item.columns.InsertRange(0, Enumerable.Range(0, result.IncludedColumns.Count));
630629
foreach (var columnIndex in item.columns) {
@@ -750,7 +749,7 @@ private IndexInfo BuildViewIndex(TypeInfo reflectedType, IndexInfo indexToApplyV
750749
var actualColumnMapping = valueColumns
751750
.Zip(columnMap, static (column, sourceIndex) => (column, sourceIndex))
752751
.OrderBy(p => reflectedType.Columns.IndexOf(p.column))
753-
.ToList();
752+
.ToChainedBuffer();
754753
valueColumns.Clear();
755754
columnMap.Clear();
756755
columnMap.AddRange(Enumerable.Range(0, keyLength));

0 commit comments

Comments
 (0)