Skip to content

Commit 1f9a7cf

Browse files
committed
Move dependent alias calculation to sort method
1 parent 2de9e38 commit 1f9a7cf

File tree

1 file changed

+37
-25
lines changed

1 file changed

+37
-25
lines changed

src/NHibernate/Loader/JoinWalker.cs

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ public class DependentAlias
121121
public string[] DependsOn { get; set; }
122122
}
123123

124-
readonly List<DependentAlias> _dependentAliases = new List<DependentAlias>();
125-
126124
protected JoinWalker(ISessionFactoryImplementor factory, IDictionary<string, IFilter> enabledFilters)
127125
{
128126
this.factory = factory;
@@ -181,7 +179,7 @@ private void AddAssociationToJoinTree(IAssociationType type, string[] aliasedLhs
181179
enabledFilters,
182180
GetSelectMode(path));
183181
assoc.ValidateJoin(path);
184-
AddAssociation(subalias, assoc);
182+
AddAssociation(assoc);
185183

186184
int nextDepth = currentDepth + 1;
187185

@@ -207,13 +205,17 @@ protected virtual SelectMode GetSelectMode(string path)
207205
/// <summary>
208206
/// Returns null if sorting is not required, otherwise list of indexes in sorted order
209207
/// </summary>
210-
private static int[] GetTopologicalSortOrder(List<DependentAlias> fields)
208+
private static int[] GetTopologicalSortOrder(IList<OuterJoinableAssociation> associations)
211209
{
210+
if (associations.Count < 2)
211+
return null;
212+
213+
var fields = GetDependentAliases(associations);
212214
if (!fields.Exists(a => a.DependsOn?.Length > 0))
213215
return null;
214216

215217
TopologicalSorter g = new TopologicalSorter(fields.Count);
216-
Dictionary<string, int> indexes = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
218+
Dictionary<string, int> indexes = new Dictionary<string, int>(fields.Count, StringComparer.OrdinalIgnoreCase);
217219

218220
// add vertices
219221
for (int i = 0; i < fields.Count; i++)
@@ -242,31 +244,41 @@ private static int[] GetTopologicalSortOrder(List<DependentAlias> fields)
242244
return g.Sort();
243245
}
244246

245-
/// <summary>
246-
/// Adds an association and extracts the aliases the association's 'with clause' is dependent on
247-
/// </summary>
248-
private void AddAssociation(string subalias, OuterJoinableAssociation association)
247+
private static List<DependentAlias> GetDependentAliases(IList<OuterJoinableAssociation> associations)
249248
{
250-
var dependentAlias = new DependentAlias
251-
{
252-
Alias = subalias,
253-
};
254-
_dependentAliases.Add(dependentAlias);
249+
var dependentAliases = new List<DependentAlias>(associations.Count);
255250

256-
var on = association.On.ToString();
257-
if (!string.IsNullOrEmpty(on))
251+
foreach (var association in associations)
258252
{
259-
var dependencies = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
260-
foreach (Match match in aliasRegex.Matches(on))
253+
var dependentAlias = new DependentAlias
261254
{
262-
string alias = match.Value;
263-
if (string.Equals(alias, subalias, StringComparison.OrdinalIgnoreCase))
264-
continue;
265-
dependencies.Add(alias);
255+
Alias = association.RHSAlias,
256+
};
257+
258+
dependentAliases.Add(dependentAlias);
259+
260+
var on = association.On.ToString();
261+
if (!string.IsNullOrEmpty(on))
262+
{
263+
var dependencies = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
264+
foreach (Match match in aliasRegex.Matches(on))
265+
{
266+
string alias = match.Value;
267+
if (string.Equals(alias, dependentAlias.Alias, StringComparison.OrdinalIgnoreCase))
268+
continue;
269+
dependencies.Add(alias);
270+
}
271+
dependentAlias.DependsOn = dependencies.ToArray();
266272
}
267-
dependentAlias.DependsOn = dependencies.ToArray();
268273
}
274+
return dependentAliases;
275+
}
269276

277+
/// <summary>
278+
/// Adds an association
279+
/// </summary>
280+
private void AddAssociation(OuterJoinableAssociation association)
281+
{
270282
associations.Add(association);
271283
}
272284

@@ -366,7 +378,7 @@ internal void AddExplicitEntityJoinAssociation(
366378
Factory,
367379
enabledFilters,
368380
GetSelectMode(path));
369-
AddAssociation(tableAlias, assoc);
381+
AddAssociation(assoc);
370382
}
371383

372384
private void WalkEntityAssociationTree(IAssociationType associationType, IOuterJoinLoadable persister,
@@ -841,7 +853,7 @@ protected JoinFragment MergeOuterJoins(IList<OuterJoinableAssociation> associati
841853

842854
private IList<OuterJoinableAssociation> GetSortedAssociations(IList<OuterJoinableAssociation> associations)
843855
{
844-
var indexes = GetTopologicalSortOrder(_dependentAliases);
856+
var indexes = GetTopologicalSortOrder(associations);
845857
if (indexes == null)
846858
return associations;
847859

0 commit comments

Comments
 (0)