/
SieveModel.cs
106 lines (91 loc) · 3.18 KB
/
SieveModel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
namespace Sieve.Models
{
public class SieveModel : SieveModel<FilterTerm, SortTerm> { }
[DataContract]
public class SieveModel<TFilterTerm, TSortTerm> : ISieveModel<TFilterTerm, TSortTerm>
where TFilterTerm : IFilterTerm, new()
where TSortTerm : ISortTerm, new()
{
/// <summary>
/// Pattern used to split filters and sorts by comma.
/// </summary>
private const string EscapedCommaPattern = @"(?<!($|[^\\])(\\\\)*?\\),\s*";
/// <summary>
/// Escaped comma e.g. used in filter filter string.
/// </summary>
private const string EscapedComma = @"\,";
[DataMember]
public string Filters { get; set; }
[DataMember]
public string Sorts { get; set; }
[DataMember, Range(1, int.MaxValue)]
public int? Page { get; set; }
[DataMember, Range(1, int.MaxValue)]
public int? PageSize { get; set; }
public List<TFilterTerm> GetFiltersParsed()
{
if (Filters != null)
{
var value = new List<TFilterTerm>();
foreach (var filter in Regex.Split(Filters, EscapedCommaPattern))
{
if (string.IsNullOrWhiteSpace(filter))
{
continue;
}
var filterValue = filter.Replace(EscapedComma, ",");
if (filter.StartsWith("("))
{
var filterOpAndVal = filterValue[(filterValue.LastIndexOf(")", StringComparison.Ordinal) + 1)..];
var subFilters = filterValue.Replace(filterOpAndVal, "").Replace("(", "").Replace(")", "");
var filterTerm = new TFilterTerm
{
Filter = subFilters + filterOpAndVal
};
value.Add(filterTerm);
}
else
{
var filterTerm = new TFilterTerm
{
Filter = filterValue
};
value.Add(filterTerm);
}
}
return value;
}
else
{
return null;
}
}
public List<TSortTerm> GetSortsParsed()
{
if (Sorts == null)
{
return null;
}
var value = new List<TSortTerm>();
foreach (var sort in Regex.Split(Sorts, EscapedCommaPattern))
{
if (string.IsNullOrWhiteSpace(sort)) continue;
var sortTerm = new TSortTerm
{
Sort = sort
};
if (value.All(s => s.Name != sortTerm.Name))
{
value.Add(sortTerm);
}
}
return value;
}
}
}