From 312468e371022707dd1e851d2419976a7f391ebe Mon Sep 17 00:00:00 2001 From: halitkalayci Date: Fri, 29 Nov 2024 11:33:33 +0300 Subject: [PATCH] feat(persistence): add in and between operator & remove case sensitivity --- src/Core.Persistence/Dynamic/Filter.cs | 1 + .../IQueryableDynamicFilterExtensions.cs | 27 +++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Core.Persistence/Dynamic/Filter.cs b/src/Core.Persistence/Dynamic/Filter.cs index ed79bcb..ce2940b 100644 --- a/src/Core.Persistence/Dynamic/Filter.cs +++ b/src/Core.Persistence/Dynamic/Filter.cs @@ -6,6 +6,7 @@ public class Filter public string Operator { get; set; } public string? Value { get; set; } public string? Logic { get; set; } + public bool CaseSensitive { get; set; } = false; public IEnumerable? Filters { get; set; } public Filter() diff --git a/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs b/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs index 34aa95e..94a531a 100644 --- a/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs +++ b/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs @@ -21,7 +21,9 @@ public static class IQueryableDynamicFilterExtensions { "startswith", "StartsWith" }, { "endswith", "EndsWith" }, { "contains", "Contains" }, - { "doesnotcontain", "Contains" } + { "doesnotcontain", "Contains" }, + { "in", "In" }, + { "between", "Between" } }; public static IQueryable ToDynamic(this IQueryable query, DynamicQuery dynamicQuery) @@ -93,7 +95,28 @@ public static string Transform(Filter filter, IList filters) if (filter.Operator == "doesnotcontain") where.Append($"(!np({filter.Field}).{comparison}(@{index.ToString()}))"); else if (comparison is "StartsWith" or "EndsWith" or "Contains") - where.Append($"(np({filter.Field}).{comparison}(@{index.ToString()}))"); + { + if (!filter.CaseSensitive) + { + where.Append($"(np({filter.Field}).ToLower().{comparison}(@{index.ToString()}.ToLower()))"); + } + else + { + where.Append($"(np({filter.Field}).{comparison}(@{index.ToString()}))"); + } + } + else if (filter.Operator == "in") + { + where.Append($"np({filter.Field}) in ({filter.Value})"); + } + else if (filter.Operator == "between") + { + var values = filter.Value.Split(','); + if (values.Length != 2) + throw new ArgumentException("Invalid Value for 'between' operator"); + + where.Append($"(np({filter.Field}) >= {values[0]} and np({filter.Field}) <= {values[1]})"); + } else where.Append($"np({filter.Field}) {comparison} @{index.ToString()}"); else if (filter.Operator is "isnull" or "isnotnull")