Skip to content

Commit 0538b38

Browse files
committed
ModelBuilder.GetTypeBuidSequence() improvements
1 parent 356a4ee commit 0538b38

File tree

1 file changed

+28
-25
lines changed

1 file changed

+28
-25
lines changed

Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private void BuildModel()
143143
{
144144
using (BuildLog.InfoRegion(nameof(Strings.LogBuildingX), Strings.ActualModel)) {
145145
context.Model = new DomainModel();
146-
BuildTypes(GetTypeBuildSequence().ToList());
146+
BuildTypes(GetTypeBuildSequence());
147147
BuildAssociations();
148148
FindAndMarkInboundAndOutboundTypes(context);
149149
IndexBuilder.BuildIndexes(context);
@@ -538,35 +538,38 @@ private Dictionary<TypeInfo,int> InitReferencesOfTypesDictionary(TypeInfoCollect
538538

539539
#region Topological sort helpers
540540

541-
private static List<Node<Node<TypeDef>, object>> PrepareNodesForTopologicalSort(IEnumerable<Node<TypeDef>> typeNodes)
541+
private IReadOnlyList<TypeDef> GetTypeBuildSequence()
542542
{
543-
var nodes = new List<Node<Node<TypeDef>, object>>();
544-
foreach (var typeNode in typeNodes) {
545-
var topoNode = new Node<Node<TypeDef>, object>(typeNode);
546-
nodes.Add(topoNode);
547-
}
548-
var dict = nodes.ToDictionary(o => o.Item);
549-
foreach (var typeNode in typeNodes) {
550-
var tail = dict[typeNode];
551-
foreach (var head in typeNode.OutgoingEdges.Where(static o => o.Weight == EdgeWeight.High).Select(static o => o.Head).Distinct()) {
552-
if (head != typeNode) {
553-
dict[head].AddConnection(tail, null);
554-
}
555-
}
556-
}
557-
return nodes;
558-
}
559-
560-
private IEnumerable<TypeDef> GetTypeBuildSequence()
561-
{
562-
List<Node<Node<TypeDef>, object>> loops;
563-
var result = TopologicalSorter.Sort(PrepareNodesForTopologicalSort(context.DependencyGraph.Nodes), out loops)
543+
//.SortToList eliminates resizes (count is known within sorter) which will appear if use Sort().ToList()
544+
var result = TopologicalSorter.SortToList(PrepareNodesForTopologicalSort(context.DependencyGraph.Nodes), out var loops)
564545
?? throw new DomainBuilderException(string.Format(
565546
Strings.ExAtLeastOneLoopHaveBeenFoundInPersistentTypeDependenciesGraphSuspiciousTypesX,
566547
loops.Select(node => node.Item.Value.Name).ToCommaDelimitedString()));
567-
var dependentTypes = result.Select(static n => n.Value).ToList();
548+
549+
var dependentTypes = result.Select(static n => n.Value);
568550
var independentTypes = context.ModelDef.Types.Except(dependentTypes);
569-
return independentTypes.Concat(dependentTypes);
551+
552+
return independentTypes.Concat(dependentTypes).ToArray(context.ModelDef.Types.Count);
553+
554+
555+
static List<Node<Node<TypeDef>, object>> PrepareNodesForTopologicalSort(IEnumerable<Node<TypeDef>> typeNodes)
556+
{
557+
var nodes = new List<Node<Node<TypeDef>, object>>();
558+
foreach (var typeNode in typeNodes) {
559+
var topoNode = new Node<Node<TypeDef>, object>(typeNode);
560+
nodes.Add(topoNode);
561+
}
562+
var dict = nodes.ToDictionary(o => o.Item);
563+
foreach (var typeNode in typeNodes) {
564+
var tail = dict[typeNode];
565+
foreach (var head in typeNode.OutgoingEdges.Where(static o => o.Weight == EdgeWeight.High).Select(static o => o.Head).Distinct()) {
566+
if (head != typeNode) {
567+
_ = dict[head].AddConnection(tail, null);
568+
}
569+
}
570+
}
571+
return nodes;
572+
}
570573
}
571574

572575
#endregion

0 commit comments

Comments
 (0)