mirror of
https://github.com/Biarity/Sieve.git
synced 2024-11-22 13:32:33 +01:00
Beter model generics for extensibility
This commit is contained in:
parent
bfbbbf8b44
commit
b52362e2bc
@ -5,7 +5,7 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Sieve.Models
|
namespace Sieve.Models
|
||||||
{
|
{
|
||||||
public class FilterTerm
|
public class FilterTerm : IFilterTerm
|
||||||
{
|
{
|
||||||
private string _filter;
|
private string _filter;
|
||||||
private string[] operators = new string[] {
|
private string[] operators = new string[] {
|
||||||
@ -56,7 +56,6 @@ namespace Sieve.Models
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public string Value {
|
public string Value {
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -95,5 +94,12 @@ namespace Sieve.Models
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool OperatorIsCaseInsensitive
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Operator.Contains("*");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
16
Sieve/Models/IFilterTerm.cs
Normal file
16
Sieve/Models/IFilterTerm.cs
Normal file
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -5,7 +5,9 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Sieve.Models
|
namespace Sieve.Models
|
||||||
{
|
{
|
||||||
public interface ISieveModel
|
public interface ISieveModel<TFilterTerm, TSortTerm>
|
||||||
|
where TFilterTerm : IFilterTerm
|
||||||
|
where TSortTerm : ISortTerm
|
||||||
{
|
{
|
||||||
string Filters { get; set; }
|
string Filters { get; set; }
|
||||||
|
|
||||||
@ -15,8 +17,8 @@ namespace Sieve.Models
|
|||||||
|
|
||||||
int? PageSize { get; set; }
|
int? PageSize { get; set; }
|
||||||
|
|
||||||
List<FilterTerm> FiltersParsed { get; }
|
List<TFilterTerm> FiltersParsed { get; }
|
||||||
|
|
||||||
List<SortTerm> SortsParsed { get; }
|
List<TSortTerm> SortsParsed { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
Sieve/Models/ISortTerm.cs
Normal file
13
Sieve/Models/ISortTerm.cs
Normal file
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -5,7 +5,7 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Sieve.Models
|
namespace Sieve.Models
|
||||||
{
|
{
|
||||||
public class SieveModel : ISieveModel
|
public class SieveModel: ISieveModel<IFilterTerm, ISortTerm>
|
||||||
{
|
{
|
||||||
public string Filters { get; set; }
|
public string Filters { get; set; }
|
||||||
|
|
||||||
@ -18,13 +18,13 @@ namespace Sieve.Models
|
|||||||
public int? PageSize { get; set; }
|
public int? PageSize { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public List<FilterTerm> FiltersParsed
|
public List<IFilterTerm> FiltersParsed
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (Filters != null)
|
if (Filters != null)
|
||||||
{
|
{
|
||||||
var value = new List<FilterTerm>();
|
var value = new List<IFilterTerm>();
|
||||||
foreach (var filter in Filters.Split(','))
|
foreach (var filter in Filters.Split(','))
|
||||||
{
|
{
|
||||||
value.Add(new FilterTerm(filter));
|
value.Add(new FilterTerm(filter));
|
||||||
@ -38,13 +38,13 @@ namespace Sieve.Models
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SortTerm> SortsParsed
|
public List<ISortTerm> SortsParsed
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (Sorts != null)
|
if (Sorts != null)
|
||||||
{
|
{
|
||||||
var value = new List<SortTerm>();
|
var value = new List<ISortTerm>();
|
||||||
foreach (var sort in Sorts.Split(','))
|
foreach (var sort in Sorts.Split(','))
|
||||||
{
|
{
|
||||||
value.Add(new SortTerm(sort));
|
value.Add(new SortTerm(sort));
|
||||||
|
@ -5,7 +5,7 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Sieve.Models
|
namespace Sieve.Models
|
||||||
{
|
{
|
||||||
public class SortTerm
|
public class SortTerm : ISortTerm
|
||||||
{
|
{
|
||||||
private string _sort;
|
private string _sort;
|
||||||
|
|
||||||
|
@ -6,9 +6,9 @@ namespace Sieve.Services
|
|||||||
{
|
{
|
||||||
public interface ISieveProcessor
|
public interface ISieveProcessor
|
||||||
{
|
{
|
||||||
IQueryable<TEntity> ApplyAll<TEntity>(ISieveModel model, IQueryable<TEntity> source, object[] dataForCustomMethods = null);
|
IQueryable<TEntity> ApplyAll<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> source, object[] dataForCustomMethods = null);
|
||||||
IQueryable<TEntity> ApplySorting<TEntity>(ISieveModel model, IQueryable<TEntity> result, object[] dataForCustomMethods = null);
|
IQueryable<TEntity> ApplySorting<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> result, object[] dataForCustomMethods = null);
|
||||||
IQueryable<TEntity> ApplyFiltering<TEntity>(ISieveModel model, IQueryable<TEntity> result, object[] dataForCustomMethods = null);
|
IQueryable<TEntity> ApplyFiltering<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> result, object[] dataForCustomMethods = null);
|
||||||
IQueryable<TEntity> ApplyPagination<TEntity>(ISieveModel model, IQueryable<TEntity> result);
|
IQueryable<TEntity> ApplyPagination<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> result);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -57,7 +57,7 @@ namespace Sieve.Services
|
|||||||
/// <param name="source">Data source</param>
|
/// <param name="source">Data source</param>
|
||||||
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
||||||
/// <returns>Returns a transformed version of `source`</returns>
|
/// <returns>Returns a transformed version of `source`</returns>
|
||||||
public IQueryable<TEntity> ApplyAll<TEntity>(ISieveModel model, IQueryable<TEntity> source, object[] dataForCustomMethods = null)
|
public IQueryable<TEntity> ApplyAll<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> source, object[] dataForCustomMethods = null)
|
||||||
{
|
{
|
||||||
var result = source;
|
var result = source;
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ namespace Sieve.Services
|
|||||||
/// <param name="source">Data source</param>
|
/// <param name="source">Data source</param>
|
||||||
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
||||||
/// <returns>Returns a transformed version of `source`</returns>
|
/// <returns>Returns a transformed version of `source`</returns>
|
||||||
public IQueryable<TEntity> ApplyFiltering<TEntity>(ISieveModel model, IQueryable<TEntity> result, object[] dataForCustomMethods = null)
|
public IQueryable<TEntity> ApplyFiltering<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> result, object[] dataForCustomMethods = null)
|
||||||
{
|
{
|
||||||
if (model?.FiltersParsed == null)
|
if (model?.FiltersParsed == null)
|
||||||
return result;
|
return result;
|
||||||
@ -106,7 +106,7 @@ namespace Sieve.Services
|
|||||||
|
|
||||||
dynamic propertyValue = Expression.PropertyOrField(parameter, property.Name);
|
dynamic propertyValue = Expression.PropertyOrField(parameter, property.Name);
|
||||||
|
|
||||||
if (filterTerm.Operator.Contains("*"))
|
if (filterTerm.OperatorIsCaseInsensitive)
|
||||||
{
|
{
|
||||||
propertyValue = Expression.Call(propertyValue,
|
propertyValue = Expression.Call(propertyValue,
|
||||||
typeof(string).GetMethods()
|
typeof(string).GetMethods()
|
||||||
@ -181,7 +181,7 @@ namespace Sieve.Services
|
|||||||
/// <param name="source">Data source</param>
|
/// <param name="source">Data source</param>
|
||||||
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
||||||
/// <returns>Returns a transformed version of `source`</returns>
|
/// <returns>Returns a transformed version of `source`</returns>
|
||||||
public IQueryable<TEntity> ApplySorting<TEntity>(ISieveModel model, IQueryable<TEntity> result, object[] dataForCustomMethods = null)
|
public IQueryable<TEntity> ApplySorting<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> result, object[] dataForCustomMethods = null)
|
||||||
{
|
{
|
||||||
if (model?.SortsParsed == null)
|
if (model?.SortsParsed == null)
|
||||||
return result;
|
return result;
|
||||||
@ -219,7 +219,7 @@ namespace Sieve.Services
|
|||||||
/// <param name="source">Data source</param>
|
/// <param name="source">Data source</param>
|
||||||
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
/// <param name="dataForCustomMethods">Additional data that will be passed down to custom methods</param>
|
||||||
/// <returns>Returns a transformed version of `source`</returns>
|
/// <returns>Returns a transformed version of `source`</returns>
|
||||||
public IQueryable<TEntity> ApplyPagination<TEntity>(ISieveModel model, IQueryable<TEntity> result)
|
public IQueryable<TEntity> ApplyPagination<TEntity>(ISieveModel<IFilterTerm, ISortTerm> model, IQueryable<TEntity> result)
|
||||||
{
|
{
|
||||||
var page = model?.Page ?? 1;
|
var page = model?.Page ?? 1;
|
||||||
var pageSize = model?.PageSize ?? _options.Value.DefaultPageSize;
|
var pageSize = model?.PageSize ?? _options.Value.DefaultPageSize;
|
||||||
|
Loading…
Reference in New Issue
Block a user