From 23db149543ea5f5f0831cd570924d15925ecf735 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 17 Dec 2019 23:40:15 +0200 Subject: [PATCH 1/3] Optimize filter logic --- .../Entity/AbstractEntityPersister.cs | 48 +++++++++---------- src/NHibernate/Util/FilterHelper.cs | 34 ++++++------- 2 files changed, 38 insertions(+), 44 deletions(-) diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 4c429ab928e..f910db30907 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -2148,13 +2148,18 @@ public string GenerateTableAlias(string rootAlias, int tableNumber) if (tableNumber == 0) return rootAlias; - StringBuilder buf = new StringBuilder().Append(rootAlias); - if (!rootAlias.EndsWith("_")) - { - buf.Append('_'); - } + string x = rootAlias.EndsWith('_') + ? string.Empty + : "_"; + return string.Concat(rootAlias, x, tableNumber.ToString(), "_"); + } - return buf.Append(tableNumber).Append('_').ToString(); + public string GetSubclassAliasedColumn(string rootAlias, int tableNumber, string columnName) + { + if (string.IsNullOrEmpty(rootAlias)) + return columnName; + + return GenerateTableAlias(rootAlias, tableNumber) + "." + columnName; } public string[] ToColumns(string name, int i) @@ -3655,16 +3660,21 @@ protected void LogStaticSQL() public virtual string FilterFragment(string alias, IDictionary enabledFilters) { - StringBuilder sessionFilterFragment = new StringBuilder(); + var filterFragment = FilterFragment(alias); + if (!filterHelper.IsAffectedBy(enabledFilters)) + return filterFragment; + var sessionFilterFragment = new StringBuilder(); filterHelper.Render(sessionFilterFragment, GenerateFilterConditionAlias(alias), GetColumnsToTableAliasMap(alias), enabledFilters); - - return sessionFilterFragment.Append(FilterFragment(alias)).ToString(); + return sessionFilterFragment.Append(filterFragment).ToString(); } private IDictionary GetColumnsToTableAliasMap(string rootAlias) { - IDictionary propDictionary = new Dictionary(); + if (SubclassTableSpan < 2) + return CollectionHelper.EmptyDictionary(); + + var propDictionary = new Dictionary(); for (int i =0; i < SubclassPropertyNameClosure.Length; i++) { string property = SubclassPropertyNameClosure[i]; @@ -3677,20 +3687,11 @@ private IDictionary GetColumnsToTableAliasMap(string rootAlias) } } - IDictionary dict = new Dictionary(); + var dict = new Dictionary(); for (int i = 0; i < SubclassColumnTableNumberClosure.Length; i++ ) { - string fullColumn; string col = SubclassColumnClosure[i]; - if (!string.IsNullOrEmpty(rootAlias)) - { - string alias = GenerateTableAlias(rootAlias, SubclassColumnTableNumberClosure[i]); - fullColumn = string.Format("{0}.{1}", alias, col); - } - else - { - fullColumn = col; - } + var fullColumn = GetSubclassAliasedColumn(rootAlias, SubclassColumnTableNumberClosure[i], col); PropertyKey key = new PropertyKey(col, SubclassColumnTableNumberClosure[i]); if (propDictionary.ContainsKey(key)) @@ -3709,8 +3710,7 @@ private IDictionary GetColumnsToTableAliasMap(string rootAlias) { foreach (var key in GetSubclassTableKeyColumns(i)) { - var alias = i == 0 ? rootAlias : GenerateTableAlias(rootAlias, i); - dict[key] = $"{alias}.{key}"; + dict[key] = GetSubclassAliasedColumn(rootAlias, i, key); } } @@ -3753,7 +3753,7 @@ public virtual string OneToManyFilterFragment(string alias) public virtual SqlString FromJoinFragment(string alias, bool innerJoin, bool includeSubclasses) { return SubclassTableSpan == 1 - ? new SqlString(string.Empty) // just a performance opt! + ? SqlString.Empty // just a performance opt! : CreateJoin(alias, innerJoin, includeSubclasses).ToFromFragmentString; } diff --git a/src/NHibernate/Util/FilterHelper.cs b/src/NHibernate/Util/FilterHelper.cs index 82015537f9c..ab074fe064f 100644 --- a/src/NHibernate/Util/FilterHelper.cs +++ b/src/NHibernate/Util/FilterHelper.cs @@ -60,22 +60,15 @@ public void Render(StringBuilder buffer, string alias, IDictionary propMap, IDictionary enabledFilters) { - if (filterNames != null) + for (int i = 0; i < filterNames.Length; i++) { - int max = filterNames.Length; - if (max > 0) + if (enabledFilters.ContainsKey(filterNames[i])) { - for (int i = 0; i < max; i++) + string condition = filterConditions[i]; + if (!string.IsNullOrEmpty(condition)) { - if (enabledFilters.ContainsKey(filterNames[i])) - { - string condition = filterConditions[i]; - if (StringHelper.IsNotEmpty(condition)) - { - buffer.Append(" and "); - AddFilterString(buffer, defaultAlias, propMap, condition); - } - } + buffer.Append(" and "); + AddFilterString(buffer, defaultAlias, propMap, condition); } } } @@ -83,22 +76,23 @@ public void Render(StringBuilder buffer, string defaultAlias, IDictionary propMap, string condition) { - int i = condition.IndexOf(FilterImpl.MARKER); + int i; int upTo = 0; - while (i > -1 && upTo < condition.Length) + while ((i = condition.IndexOf(FilterImpl.MARKER, upTo, StringComparison.Ordinal)) >= 0 && upTo < condition.Length) { - buffer.Append(condition.Substring(upTo, i - upTo)); + buffer.Append(condition, upTo, i - upTo); int startOfProperty = i + FilterImpl.MARKER.Length + 1; - upTo = condition.IndexOf(" ", startOfProperty); + upTo = condition.IndexOf(' ', startOfProperty); upTo = upTo >= 0 ? upTo : condition.Length; string property = condition.Substring(startOfProperty, upTo - startOfProperty); - string fullColumn = propMap.ContainsKey(property) ? propMap[property] : string.Format("{0}.{1}", defaultAlias, property); + if (!propMap.TryGetValue(property, out var fullColumn)) + fullColumn = string.IsNullOrEmpty(defaultAlias) + ? property + : defaultAlias + "." + property; buffer.Append(fullColumn); - - i = condition.IndexOf(FilterImpl.MARKER, upTo); } buffer.Append(condition.Substring(upTo)); } From 486fb624c6dd8c50d2e7bc7bb186ec50906b167f Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Mon, 23 Dec 2019 18:26:05 +0200 Subject: [PATCH 2/3] Avoid empty dic creation --- src/NHibernate/Util/FilterHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHibernate/Util/FilterHelper.cs b/src/NHibernate/Util/FilterHelper.cs index ab074fe064f..7eaedaed329 100644 --- a/src/NHibernate/Util/FilterHelper.cs +++ b/src/NHibernate/Util/FilterHelper.cs @@ -55,7 +55,7 @@ public string Render(String alias, IDictionary enabledFilters) public void Render(StringBuilder buffer, string alias, IDictionary enabledFilters) { - Render(buffer, alias, new Dictionary(), enabledFilters); + Render(buffer, alias, CollectionHelper.EmptyDictionary(), enabledFilters); } public void Render(StringBuilder buffer, string defaultAlias, IDictionary propMap, IDictionary enabledFilters) From bb1ed7d53a0d9a9b5e5d5e3ed275aeede9876fb1 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Mon, 23 Dec 2019 18:40:25 +0200 Subject: [PATCH 3/3] Make added method private --- src/NHibernate/Persister/Entity/AbstractEntityPersister.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index f910db30907..90203b337d1 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -2154,7 +2154,7 @@ public string GenerateTableAlias(string rootAlias, int tableNumber) return string.Concat(rootAlias, x, tableNumber.ToString(), "_"); } - public string GetSubclassAliasedColumn(string rootAlias, int tableNumber, string columnName) + private string GetSubclassAliasedColumn(string rootAlias, int tableNumber, string columnName) { if (string.IsNullOrEmpty(rootAlias)) return columnName;