Skip to content

Commit aada800

Browse files
bahusoidhazzik
authored andcommitted
Refactored DefaultEntityAliases to avoid unnecessary calculations (#1482)
1 parent 6d8d5d9 commit aada800

File tree

1 file changed

+83
-90
lines changed

1 file changed

+83
-90
lines changed
Lines changed: 83 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Generic;
22
using NHibernate.Persister.Entity;
3-
using NHibernate.Util;
43

54
namespace NHibernate.Loader
65
{
@@ -10,48 +9,75 @@ namespace NHibernate.Loader
109
/// </summary>
1110
public class DefaultEntityAliases : IEntityAliases
1211
{
13-
private readonly string[] suffixedKeyColumns;
14-
private readonly string[] suffixedVersionColumn;
15-
private readonly string[][] suffixedPropertyColumns;
16-
private readonly string suffixedDiscriminatorColumn;
17-
private readonly string suffix;
18-
private readonly string rowIdAlias;
19-
private readonly IDictionary<string, string[]> userProvidedAliases;
12+
private readonly string _suffix;
13+
private readonly IDictionary<string, string[]> _userProvidedAliases;
14+
private string _rowIdAlias;
2015

2116
public DefaultEntityAliases(ILoadable persister, string suffix)
22-
: this(CollectionHelper.EmptyDictionary<string, string[]>(), persister, suffix) {}
17+
: this(null, persister, suffix)
18+
{
19+
}
2320

2421
/// <summary>
25-
/// Calculate and cache select-clause suffixes.
22+
/// Calculate and cache select-clause aliases.
2623
/// </summary>
2724
public DefaultEntityAliases(IDictionary<string, string[]> userProvidedAliases, ILoadable persister, string suffix)
2825
{
29-
this.suffix = suffix;
30-
this.userProvidedAliases = userProvidedAliases;
26+
_suffix = suffix;
27+
_userProvidedAliases = userProvidedAliases?.Count > 0 ? userProvidedAliases : null;
3128

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);
29+
SuffixedKeyAliases = DetermineKeyAliases(persister);
30+
SuffixedPropertyAliases = DeterminePropertyAliases(persister);
31+
SuffixedDiscriminatorAlias = DetermineDiscriminatorAlias(persister);
32+
33+
SuffixedVersionAliases = persister.IsVersioned ? SuffixedPropertyAliases[persister.VersionProperty] : null;
34+
//rowIdAlias is generated on demand in property
35+
}
4236

43-
suffixedPropertyColumns = GetSuffixedPropertyAliases(persister);
44-
suffixedDiscriminatorColumn =
45-
GetUserProvidedAlias(AbstractEntityPersister.EntityClass, GetDiscriminatorAlias(persister, suffix));
46-
if (persister.IsVersioned)
37+
/// <summary>
38+
/// Returns aliases for subclass persister
39+
/// </summary>
40+
public string[][] GetSuffixedPropertyAliases(ILoadable persister)
41+
{
42+
if (_userProvidedAliases == null)
43+
return GetAllPropertyAliases(persister);
44+
45+
var propertyNames = persister.PropertyNames;
46+
var suffixedPropertyAliases = new string[propertyNames.Length][];
47+
for (var i = 0; i < propertyNames.Length; i++)
4748
{
48-
suffixedVersionColumn = suffixedPropertyColumns[persister.VersionProperty];
49+
suffixedPropertyAliases[i] =
50+
SafeGetUserProvidedAliases(propertyNames[i]) ??
51+
GetPropertyAliases(persister, i);
4952
}
50-
else
53+
54+
return suffixedPropertyAliases;
55+
}
56+
57+
public string[] SuffixedVersionAliases { get; }
58+
59+
public string[][] SuffixedPropertyAliases { get; }
60+
61+
public string SuffixedDiscriminatorAlias { get; }
62+
63+
public string[] SuffixedKeyAliases { get; }
64+
65+
// TODO: not visible to the user!
66+
public string RowIdAlias => _rowIdAlias ?? (_rowIdAlias = Loadable.RowIdAlias + _suffix);
67+
68+
/// <summary>
69+
/// Returns default aliases for all the properties
70+
/// </summary>
71+
private string[][] GetAllPropertyAliases(ILoadable persister)
72+
{
73+
var propertyNames = persister.PropertyNames;
74+
var suffixedPropertyAliases = new string[propertyNames.Length][];
75+
for (var i = 0; i < propertyNames.Length; i++)
5176
{
52-
suffixedVersionColumn = null;
77+
suffixedPropertyAliases[i] = GetPropertyAliases(persister, i);
5378
}
54-
rowIdAlias = Loadable.RowIdAlias + suffix; // TODO: not visible to the user!
79+
80+
return suffixedPropertyAliases;
5581
}
5682

5783
protected virtual string GetDiscriminatorAlias(ILoadable persister, string suffix)
@@ -66,85 +92,52 @@ protected virtual string[] GetIdentifierAliases(ILoadable persister, string suff
6692

6793
protected virtual string[] GetPropertyAliases(ILoadable persister, int j)
6894
{
69-
return persister.GetPropertyAliases(suffix, j);
95+
return persister.GetPropertyAliases(_suffix, j);
7096
}
7197

72-
private string[] GetUserProvidedAliases(string propertyPath, string[] defaultAliases)
98+
private string[] DetermineKeyAliases(ILoadable persister)
7399
{
74-
string[] result = propertyPath == null ? null : GetUserProvidedAlias(propertyPath);
75-
if (result == null)
100+
if (_userProvidedAliases != null)
76101
{
77-
return defaultAliases;
78-
}
79-
else
80-
{
81-
return result;
102+
var result = SafeGetUserProvidedAliases(persister.IdentifierPropertyName) ??
103+
GetUserProvidedAliases(EntityPersister.EntityID);
104+
105+
if (result != null)
106+
return result;
82107
}
83-
}
84108

85-
private string[] GetUserProvidedAlias(string propertyPath)
86-
{
87-
string[] result;
88-
userProvidedAliases.TryGetValue(propertyPath, out result);
89-
return result;
109+
return GetIdentifierAliases(persister, _suffix);
90110
}
91-
92-
private string GetUserProvidedAlias(string propertyPath, string defaultAlias)
111+
112+
private string[][] DeterminePropertyAliases(ILoadable persister)
93113
{
94-
string[] columns = propertyPath == null ? null : GetUserProvidedAlias(propertyPath);
95-
if (columns == null)
96-
{
97-
return defaultAlias;
98-
}
99-
else
100-
{
101-
return columns[0];
102-
}
114+
return GetSuffixedPropertyAliases(persister);
103115
}
104-
105-
public string[][] GetSuffixedPropertyAliases(ILoadable persister)
116+
117+
private string DetermineDiscriminatorAlias(ILoadable persister)
106118
{
107-
int size = persister.PropertyNames.Length;
108-
string[][] suffixedPropertyAliases = new string[size][];
109-
for (int j = 0; j < size; j++)
119+
if (_userProvidedAliases != null)
110120
{
111-
suffixedPropertyAliases[j] = GetUserProvidedAliases(persister.PropertyNames[j], GetPropertyAliases(persister, j));
112-
Intern(suffixedPropertyAliases[j]);
121+
var columns = GetUserProvidedAliases(AbstractEntityPersister.EntityClass);
122+
if (columns != null)
123+
return columns[0];
113124
}
114-
return suffixedPropertyAliases;
115-
}
116125

117-
public string[] SuffixedVersionAliases
118-
{
119-
get { return suffixedVersionColumn; }
126+
return GetDiscriminatorAlias(persister, _suffix);
120127
}
121-
122-
public string[][] SuffixedPropertyAliases
128+
129+
private string[] SafeGetUserProvidedAliases(string propertyPath)
123130
{
124-
get { return suffixedPropertyColumns; }
125-
}
131+
if (propertyPath == null)
132+
return null;
126133

127-
public string SuffixedDiscriminatorAlias
128-
{
129-
get { return suffixedDiscriminatorColumn; }
130-
}
131-
132-
public string[] SuffixedKeyAliases
133-
{
134-
get { return suffixedKeyColumns; }
134+
return GetUserProvidedAliases(propertyPath);
135135
}
136136

137-
public string RowIdAlias
137+
private string[] GetUserProvidedAliases(string propertyPath)
138138
{
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-
}
139+
_userProvidedAliases.TryGetValue(propertyPath, out var result);
140+
return result;
148141
}
149142
}
150143
}

0 commit comments

Comments
 (0)