From b52362e2bccb1c66ff3629ee91a81a5452ce7c6c Mon Sep 17 00:00:00 2001 From: Biarity Date: Sat, 10 Feb 2018 11:21:43 +1000 Subject: [PATCH] Beter model generics for extensibility --- Sieve/Models/FilterTerm.cs | 10 ++++++++-- Sieve/Models/IFilterTerm.cs | 16 ++++++++++++++++ Sieve/Models/ISieveModel.cs | 8 +++++--- Sieve/Models/ISortTerm.cs | 13 +++++++++++++ Sieve/Models/SieveModel.cs | 10 +++++----- Sieve/Models/SortTerm.cs | 2 +- Sieve/Services/ISieveProcessor.cs | 8 ++++---- Sieve/Services/SieveProcessor.cs | 10 +++++----- 8 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 Sieve/Models/IFilterTerm.cs create mode 100644 Sieve/Models/ISortTerm.cs diff --git a/Sieve/Models/FilterTerm.cs b/Sieve/Models/FilterTerm.cs index e9e0736..3200a54 100644 --- a/Sieve/Models/FilterTerm.cs +++ b/Sieve/Models/FilterTerm.cs @@ -5,7 +5,7 @@ using System.Text; namespace Sieve.Models { - public class FilterTerm + public class FilterTerm : IFilterTerm { private string _filter; private string[] operators = new string[] { @@ -56,7 +56,6 @@ namespace Sieve.Models } } - public string Value { get { @@ -95,5 +94,12 @@ namespace Sieve.Models } } + public bool OperatorIsCaseInsensitive + { + get + { + return Operator.Contains("*"); + } + } } } \ No newline at end of file diff --git a/Sieve/Models/IFilterTerm.cs b/Sieve/Models/IFilterTerm.cs new file mode 100644 index 0000000..d06c657 --- /dev/null +++ b/Sieve/Models/IFilterTerm.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Sieve.Models +{ + public interface IFilterTerm + { + string Name { get; } + string Operator { get; } + bool OperatorIsCaseInsensitive { get; } + FilterOperator OperatorParsed { get; } + string Value { get; } + } +} \ No newline at end of file diff --git a/Sieve/Models/ISieveModel.cs b/Sieve/Models/ISieveModel.cs index 3e1b227..a9f021f 100644 --- a/Sieve/Models/ISieveModel.cs +++ b/Sieve/Models/ISieveModel.cs @@ -5,7 +5,9 @@ using System.Text; namespace Sieve.Models { - public interface ISieveModel + public interface ISieveModel + where TFilterTerm : IFilterTerm + where TSortTerm : ISortTerm { string Filters { get; set; } @@ -15,8 +17,8 @@ namespace Sieve.Models int? PageSize { get; set; } - List FiltersParsed { get; } + List FiltersParsed { get; } - List SortsParsed { get; } + List SortsParsed { get; } } } diff --git a/Sieve/Models/ISortTerm.cs b/Sieve/Models/ISortTerm.cs new file mode 100644 index 0000000..ff38567 --- /dev/null +++ b/Sieve/Models/ISortTerm.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Sieve.Models +{ + public interface ISortTerm + { + bool Descending { get; } + string Name { get; } + } +} \ No newline at end of file diff --git a/Sieve/Models/SieveModel.cs b/Sieve/Models/SieveModel.cs index 306e585..8eaacbf 100644 --- a/Sieve/Models/SieveModel.cs +++ b/Sieve/Models/SieveModel.cs @@ -5,7 +5,7 @@ using System.Text; namespace Sieve.Models { - public class SieveModel : ISieveModel + public class SieveModel: ISieveModel { public string Filters { get; set; } @@ -18,13 +18,13 @@ namespace Sieve.Models public int? PageSize { get; set; } - public List FiltersParsed + public List FiltersParsed { get { if (Filters != null) { - var value = new List(); + var value = new List(); foreach (var filter in Filters.Split(',')) { value.Add(new FilterTerm(filter)); @@ -38,13 +38,13 @@ namespace Sieve.Models } } - public List SortsParsed + public List SortsParsed { get { if (Sorts != null) { - var value = new List(); + var value = new List(); foreach (var sort in Sorts.Split(',')) { value.Add(new SortTerm(sort)); diff --git a/Sieve/Models/SortTerm.cs b/Sieve/Models/SortTerm.cs index a95de9f..5ab7ff6 100644 --- a/Sieve/Models/SortTerm.cs +++ b/Sieve/Models/SortTerm.cs @@ -5,7 +5,7 @@ using System.Text; namespace Sieve.Models { - public class SortTerm + public class SortTerm : ISortTerm { private string _sort; diff --git a/Sieve/Services/ISieveProcessor.cs b/Sieve/Services/ISieveProcessor.cs index 6b0fa20..81ec01b 100644 --- a/Sieve/Services/ISieveProcessor.cs +++ b/Sieve/Services/ISieveProcessor.cs @@ -6,9 +6,9 @@ namespace Sieve.Services { public interface ISieveProcessor { - IQueryable ApplyAll(ISieveModel model, IQueryable source, object[] dataForCustomMethods = null); - IQueryable ApplySorting(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null); - IQueryable ApplyFiltering(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null); - IQueryable ApplyPagination(ISieveModel model, IQueryable result); + IQueryable ApplyAll(ISieveModel model, IQueryable source, object[] dataForCustomMethods = null); + IQueryable ApplySorting(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null); + IQueryable ApplyFiltering(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null); + IQueryable ApplyPagination(ISieveModel model, IQueryable result); } } \ No newline at end of file diff --git a/Sieve/Services/SieveProcessor.cs b/Sieve/Services/SieveProcessor.cs index 9f2e5e4..6f64b4b 100644 --- a/Sieve/Services/SieveProcessor.cs +++ b/Sieve/Services/SieveProcessor.cs @@ -57,7 +57,7 @@ namespace Sieve.Services /// Data source /// Additional data that will be passed down to custom methods /// Returns a transformed version of `source` - public IQueryable ApplyAll(ISieveModel model, IQueryable source, object[] dataForCustomMethods = null) + public IQueryable ApplyAll(ISieveModel model, IQueryable source, object[] dataForCustomMethods = null) { var result = source; @@ -84,7 +84,7 @@ namespace Sieve.Services /// Data source /// Additional data that will be passed down to custom methods /// Returns a transformed version of `source` - public IQueryable ApplyFiltering(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null) + public IQueryable ApplyFiltering(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null) { if (model?.FiltersParsed == null) return result; @@ -106,7 +106,7 @@ namespace Sieve.Services dynamic propertyValue = Expression.PropertyOrField(parameter, property.Name); - if (filterTerm.Operator.Contains("*")) + if (filterTerm.OperatorIsCaseInsensitive) { propertyValue = Expression.Call(propertyValue, typeof(string).GetMethods() @@ -181,7 +181,7 @@ namespace Sieve.Services /// Data source /// Additional data that will be passed down to custom methods /// Returns a transformed version of `source` - public IQueryable ApplySorting(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null) + public IQueryable ApplySorting(ISieveModel model, IQueryable result, object[] dataForCustomMethods = null) { if (model?.SortsParsed == null) return result; @@ -219,7 +219,7 @@ namespace Sieve.Services /// Data source /// Additional data that will be passed down to custom methods /// Returns a transformed version of `source` - public IQueryable ApplyPagination(ISieveModel model, IQueryable result) + public IQueryable ApplyPagination(ISieveModel model, IQueryable result) { var page = model?.Page ?? 1; var pageSize = model?.PageSize ?? _options.Value.DefaultPageSize;