Skip to content

Commit 42c2f9b

Browse files
bahusoidfredericDelaporte
authored andcommitted
Optimize filter applying logic (#2295)
1 parent 4e54de2 commit 42c2f9b

File tree

2 files changed

+39
-45
lines changed

2 files changed

+39
-45
lines changed

src/NHibernate/Persister/Entity/AbstractEntityPersister.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2148,13 +2148,18 @@ public string GenerateTableAlias(string rootAlias, int tableNumber)
21482148
if (tableNumber == 0)
21492149
return rootAlias;
21502150

2151-
StringBuilder buf = new StringBuilder().Append(rootAlias);
2152-
if (!rootAlias.EndsWith("_"))
2153-
{
2154-
buf.Append('_');
2155-
}
2151+
string x = rootAlias.EndsWith('_')
2152+
? string.Empty
2153+
: "_";
2154+
return string.Concat(rootAlias, x, tableNumber.ToString(), "_");
2155+
}
21562156

2157-
return buf.Append(tableNumber).Append('_').ToString();
2157+
private string GetSubclassAliasedColumn(string rootAlias, int tableNumber, string columnName)
2158+
{
2159+
if (string.IsNullOrEmpty(rootAlias))
2160+
return columnName;
2161+
2162+
return GenerateTableAlias(rootAlias, tableNumber) + "." + columnName;
21582163
}
21592164

21602165
public string[] ToColumns(string name, int i)
@@ -3655,16 +3660,21 @@ protected void LogStaticSQL()
36553660

36563661
public virtual string FilterFragment(string alias, IDictionary<string, IFilter> enabledFilters)
36573662
{
3658-
StringBuilder sessionFilterFragment = new StringBuilder();
3663+
var filterFragment = FilterFragment(alias);
3664+
if (!filterHelper.IsAffectedBy(enabledFilters))
3665+
return filterFragment;
36593666

3667+
var sessionFilterFragment = new StringBuilder();
36603668
filterHelper.Render(sessionFilterFragment, GenerateFilterConditionAlias(alias), GetColumnsToTableAliasMap(alias), enabledFilters);
3661-
3662-
return sessionFilterFragment.Append(FilterFragment(alias)).ToString();
3669+
return sessionFilterFragment.Append(filterFragment).ToString();
36633670
}
36643671

36653672
private IDictionary<string, string> GetColumnsToTableAliasMap(string rootAlias)
36663673
{
3667-
IDictionary<PropertyKey, string> propDictionary = new Dictionary<PropertyKey, string>();
3674+
if (SubclassTableSpan < 2)
3675+
return CollectionHelper.EmptyDictionary<string, string>();
3676+
3677+
var propDictionary = new Dictionary<PropertyKey, string>();
36683678
for (int i =0; i < SubclassPropertyNameClosure.Length; i++)
36693679
{
36703680
string property = SubclassPropertyNameClosure[i];
@@ -3677,20 +3687,11 @@ private IDictionary<string, string> GetColumnsToTableAliasMap(string rootAlias)
36773687
}
36783688
}
36793689

3680-
IDictionary<string, string> dict = new Dictionary<string, string>();
3690+
var dict = new Dictionary<string, string>();
36813691
for (int i = 0; i < SubclassColumnTableNumberClosure.Length; i++ )
36823692
{
3683-
string fullColumn;
36843693
string col = SubclassColumnClosure[i];
3685-
if (!string.IsNullOrEmpty(rootAlias))
3686-
{
3687-
string alias = GenerateTableAlias(rootAlias, SubclassColumnTableNumberClosure[i]);
3688-
fullColumn = string.Format("{0}.{1}", alias, col);
3689-
}
3690-
else
3691-
{
3692-
fullColumn = col;
3693-
}
3694+
var fullColumn = GetSubclassAliasedColumn(rootAlias, SubclassColumnTableNumberClosure[i], col);
36943695

36953696
PropertyKey key = new PropertyKey(col, SubclassColumnTableNumberClosure[i]);
36963697
if (propDictionary.ContainsKey(key))
@@ -3709,8 +3710,7 @@ private IDictionary<string, string> GetColumnsToTableAliasMap(string rootAlias)
37093710
{
37103711
foreach (var key in GetSubclassTableKeyColumns(i))
37113712
{
3712-
var alias = i == 0 ? rootAlias : GenerateTableAlias(rootAlias, i);
3713-
dict[key] = $"{alias}.{key}";
3713+
dict[key] = GetSubclassAliasedColumn(rootAlias, i, key);
37143714
}
37153715
}
37163716

@@ -3753,7 +3753,7 @@ public virtual string OneToManyFilterFragment(string alias)
37533753
public virtual SqlString FromJoinFragment(string alias, bool innerJoin, bool includeSubclasses)
37543754
{
37553755
return SubclassTableSpan == 1
3756-
? new SqlString(string.Empty) // just a performance opt!
3756+
? SqlString.Empty // just a performance opt!
37573757
: CreateJoin(alias, innerJoin, includeSubclasses).ToFromFragmentString;
37583758
}
37593759

src/NHibernate/Util/FilterHelper.cs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,50 +55,44 @@ public string Render(String alias, IDictionary<string, IFilter> enabledFilters)
5555

5656
public void Render(StringBuilder buffer, string alias, IDictionary<string, IFilter> enabledFilters)
5757
{
58-
Render(buffer, alias, new Dictionary<string, string>(), enabledFilters);
58+
Render(buffer, alias, CollectionHelper.EmptyDictionary<string, string>(), enabledFilters);
5959
}
6060

6161
public void Render(StringBuilder buffer, string defaultAlias, IDictionary<string, string> propMap, IDictionary<string, IFilter> enabledFilters)
6262
{
63-
if (filterNames != null)
63+
for (int i = 0; i < filterNames.Length; i++)
6464
{
65-
int max = filterNames.Length;
66-
if (max > 0)
65+
if (enabledFilters.ContainsKey(filterNames[i]))
6766
{
68-
for (int i = 0; i < max; i++)
67+
string condition = filterConditions[i];
68+
if (!string.IsNullOrEmpty(condition))
6969
{
70-
if (enabledFilters.ContainsKey(filterNames[i]))
71-
{
72-
string condition = filterConditions[i];
73-
if (StringHelper.IsNotEmpty(condition))
74-
{
75-
buffer.Append(" and ");
76-
AddFilterString(buffer, defaultAlias, propMap, condition);
77-
}
78-
}
70+
buffer.Append(" and ");
71+
AddFilterString(buffer, defaultAlias, propMap, condition);
7972
}
8073
}
8174
}
8275
}
8376

8477
private static void AddFilterString(StringBuilder buffer, string defaultAlias, IDictionary<string, string> propMap, string condition)
8578
{
86-
int i = condition.IndexOf(FilterImpl.MARKER);
79+
int i;
8780
int upTo = 0;
88-
while (i > -1 && upTo < condition.Length)
81+
while ((i = condition.IndexOf(FilterImpl.MARKER, upTo, StringComparison.Ordinal)) >= 0 && upTo < condition.Length)
8982
{
90-
buffer.Append(condition.Substring(upTo, i - upTo));
83+
buffer.Append(condition, upTo, i - upTo);
9184
int startOfProperty = i + FilterImpl.MARKER.Length + 1;
9285

93-
upTo = condition.IndexOf(" ", startOfProperty);
86+
upTo = condition.IndexOf(' ', startOfProperty);
9487
upTo = upTo >= 0 ? upTo : condition.Length;
9588
string property = condition.Substring(startOfProperty, upTo - startOfProperty);
9689

97-
string fullColumn = propMap.ContainsKey(property) ? propMap[property] : string.Format("{0}.{1}", defaultAlias, property);
90+
if (!propMap.TryGetValue(property, out var fullColumn))
91+
fullColumn = string.IsNullOrEmpty(defaultAlias)
92+
? property
93+
: defaultAlias + "." + property;
9894

9995
buffer.Append(fullColumn);
100-
101-
i = condition.IndexOf(FilterImpl.MARKER, upTo);
10296
}
10397
buffer.Append(condition.Substring(upTo));
10498
}

0 commit comments

Comments
 (0)