Skip to content

Commit 4dd8349

Browse files
committed
Refactored DefaultEntityAliases to avoid unnecessary calculations
1 parent c4eb6f4 commit 4dd8349

File tree

1 file changed

+45
-40
lines changed

1 file changed

+45
-40
lines changed

src/NHibernate/Loader/DefaultEntityAliases.cs

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
using System;
12
using System.Collections.Generic;
3+
using System.Linq;
24
using NHibernate.Persister.Entity;
3-
using NHibernate.Util;
45

56
namespace NHibernate.Loader
67
{
@@ -15,43 +16,26 @@ public class DefaultEntityAliases : IEntityAliases
1516
private readonly string[][] suffixedPropertyColumns;
1617
private readonly string suffixedDiscriminatorColumn;
1718
private readonly string suffix;
18-
private readonly string rowIdAlias;
19+
private string rowIdAlias;
1920
private readonly IDictionary<string, string[]> userProvidedAliases;
2021

2122
public DefaultEntityAliases(ILoadable persister, string suffix)
22-
: this(CollectionHelper.EmptyDictionary<string, string[]>(), persister, suffix) {}
23+
: this(null, persister, suffix){}
2324

2425
/// <summary>
2526
/// Calculate and cache select-clause suffixes.
2627
/// </summary>
2728
public DefaultEntityAliases(IDictionary<string, string[]> userProvidedAliases, ILoadable persister, string suffix)
2829
{
2930
this.suffix = suffix;
30-
this.userProvidedAliases = userProvidedAliases;
31+
this.userProvidedAliases = userProvidedAliases?.Count > 0 ? userProvidedAliases : null;
3132

32-
string[] keyColumnsCandidates = GetUserProvidedAliases(persister.IdentifierPropertyName, null);
33-
if (keyColumnsCandidates == null)
34-
{
35-
suffixedKeyColumns = GetUserProvidedAliases(EntityPersister.EntityID, GetIdentifierAliases(persister, suffix));
36-
}
37-
else
38-
{
39-
suffixedKeyColumns = keyColumnsCandidates;
40-
}
41-
Intern(suffixedKeyColumns);
33+
suffixedKeyColumns = GetSuffixedKeyAliases(persister, suffix);
4234

4335
suffixedPropertyColumns = GetSuffixedPropertyAliases(persister);
44-
suffixedDiscriminatorColumn =
45-
GetUserProvidedAlias(AbstractEntityPersister.EntityClass, GetDiscriminatorAlias(persister, suffix));
46-
if (persister.IsVersioned)
47-
{
48-
suffixedVersionColumn = suffixedPropertyColumns[persister.VersionProperty];
49-
}
50-
else
51-
{
52-
suffixedVersionColumn = null;
53-
}
54-
rowIdAlias = Loadable.RowIdAlias + suffix; // TODO: not visible to the user!
36+
suffixedDiscriminatorColumn = GetSuffixedDiscriminatorAlias(persister, suffix);
37+
38+
suffixedVersionColumn = persister.IsVersioned ? suffixedPropertyColumns[persister.VersionProperty] : null;
5539
}
5640

5741
protected virtual string GetDiscriminatorAlias(ILoadable persister, string suffix)
@@ -69,12 +53,20 @@ protected virtual string[] GetPropertyAliases(ILoadable persister, int j)
6953
return persister.GetPropertyAliases(suffix, j);
7054
}
7155

72-
private string[] GetUserProvidedAliases(string propertyPath, string[] defaultAliases)
56+
/// <summary>
57+
/// Returns default aliases for all the properties
58+
/// </summary>
59+
protected string[][] GetPropertyAliases(ILoadable persister)
60+
{
61+
return Enumerable.Range(0, persister.PropertyNames.Length).Select(i => GetPropertyAliases(persister, i)).ToArray();
62+
}
63+
64+
private string[] GetUserProvidedAliases(string propertyPath, Func<string[]> getDefaultAliases)
7365
{
7466
string[] result = propertyPath == null ? null : GetUserProvidedAlias(propertyPath);
7567
if (result == null)
7668
{
77-
return defaultAliases;
69+
return getDefaultAliases();
7870
}
7971
else
8072
{
@@ -89,27 +81,47 @@ private string[] GetUserProvidedAlias(string propertyPath)
8981
return result;
9082
}
9183

92-
private string GetUserProvidedAlias(string propertyPath, string defaultAlias)
84+
private string GetUserProvidedAlias(string propertyPath, Func<string> getDefaultAlias)
9385
{
9486
string[] columns = propertyPath == null ? null : GetUserProvidedAlias(propertyPath);
9587
if (columns == null)
9688
{
97-
return defaultAlias;
89+
return getDefaultAlias();
9890
}
9991
else
10092
{
10193
return columns[0];
10294
}
10395
}
10496

97+
private string GetSuffixedDiscriminatorAlias(ILoadable persister, string suffix)
98+
{
99+
if (userProvidedAliases == null)
100+
return GetDiscriminatorAlias(persister, suffix);
101+
102+
return GetUserProvidedAlias(AbstractEntityPersister.EntityClass, () => GetDiscriminatorAlias(persister, suffix));
103+
}
104+
105+
private string[] GetSuffixedKeyAliases(ILoadable persister, string suffix)
106+
{
107+
if (userProvidedAliases == null)
108+
return GetIdentifierAliases(persister, suffix);
109+
110+
return GetUserProvidedAliases(
111+
persister.IdentifierPropertyName,
112+
() => GetUserProvidedAliases(EntityPersister.EntityID, () => GetIdentifierAliases(persister, suffix)));
113+
}
114+
105115
public string[][] GetSuffixedPropertyAliases(ILoadable persister)
106116
{
117+
if (userProvidedAliases == null)
118+
return GetPropertyAliases(persister);
119+
107120
int size = persister.PropertyNames.Length;
108121
string[][] suffixedPropertyAliases = new string[size][];
109122
for (int j = 0; j < size; j++)
110123
{
111-
suffixedPropertyAliases[j] = GetUserProvidedAliases(persister.PropertyNames[j], GetPropertyAliases(persister, j));
112-
Intern(suffixedPropertyAliases[j]);
124+
suffixedPropertyAliases[j] = GetUserProvidedAliases(persister.PropertyNames[j], () => GetPropertyAliases(persister, j));
113125
}
114126
return suffixedPropertyAliases;
115127
}
@@ -136,15 +148,8 @@ public string[] SuffixedKeyAliases
136148

137149
public string RowIdAlias
138150
{
139-
get { return rowIdAlias; }
140-
}
141-
142-
private static void Intern(string[] strings)
143-
{
144-
for (int i = 0; i < strings.Length; i++)
145-
{
146-
strings[i] = StringHelper.InternedIfPossible(strings[i]);
147-
}
151+
// TODO: not visible to the user!
152+
get { return rowIdAlias ?? (rowIdAlias = Loadable.RowIdAlias + suffix); }
148153
}
149154
}
150155
}

0 commit comments

Comments
 (0)