Skip to content

Commit 20eebb7

Browse files
committed
exact matching now available
1 parent 5b5788d commit 20eebb7

File tree

7 files changed

+143
-16
lines changed

7 files changed

+143
-16
lines changed

Mvc.JQuery.Datatables.Templates/Content/jquery.dataTables.columnFilter.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,12 @@
314314
if (typeof (aData[j]) != 'object') {
315315
var selected = '';
316316
if (escape(aData[j]) == currentFilter) selected = 'selected '
317-
r += '<option ' + selected + ' value="' + escape(aData[j]) + '">' + aData[j] + '</option>';
317+
r += '<option ' + selected + ' value="' + escape("^" + aData[j] + "$") + '">' + aData[j] + '</option>';
318318
}
319319
else {
320320
var selected = '';
321321
if (escape(aData[j].value) == currentFilter) selected = 'selected '
322-
r += '<option ' + selected + 'value="' + escape(aData[j].value) + '">' + aData[j].label + '</option>';
322+
r += '<option ' + selected + 'value="' + escape(aData[j].value + "$") + '">' + aData[j].label + '</option>';
323323
}
324324
}
325325

@@ -429,7 +429,7 @@
429429

430430
var checked = $.inArray(aData[j], previousValues) > -1;
431431
//check button
432-
r += '<input class="search_init checkbox_filter" type="checkbox" id= "' + aData[j] + '" name= "' + localLabel + '" value="' + aData[j] + '" ' + (checked ? 'checked="checked"' : '') + '>' + aData[j] + '<br/>';
432+
r += '<input class="search_init checkbox_filter" type="checkbox" id= "' + aData[j] + '" name= "' + localLabel + '" value="' + ("^" + aData[j] + "$") + '" ' + (checked ? 'checked="checked"' : '') + '>' + aData[j] + '<br/>';
433433

434434
var checkbox = $(r);
435435
th.html(checkbox);

Mvc.JQuery.Datatables.sln.DotSettings.user

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
<s:Boolean x:Key="/Default/Housekeeping/SolutionSettingsUpgraded/IsUpgraded/@EntryValue">True</s:Boolean>
66
<s:Boolean x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/@KeyIndexDefined">True</s:Boolean>
77
<s:String x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/Name/@EntryValue">ThingsAreCalledCorrectly</s:String>
8-
<s:String x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/XmlSerializedElements/@EntryValue">&lt;Session&gt;&lt;Elements&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe" type="NUnitTestFixtureElement" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestFixtureElement" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe.Linq.SimpleOrder" ParentId="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SimpleOrder" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe.Linq.SimpleOrderAndTransform" ParentId="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SimpleOrderAndTransform" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe.Linq.SingleRecordSearch" ParentId="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SingleRecordSearch" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe.Linq.SortFilterPage" ParentId="Mvc.JQuery.DataTables.Tests.EntityFrameworkCe" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SortFilterPage" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq.SimpleOrder" ParentId="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SimpleOrder" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq.SimpleOrderAndTransform" ParentId="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SimpleOrderAndTransform" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq.SingleRecordSearch" ParentId="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SingleRecordSearch" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq.SortFilterPage" ParentId="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="SortFilterPage" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;/Elements&gt;&lt;/Session&gt;</s:String></wpf:ResourceDictionary>
8+
<s:String x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/XmlSerializedElements/@EntryValue">&lt;Session&gt;&lt;Elements&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFramework" type="NUnitTestFixtureElement" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestFixtureElement" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests" type="NUnitTestFixtureElement" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq.ExecuteParams" ParentId="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="ExecuteParams" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFramework.ExecuteParams" ParentId="Mvc.JQuery.DataTables.Tests.EntityFramework" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.EntityFramework" MethodName="ExecuteParams" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Linq.ExecuteParamsAndTransform" ParentId="Mvc.JQuery.DataTables.Tests.Linq" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="ExecuteParamsAndTransform" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EntityFramework.ExecuteParamsAndTransform" ParentId="Mvc.JQuery.DataTables.Tests.EntityFramework" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Linq" MethodName="ExecuteParamsAndTransform" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" ParentId="Mvc.JQuery.DataTables.Tests.Tests" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.Tests" MethodName="SearchQueryTests" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^1$&amp;quot;,System.Int32,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^2$&amp;quot;,System.Int32,False)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^Ched&amp;quot;,System.String,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^Cheddar&amp;quot;,System.String,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^Cheddar$&amp;quot;,System.String,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^False$&amp;quot;,System.Boolean,False)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;^True$&amp;quot;,System.Boolean,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;1&amp;quot;,System.Int32,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;2&amp;quot;,System.Int32,False)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;asdf&amp;quot;,System.String,False)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;Cheddar&amp;quot;,System.String,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;False&amp;quot;,System.Boolean,False)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests(&amp;quot;True&amp;quot;,System.Boolean,True)" ParentId="Mvc.JQuery.DataTables.Tests.Tests.SearchQueryTests" type="NUnitRowTestElement" /&gt;&lt;/Elements&gt;&lt;/Session&gt;</s:String></wpf:ResourceDictionary>

Mvc.JQuery.Datatables/DataTablesFilter.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
3131
{
3232
var parameters = new List<object>();
3333
var filterClause = GetFilterClause(dtParameters.sSearchColumns[i], columns[i], parameters);
34-
data = data.Where(filterClause, parameters.ToArray());
34+
if (string.IsNullOrWhiteSpace(filterClause) == false)
35+
{
36+
data = data.Where(filterClause, parameters.ToArray());
37+
}
3538
}
3639
}
3740
}
@@ -62,7 +65,7 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
6265

6366
static readonly List<ReturnedFilteredQueryForType> Filters = new List<ReturnedFilteredQueryForType>()
6467
{
65-
68+
Guard(IsBoolType, TypeFilters.BoolFilter),
6669
Guard(IsDateTimeType, TypeFilters.DateTimeFilter),
6770
Guard(IsDateTimeOffsetType, TypeFilters.DateTimeOffsetFilter),
6871
Guard(IsNumericType, TypeFilters.NumericFilter),
@@ -100,7 +103,7 @@ private static string GetFilterClause(string query, ColInfo column, List<object>
100103
}
101104
}
102105
var parts = query.Split('~').SelectMany(s => s.Split('|'))
103-
.Select(q => string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", TypeFilters.FilterMethod(q), column.Name));
106+
.Select(q => string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", TypeFilters.FilterMethod(q, parametersForLinqQuery, column.Type), column.Name));
104107
return "(" + string.Join(") OR (", parts) + ")";
105108
}
106109

@@ -135,9 +138,13 @@ public static bool IsNumericType(Type type)
135138
return false;
136139

137140
}
141+
public static bool IsBoolType(Type type)
142+
{
143+
return type == typeof(bool) || type == typeof(bool?);
144+
}
138145
public static bool IsDateTimeType(Type type)
139146
{
140-
return type == typeof(DateTime) || type == typeof(DateTime?) ;
147+
return type == typeof(DateTime) || type == typeof(DateTime?);
141148
}
142149
public static bool IsDateTimeOffsetType(Type type)
143150
{

Mvc.JQuery.Datatables/TypeFilters.cs

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,40 @@ namespace Mvc.JQuery.Datatables
66
{
77
static class TypeFilters
88
{
9-
internal static string FilterMethod(string q)
9+
internal static string FilterMethod(string q, List<object> parametersForLinqQuery, Type type)
1010
{
11+
Func<string, string, string> makeClause = ( method, query) =>
12+
{
13+
parametersForLinqQuery.Add(Convert.ChangeType(query, type));
14+
var indexOfParameter = parametersForLinqQuery.Count - 1;
15+
return string.Format("{0}(@{1})", method, indexOfParameter);
16+
};
1117
if (q.StartsWith("^"))
1218
{
13-
return "ToLower().StartsWith(\"" + q.ToLower().Substring(1).Replace("\"", "\"\"") + "\")";
19+
if (q.EndsWith("$"))
20+
{
21+
parametersForLinqQuery.Add(Convert.ChangeType(q.Substring(1, q.Length -2), type));
22+
var indexOfParameter = parametersForLinqQuery.Count - 1;
23+
return string.Format("Equals((object)@{0})", indexOfParameter);
24+
}
25+
return makeClause("StartsWith", q.Substring(1));
1426
}
1527
else
1628
{
17-
return "ToLower().Contains(\"" + q.ToLower().Replace("\"", "\"\"") + "\")";
29+
if (q.EndsWith("$"))
30+
{
31+
return makeClause("EndsWith", q.Substring(0, q.Length - 1));
32+
}
33+
return makeClause("Contains", q);
1834
}
1935
}
2036
public static string NumericFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
2137
{
38+
if (query.StartsWith("^")) query = query.TrimStart('^');
39+
if (query.EndsWith("$")) query = query.TrimEnd('$');
40+
41+
if (query == "~") return string.Empty;
42+
2243
if (query.Contains("~"))
2344
{
2445
var parts = query.Split('~');
@@ -49,7 +70,7 @@ public static string NumericFilter(string query, string columnname, Type columnT
4970
try
5071
{
5172
parametersForLinqQuery.Add(Convert.ChangeType(query, columnType));
52-
return string.Format("{0} == @{1}", columnname, parametersForLinqQuery.Count - 1);
73+
return string.Format("{0}.Equals(@{1})", columnname, parametersForLinqQuery.Count - 1);
5374
}
5475
catch (FormatException)
5576
{
@@ -60,6 +81,8 @@ public static string NumericFilter(string query, string columnname, Type columnT
6081

6182
public static string DateTimeOffsetFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
6283
{
84+
if (query == "~") return string.Empty;
85+
6386
if (query.Contains("~"))
6487
{
6588
var parts = query.Split('~');
@@ -73,11 +96,12 @@ public static string DateTimeOffsetFilter(string query, string columnname, Type
7396
}
7497
else
7598
{
76-
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query), columnname);
99+
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query, parametersForLinqQuery, columnType), columnname);
77100
}
78101
}
79102
public static string DateTimeFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
80103
{
104+
if (query == "~") return string.Empty;
81105
if (query.Contains("~"))
82106
{
83107
var parts = query.Split('~');
@@ -91,19 +115,47 @@ public static string DateTimeFilter(string query, string columnname, Type column
91115
}
92116
else
93117
{
94-
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query), columnname);
118+
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query, parametersForLinqQuery, columnType), columnname);
95119
}
96120
}
121+
public static string BoolFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
122+
{
123+
if (query != null)
124+
query = query.TrimStart('^').TrimEnd('$');
125+
if (string.IsNullOrWhiteSpace(query)) return columnname + " == null";
126+
if (query.ToLower() == "true") return columnname + " == true";
127+
return columnname + " == false";
128+
129+
}
97130

98131
public static string StringFilter(string q, string columnname, Type columntype, List<object> parametersforlinqquery)
99132
{
133+
if (q == ".*") return "";
100134
if (q.StartsWith("^"))
101135
{
102-
return "(!string.IsNullOrEmpty(" + columnname + ") && " + columnname + ".ToLower().StartsWith(\"" + q.ToLower().Replace("\"", "\"\"") + "\"))";
136+
if (q.EndsWith("$"))
137+
{
138+
parametersforlinqquery.Add(q.Substring(1, q.Length - 2));
139+
var parameterArg = "@" + (parametersforlinqquery.Count - 1);
140+
return string.Format("{0} == {1}", columnname, parameterArg);
141+
142+
}
143+
else
144+
{
145+
parametersforlinqquery.Add(q.Substring(1));
146+
var parameterArg = "@" + (parametersforlinqquery.Count - 1);
147+
return string.Format("({0} != null && {0} != \"\" && ({0} == {1} || {0}.StartsWith({1})))", columnname, parameterArg);
148+
}
103149
}
104150
else
105151
{
106-
return "(!string.IsNullOrEmpty(" + columnname + ") && " + columnname + ".ToLower().Contains(\"" + q.ToLower().Replace("\"", "\"\"") + "\"))";
152+
parametersforlinqquery.Add(q);
153+
var parameterArg = "@" + (parametersforlinqquery.Count - 1);
154+
//return string.Format("{0} == {1}", columnname, parameterArg);
155+
return
156+
string.Format(
157+
"({0} != null && {0} != \"\" && ({0} == {1} || {0}.StartsWith({1}) || {0}.Contains({1})))",
158+
columnname, parameterArg);
107159
}
108160
}
109161
}

Mvc.Jquery.DataTables.Tests/DummyPocos/SomeModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@ public class SomeModel
1010
public string DisplayName { get; set; }
1111
public int Category { get; set; }
1212
public double Scale { get; set; }
13+
14+
public bool Discounted { get; set; }
1315
}
1416
}

Mvc.Jquery.DataTables.Tests/Mvc.JQuery.DataTables.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
<Compile Include="DummyPocos\SomeView.cs" />
5757
<Compile Include="Fixtures\EntityFramework.cs" />
5858
<Compile Include="Fixtures\Linq.cs" />
59+
<Compile Include="NumericFilterTests.cs" />
5960
<Compile Include="Properties\AssemblyInfo.cs" />
6061
</ItemGroup>
6162
<ItemGroup>

0 commit comments

Comments
 (0)