Skip to content

Commit 8b98c7d

Browse files
committed
End date is now inclusive (i.e. return results < endDate.Date.AddDays(1))
1 parent e732c64 commit 8b98c7d

File tree

2 files changed

+54
-34
lines changed

2 files changed

+54
-34
lines changed

Mvc.JQuery.Datatables/DataTablesFilter.cs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public IQueryable<T> FilterPagingSortingSearch<T>(DataTablesParam dtParameters,
6868
}
6969

7070
public delegate string ReturnedFilteredQueryForType(
71-
string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
71+
string query, string columnName, ColInfo columnType, List<object> parametersForLinqQuery);
7272

7373

7474
private static readonly List<ReturnedFilteredQueryForType> Filters = new List<ReturnedFilteredQueryForType>()
@@ -78,14 +78,14 @@ public delegate string ReturnedFilteredQueryForType(
7878
Guard(IsDateTimeOffsetType, TypeFilters.DateTimeOffsetFilter),
7979
Guard(IsNumericType, TypeFilters.NumericFilter),
8080
Guard(IsEnumType, TypeFilters.EnumFilter),
81-
Guard(arg => arg == typeof (string), TypeFilters.StringFilter),
81+
Guard(arg => arg.Type == typeof (string), TypeFilters.StringFilter),
8282
};
8383

8484

8585
public delegate string GuardedFilter(
86-
string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
86+
string query, string columnName, ColInfo columnType, List<object> parametersForLinqQuery);
8787

88-
private static ReturnedFilteredQueryForType Guard(Func<Type, bool> guard, GuardedFilter filter)
88+
private static ReturnedFilteredQueryForType Guard(Func<ColInfo, bool> guard, GuardedFilter filter)
8989
{
9090
return (q, c, t, p) =>
9191
{
@@ -106,7 +106,7 @@ private static string GetFilterClause(string query, ColInfo column, List<object>
106106
{
107107
Func<string, string> filterClause = (queryPart) =>
108108
Filters.Select(
109-
f => f(queryPart, column.Name, column.Type, parametersForLinqQuery))
109+
f => f(queryPart, column.Name, column, parametersForLinqQuery))
110110
.FirstOrDefault(filterPart => filterPart != null) ?? "";
111111

112112
var queryParts = query.Split('|').Select(filterClause).Where(fc => fc != "").ToArray();
@@ -118,7 +118,13 @@ private static string GetFilterClause(string query, ColInfo column, List<object>
118118
}
119119

120120

121-
public static bool IsNumericType(Type type)
121+
public static bool IsNumericType(ColInfo colInfo)
122+
{
123+
var type = colInfo.Type;
124+
return IsNumericType(type);
125+
}
126+
127+
private static bool IsNumericType(Type type)
122128
{
123129
if (type == null || type.IsEnum)
124130
{
@@ -140,31 +146,31 @@ public static bool IsNumericType(Type type)
140146
case TypeCode.UInt64:
141147
return true;
142148
case TypeCode.Object:
143-
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
149+
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof (Nullable<>))
144150
{
145151
return IsNumericType(Nullable.GetUnderlyingType(type));
146152
}
147153
return false;
148154
}
149155
return false;
150-
151156
}
152-
public static bool IsEnumType(Type type)
157+
158+
public static bool IsEnumType(ColInfo colInfo)
153159
{
154-
return type.IsEnum;
160+
return colInfo.Type.IsEnum;
155161
}
156162

157-
public static bool IsBoolType(Type type)
163+
public static bool IsBoolType(ColInfo colInfo)
158164
{
159-
return type == typeof(bool) || type == typeof(bool?);
165+
return colInfo.Type == typeof(bool) || colInfo.Type == typeof(bool?);
160166
}
161-
public static bool IsDateTimeType(Type type)
167+
public static bool IsDateTimeType(ColInfo colInfo)
162168
{
163-
return type == typeof(DateTime) || type == typeof(DateTime?);
169+
return colInfo.Type == typeof(DateTime) || colInfo.Type == typeof(DateTime?);
164170
}
165-
public static bool IsDateTimeOffsetType(Type type)
171+
public static bool IsDateTimeOffsetType(ColInfo colInfo)
166172
{
167-
return type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?);
173+
return colInfo.Type == typeof(DateTimeOffset) || colInfo.Type == typeof(DateTimeOffset?);
168174
}
169175

170176
}

Mvc.JQuery.Datatables/TypeFilters.cs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ internal static string FilterMethod(string q, List<object> parametersForLinqQuer
3838
return makeClause("Contains", q);
3939
}
4040
}
41-
public static string NumericFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
41+
public static string NumericFilter(string query, string columnname, ColInfo colInfo, List<object> parametersForLinqQuery)
4242
{
4343
if (query.StartsWith("^")) query = query.TrimStart('^');
4444
if (query.EndsWith("$")) query = query.TrimEnd('$');
@@ -51,7 +51,7 @@ public static string NumericFilter(string query, string columnname, Type columnT
5151
var clause = null as string;
5252
try
5353
{
54-
parametersForLinqQuery.Add(Convert.ChangeType(parts[0], columnType));
54+
parametersForLinqQuery.Add(Convert.ChangeType(parts[0], colInfo.Type));
5555
clause = string.Format("{0} >= @{1}", columnname, parametersForLinqQuery.Count - 1);
5656
}
5757
catch (FormatException)
@@ -60,7 +60,7 @@ public static string NumericFilter(string query, string columnname, Type columnT
6060

6161
try
6262
{
63-
parametersForLinqQuery.Add(Convert.ChangeType(parts[1], columnType));
63+
parametersForLinqQuery.Add(Convert.ChangeType(parts[1], colInfo.Type));
6464
if (clause != null) clause += " and ";
6565
clause += string.Format("{0} <= @{1}", columnname, parametersForLinqQuery.Count - 1);
6666
}
@@ -74,7 +74,7 @@ public static string NumericFilter(string query, string columnname, Type columnT
7474
{
7575
try
7676
{
77-
parametersForLinqQuery.Add(Convert.ChangeType(query, columnType));
77+
parametersForLinqQuery.Add(Convert.ChangeType(query, colInfo.Type));
7878
return string.Format("{0} == @{1}", columnname, parametersForLinqQuery.Count - 1);
7979
}
8080
catch (FormatException)
@@ -84,7 +84,7 @@ public static string NumericFilter(string query, string columnname, Type columnT
8484
}
8585
}
8686

87-
public static string DateTimeOffsetFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
87+
public static string DateTimeOffsetFilter(string query, string columnname, ColInfo colInfo, List<object> parametersForLinqQuery)
8888
{
8989
if (query == "~") return string.Empty;
9090

@@ -93,37 +93,51 @@ public static string DateTimeOffsetFilter(string query, string columnname, Type
9393
var parts = query.Split('~');
9494
DateTimeOffset start, end;
9595
DateTimeOffset.TryParse(parts[0] ?? "", out start);
96-
if (!DateTimeOffset.TryParse(parts[1] ?? "", out end)) end = DateTimeOffset.MaxValue;
96+
if (!DateTimeOffset.TryParse(parts[1] ?? "", out end))
97+
{
98+
end = DateTimeOffset.MaxValue;
99+
}
100+
else
101+
{
102+
end = end.Date.AddDays(1);
103+
}
97104

98105
parametersForLinqQuery.Add(start);
99-
parametersForLinqQuery.Add(end);
100-
return string.Format("{0} >= @{1} and {0} <= @{2}", columnname, parametersForLinqQuery.Count - 2, parametersForLinqQuery.Count - 1);
106+
parametersForLinqQuery.Add(end.AddDays(1).AddSeconds(-1));
107+
return string.Format("{0} >= @{1} and {0} < @{2}", columnname, parametersForLinqQuery.Count - 2, parametersForLinqQuery.Count - 1);
101108
}
102109
else
103110
{
104-
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query, parametersForLinqQuery, columnType), columnname);
111+
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query, parametersForLinqQuery, colInfo.Type), columnname);
105112
}
106113
}
107-
public static string DateTimeFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
114+
public static string DateTimeFilter(string query, string columnname, ColInfo colInfo, List<object> parametersForLinqQuery)
108115
{
109116
if (query == "~") return string.Empty;
110117
if (query.Contains("~"))
111118
{
112119
var parts = query.Split('~');
113120
DateTime start, end;
114121
DateTime.TryParse(parts[0] ?? "", out start);
115-
if (!DateTime.TryParse(parts[1] ?? "", out end)) end = DateTime.MaxValue;
122+
if (!DateTime.TryParse(parts[1] ?? "", out end))
123+
{
124+
end = DateTime.MaxValue;
125+
}
126+
else
127+
{
128+
end = end.Date.AddDays(1);
129+
}
116130

117131
parametersForLinqQuery.Add(start);
118132
parametersForLinqQuery.Add(end);
119-
return string.Format("{0} >= @{1} and {0} <= @{2}", columnname, parametersForLinqQuery.Count - 2, parametersForLinqQuery.Count - 1);
133+
return string.Format("{0} >= @{1} and {0} < @{2}", columnname, parametersForLinqQuery.Count - 2, parametersForLinqQuery.Count - 1);
120134
}
121135
else
122136
{
123-
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query, parametersForLinqQuery, columnType), columnname);
137+
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query, parametersForLinqQuery, colInfo.Type), columnname);
124138
}
125139
}
126-
public static string BoolFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
140+
public static string BoolFilter(string query, string columnname, ColInfo colInfo, List<object> parametersForLinqQuery)
127141
{
128142
if (query != null)
129143
query = query.TrimStart('^').TrimEnd('$');
@@ -133,15 +147,15 @@ public static string BoolFilter(string query, string columnname, Type columnType
133147
if (query.ToLower() == "true") return columnname + " == true";
134148
return columnname + " == false";
135149
}
136-
if (columnType == typeof (bool?))
150+
if (colInfo.Type == typeof(bool?))
137151
{
138152
if (lowerCaseQuery == "null") return columnname + " == null";
139153
}
140154
return null;
141155

142156
}
143157

144-
public static string StringFilter(string q, string columnname, Type columntype, List<object> parametersforlinqquery)
158+
public static string StringFilter(string q, string columnname, ColInfo columntype, List<object> parametersforlinqquery)
145159
{
146160
if (q == ".*") return "";
147161
if (q.StartsWith("^"))
@@ -172,12 +186,12 @@ public static string StringFilter(string q, string columnname, Type columntype,
172186
}
173187
}
174188

175-
public static string EnumFilter(string q, string columnname, Type type, List<object> parametersForLinqQuery)
189+
public static string EnumFilter(string q, string columnname, ColInfo colInfo, List<object> parametersForLinqQuery)
176190
{
177191

178192
if (q.StartsWith("^")) q = q.Substring(1);
179193
if (q.EndsWith("$")) q = q.Substring(0, q.Length - 1);
180-
parametersForLinqQuery.Add(ParseValue(q, type));
194+
parametersForLinqQuery.Add(ParseValue(q, colInfo.Type));
181195
return columnname + " == @" + (parametersForLinqQuery.Count - 1);
182196
}
183197
}

0 commit comments

Comments
 (0)