From d0b5bf8ceb0a308a358afa3b208e2ac7b1d56e11 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 10 Sep 2021 17:52:40 +0000 Subject: [PATCH] --- .../DataListSqlFilterCriteriaBuilder.cs | 79 ++++++++++++++----- 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index c3a34a7d..94be222b 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -107,12 +107,14 @@ namespace AyaNova.DataList private static string DataFilterToColumnCriteria(string SqlColumnNameToFilter, UiFieldDataType DataType, string sOperator, string sValue, DateTimeOffset clientTimeStamp) { StringBuilder sb = new StringBuilder(); - //Column name - sb.Append(SqlColumnNameToFilter); - sb.Append(" "); + //handle null values separately if (sValue == "*NULL*") { + //Column name + sb.Append(SqlColumnNameToFilter); //case doesn't matter for null searches + sb.Append(" "); + switch (DataType) { //ALL TEXT TYPES @@ -146,38 +148,74 @@ namespace AyaNova.DataList else { //non null value - //Special addition to handle nulls + bool ForceToLower = false; + //Force to LOWER case if it's a text data type and filter case sensitive is false + if (ServerGlobalBizSettings.Cache.FilterCaseSensitive) + { + switch (DataType) + { + //ALL TEXT TYPES + case UiFieldDataType.Text: + case UiFieldDataType.PhoneNumber: + case UiFieldDataType.EmailAddress: + case UiFieldDataType.HTTP: + ForceToLower = true; + break; + } + } + + //Handle nulls and also insert the column name into the query in case sensitive fashion switch (sOperator) { case DataListFilterComparisonOperator.Equality: - //no change on equals for nulls + //no specific addition on equals for nulls, just column name for below + if (ForceToLower) + sb.Append($"lower('{SqlColumnNameToFilter}') "); + else + sb.Append($"{SqlColumnNameToFilter} "); break; case DataListFilterComparisonOperator.GreaterThan: - //no change on greater than for nulls + //no specific addition on greater than for nulls //(nulls are going to be assumed to be always at the - //less than end of the scale) + //less than end of the scale) so just include column name break; case DataListFilterComparisonOperator.GreaterThanOrEqualTo: //no change on greater than for nulls //(nulls are going to be assumed to be always at the //less than end of the scale) + if (ForceToLower) + sb.Append($"lower('{SqlColumnNameToFilter}') "); + else + sb.Append($"{SqlColumnNameToFilter} "); break; case DataListFilterComparisonOperator.LessThan: + sb.Append($"{SqlColumnNameToFilter} "); sb.Append("Is Null OR "); - sb.Append(SqlColumnNameToFilter); + if (ForceToLower) + sb.Append($"lower('{SqlColumnNameToFilter}')"); + else + sb.Append(SqlColumnNameToFilter); sb.Append(" "); break; case DataListFilterComparisonOperator.LessThanOrEqualTo: + sb.Append($"{SqlColumnNameToFilter} "); sb.Append("Is Null OR "); - sb.Append(SqlColumnNameToFilter); + if (ForceToLower) + sb.Append($"lower('{SqlColumnNameToFilter}')"); + else + sb.Append(SqlColumnNameToFilter); sb.Append(" "); break; case DataListFilterComparisonOperator.NotEqual: + sb.Append($"{SqlColumnNameToFilter} "); //This is the big one: sb.Append("Is Null OR "); - sb.Append(SqlColumnNameToFilter); + if (ForceToLower) + sb.Append($"lower('{SqlColumnNameToFilter}')"); + else + sb.Append(SqlColumnNameToFilter); sb.Append(" "); break; } @@ -205,21 +243,24 @@ namespace AyaNova.DataList switch (sOperator) { case DataListFilterComparisonOperator.Equality: - sb.Append("='"); - sb.Append(sValue); - sb.Append("'"); + if (ServerGlobalBizSettings.Cache.FilterCaseSensitive) + sb.Append($"= '{sValue}'"); + else + sb.Append($"= lower('{sValue}')"); break; case DataListFilterComparisonOperator.GreaterThan: - sb.Append(">'"); - sb.Append(sValue); - sb.Append("'"); + if (ServerGlobalBizSettings.Cache.FilterCaseSensitive) + sb.Append($"> '{sValue}'"); + else + sb.Append($"> lower('{sValue}')"); break; case DataListFilterComparisonOperator.GreaterThanOrEqualTo: - sb.Append(">='"); - sb.Append(sValue); - sb.Append("'"); + if (ServerGlobalBizSettings.Cache.FilterCaseSensitive) + sb.Append($">= '{sValue}'"); + else + sb.Append($">= lower('{sValue}')"); break; case DataListFilterComparisonOperator.LessThan: