Skip to content

Commit 782ea4c

Browse files
committed
Fix for issue ThatRendle#186
1 parent 478cc90 commit 782ea4c

29 files changed

Lines changed: 136 additions & 216 deletions

Simple.Data.BehaviourTest/FindTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace Simple.Data.IntegrationTest
22
{
3+
using System;
34
using System.Collections.Generic;
45
using Mocking.Ado;
56
using NUnit.Framework;
@@ -223,6 +224,13 @@ public void TestFindAllByNamedParameterSingleColumn()
223224
Parameter(0).Is("Foo");
224225
}
225226

227+
[Test]
228+
public void TestFindAllByNamedParameterSingleColumnNull()
229+
{
230+
_db.Users.FindAllBy(Name: null).ToList();
231+
GeneratedSqlIs("select [dbo].[Users].[id],[dbo].[Users].[name],[dbo].[Users].[password],[dbo].[Users].[age] from [dbo].[Users] where [dbo].[Users].[name] is null");
232+
}
233+
226234
[Test]
227235
public void TestFindAllByNamedParameterTwoColumns()
228236
{
@@ -249,6 +257,18 @@ public void TestFindAllByDynamic()
249257
GeneratedSqlIs("select [dbo].[Users].[id],[dbo].[Users].[name],[dbo].[Users].[password],[dbo].[Users].[age] from [dbo].[Users] where [dbo].[Users].[name] = @p1");
250258
Parameter(0).Is("Foo");
251259
}
260+
261+
[Test]
262+
public void FindByWithoutArgsThrowsArgumentException()
263+
{
264+
Assert.Throws<ArgumentException>(() => _db.Users.FindBy());
265+
}
266+
267+
[Test]
268+
public void FindAllByWithoutArgsThrowsArgumentException()
269+
{
270+
Assert.Throws<ArgumentException>(() => _db.Users.FindAllBy());
271+
}
252272
}
253273

254274
class MyTable

Simple.Data.SqlTest/GetTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ public void TestGet()
2222
Assert.AreEqual(1, user.Id);
2323
}
2424

25-
[Test]
26-
public void GetWithNonExistentPrimaryKeyShouldReturnNull()
27-
{
28-
var db = DatabaseHelper.Open();
29-
var user = db.Users.Get(1138);
30-
Assert.IsNull(user);
31-
}
25+
[Test]
26+
public void GetWithNonExistentPrimaryKeyShouldReturnNull()
27+
{
28+
var db = DatabaseHelper.Open();
29+
var user = db.Users.Get(1138);
30+
Assert.IsNull(user);
31+
}
3232

3333
[Test]
3434
public void SelectClauseWithGetScalarShouldLimitQuery()

Simple.Data.SqlTest/Simple.Data.SqlTest.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
</CodeAnalysisDependentAssemblyPaths>
6363
</ItemGroup>
6464
<ItemGroup>
65-
<Compile Include="AdventureWorks.cs" />
6665
<Compile Include="BulkInsertTest.cs" />
6766
<Compile Include="ConversionTests.cs" />
6867
<Compile Include="DatabaseHelper.cs" />

Simple.Data/Commands/AllCommand.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
3434
//return new SimpleResultSet(dataStrategy.Find(table.GetQualifiedName(), null)
3535
// .Select(dict => new SimpleRecord(dict, table.GetQualifiedName(), dataStrategy)));
3636
}
37-
38-
public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
39-
{
40-
throw new NotImplementedException();
41-
}
42-
43-
public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
44-
{
45-
throw new NotImplementedException();
46-
}
4737
}
4838
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace Simple.Data.Commands
7+
{
8+
using System.Dynamic;
9+
using Extensions;
10+
11+
internal static class ArgumentHelper
12+
{
13+
internal static void CheckFindArgs(object[] args, InvokeMemberBinder binder)
14+
{
15+
if (args.Length == 0) throw new ArgumentException(binder.Name + "requires arguments.");
16+
if (args.Length == 1)
17+
{
18+
if (ReferenceEquals(args[0], null) && binder.CallInfo.ArgumentNames.Count == 0)
19+
throw new ArgumentException(binder.Name + " does not accept unnamed null argument.");
20+
}
21+
}
22+
23+
internal static IEnumerable<KeyValuePair<string, object>> CreateCriteriaDictionary(InvokeMemberBinder binder, IList<object> args, params string[] exactNames)
24+
{
25+
IDictionary<string, object> criteriaDictionary = null;
26+
if (exactNames.Contains(binder.Name))
27+
{
28+
if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
29+
{
30+
criteriaDictionary = binder.NamedArgumentsToDictionary(args);
31+
}
32+
else if (args.Count == 1)
33+
{
34+
if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument.");
35+
criteriaDictionary = args[0].ObjectToDictionary();
36+
}
37+
}
38+
else
39+
{
40+
criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args);
41+
}
42+
43+
if (criteriaDictionary == null || criteriaDictionary.Count == 0)
44+
{
45+
throw new ArgumentException(binder.Name + " requires an equal number of column names and values to filter data by.");
46+
}
47+
return criteriaDictionary;
48+
}
49+
}
50+
}

Simple.Data/Commands/DeleteAllCommand.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
2727

2828
return deletedCount.ResultSetFromModifiedRowCount();
2929
}
30-
31-
public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
32-
{
33-
throw new NotImplementedException();
34-
}
35-
36-
public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
37-
{
38-
throw new NotImplementedException();
39-
}
4030
}
4131
}

Simple.Data/Commands/DeleteByCommand.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,6 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
1919
return dataStrategy.Run.Delete(table.GetQualifiedName(), criteriaExpression);
2020
}
2121

22-
public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
23-
{
24-
throw new NotImplementedException();
25-
}
26-
27-
public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
28-
{
29-
throw new NotImplementedException();
30-
}
31-
3222
private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table)
3323
{
3424
IDictionary<string, object> criteria;

Simple.Data/Commands/ExistsByCommand.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
3333
var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
3434
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteria).Exists();
3535
}
36-
37-
public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
38-
{
39-
throw new NotImplementedException();
40-
}
41-
42-
public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
43-
{
44-
throw new NotImplementedException();
45-
}
4636
}
4737
}

Simple.Data/Commands/ExistsCommand.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
3636

3737
return query.Exists();
3838
}
39-
40-
public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
41-
{
42-
throw new NotImplementedException();
43-
}
44-
45-
public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
46-
{
47-
throw new NotImplementedException();
48-
}
4939
}
5040
}

Simple.Data/Commands/FindAllByCommand.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,15 @@ public bool IsCommandFor(string method)
1414

1515
public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
1616
{
17-
SimpleExpression criteriaExpression;
1817
if (binder.Name.Equals("FindAllBy") || binder.Name.Equals("find_all_by"))
1918
{
20-
criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), binder.NamedArgumentsToDictionary(args));
19+
ArgumentHelper.CheckFindArgs(args, binder);
2120
}
22-
else
23-
{
24-
criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
25-
}
26-
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteriaExpression);
27-
}
2821

29-
public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
30-
{
31-
throw new NotImplementedException();
32-
}
33-
34-
public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
35-
{
36-
throw new NotImplementedException();
22+
var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindAllBy", "find_all_by");
23+
var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(),
24+
criteriaDictionary);
25+
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteriaExpression);
3726
}
3827
}
3928
}

0 commit comments

Comments
 (0)