Skip to content

Commit

Permalink
Fix for issue markrendle#186
Browse files Browse the repository at this point in the history
  • Loading branch information
markrendle committed May 9, 2012
1 parent 478cc90 commit 782ea4c
Show file tree
Hide file tree
Showing 29 changed files with 136 additions and 216 deletions.
20 changes: 20 additions & 0 deletions Simple.Data.BehaviourTest/FindTest.cs
@@ -1,5 +1,6 @@
namespace Simple.Data.IntegrationTest
{
using System;
using System.Collections.Generic;
using Mocking.Ado;
using NUnit.Framework;
Expand Down Expand Up @@ -223,6 +224,13 @@ public void TestFindAllByNamedParameterSingleColumn()
Parameter(0).Is("Foo");
}

[Test]
public void TestFindAllByNamedParameterSingleColumnNull()
{
_db.Users.FindAllBy(Name: null).ToList();
GeneratedSqlIs("select [dbo].[Users].[id],[dbo].[Users].[name],[dbo].[Users].[password],[dbo].[Users].[age] from [dbo].[Users] where [dbo].[Users].[name] is null");
}

[Test]
public void TestFindAllByNamedParameterTwoColumns()
{
Expand All @@ -249,6 +257,18 @@ public void TestFindAllByDynamic()
GeneratedSqlIs("select [dbo].[Users].[id],[dbo].[Users].[name],[dbo].[Users].[password],[dbo].[Users].[age] from [dbo].[Users] where [dbo].[Users].[name] = @p1");
Parameter(0).Is("Foo");
}

[Test]
public void FindByWithoutArgsThrowsArgumentException()
{
Assert.Throws<ArgumentException>(() => _db.Users.FindBy());
}

[Test]
public void FindAllByWithoutArgsThrowsArgumentException()
{
Assert.Throws<ArgumentException>(() => _db.Users.FindAllBy());
}
}

class MyTable
Expand Down
14 changes: 7 additions & 7 deletions Simple.Data.SqlTest/GetTests.cs
Expand Up @@ -22,13 +22,13 @@ public void TestGet()
Assert.AreEqual(1, user.Id);
}

[Test]
public void GetWithNonExistentPrimaryKeyShouldReturnNull()
{
var db = DatabaseHelper.Open();
var user = db.Users.Get(1138);
Assert.IsNull(user);
}
[Test]
public void GetWithNonExistentPrimaryKeyShouldReturnNull()
{
var db = DatabaseHelper.Open();
var user = db.Users.Get(1138);
Assert.IsNull(user);
}

[Test]
public void SelectClauseWithGetScalarShouldLimitQuery()
Expand Down
1 change: 0 additions & 1 deletion Simple.Data.SqlTest/Simple.Data.SqlTest.csproj
Expand Up @@ -62,7 +62,6 @@
</CodeAnalysisDependentAssemblyPaths>
</ItemGroup>
<ItemGroup>
<Compile Include="AdventureWorks.cs" />
<Compile Include="BulkInsertTest.cs" />
<Compile Include="ConversionTests.cs" />
<Compile Include="DatabaseHelper.cs" />
Expand Down
10 changes: 0 additions & 10 deletions Simple.Data/Commands/AllCommand.cs
Expand Up @@ -34,15 +34,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
//return new SimpleResultSet(dataStrategy.Find(table.GetQualifiedName(), null)
// .Select(dict => new SimpleRecord(dict, table.GetQualifiedName(), dataStrategy)));
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
50 changes: 50 additions & 0 deletions Simple.Data/Commands/ArgumentHelper.cs
@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Simple.Data.Commands
{
using System.Dynamic;
using Extensions;

internal static class ArgumentHelper
{
internal static void CheckFindArgs(object[] args, InvokeMemberBinder binder)
{
if (args.Length == 0) throw new ArgumentException(binder.Name + "requires arguments.");
if (args.Length == 1)
{
if (ReferenceEquals(args[0], null) && binder.CallInfo.ArgumentNames.Count == 0)
throw new ArgumentException(binder.Name + " does not accept unnamed null argument.");
}
}

internal static IEnumerable<KeyValuePair<string, object>> CreateCriteriaDictionary(InvokeMemberBinder binder, IList<object> args, params string[] exactNames)
{
IDictionary<string, object> criteriaDictionary = null;
if (exactNames.Contains(binder.Name))
{
if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
{
criteriaDictionary = binder.NamedArgumentsToDictionary(args);
}
else if (args.Count == 1)
{
if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument.");
criteriaDictionary = args[0].ObjectToDictionary();
}
}
else
{
criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args);
}

if (criteriaDictionary == null || criteriaDictionary.Count == 0)
{
throw new ArgumentException(binder.Name + " requires an equal number of column names and values to filter data by.");
}
return criteriaDictionary;
}
}
}
10 changes: 0 additions & 10 deletions Simple.Data/Commands/DeleteAllCommand.cs
Expand Up @@ -27,15 +27,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe

return deletedCount.ResultSetFromModifiedRowCount();
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
10 changes: 0 additions & 10 deletions Simple.Data/Commands/DeleteByCommand.cs
Expand Up @@ -19,16 +19,6 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
return dataStrategy.Run.Delete(table.GetQualifiedName(), criteriaExpression);
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table)
{
IDictionary<string, object> criteria;
Expand Down
10 changes: 0 additions & 10 deletions Simple.Data/Commands/ExistsByCommand.cs
Expand Up @@ -33,15 +33,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteria).Exists();
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
10 changes: 0 additions & 10 deletions Simple.Data/Commands/ExistsCommand.cs
Expand Up @@ -36,15 +36,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe

return query.Exists();
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
21 changes: 5 additions & 16 deletions Simple.Data/Commands/FindAllByCommand.cs
Expand Up @@ -14,26 +14,15 @@ public bool IsCommandFor(string method)

public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
SimpleExpression criteriaExpression;
if (binder.Name.Equals("FindAllBy") || binder.Name.Equals("find_all_by"))
{
criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), binder.NamedArgumentsToDictionary(args));
ArgumentHelper.CheckFindArgs(args, binder);
}
else
{
criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
}
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteriaExpression);
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindAllBy", "find_all_by");
var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(),
criteriaDictionary);
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteriaExpression);
}
}
}
10 changes: 0 additions & 10 deletions Simple.Data/Commands/FindAllCommand.cs
Expand Up @@ -37,15 +37,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe

return null;
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
12 changes: 4 additions & 8 deletions Simple.Data/Commands/FindByCommand.cs
Expand Up @@ -9,7 +9,7 @@ namespace Simple.Data.Commands
using System.Reflection;
using Extensions;

class FindByCommand : ICommand
class FindByCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand
{
public bool IsCommandFor(string method)
{
Expand All @@ -22,15 +22,11 @@ public bool IsCommandFor(string method)

if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by"))
{
if (args.Length == 0) throw new ArgumentException("FindBy requires arguments.");
if (args.Length == 1)
{
if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument.");
if (args[0].GetType().Namespace == null) return null;
}
ArgumentHelper.CheckFindArgs(args, binder);
if (args.Length == 1 && args[0].IsAnonymous()) return null;
}

var criteriaDictionary = CreateCriteriaDictionary(binder, args);
var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindBy", "find_by");
if (criteriaDictionary == null) return null;

var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary);
Expand Down
7 changes: 1 addition & 6 deletions Simple.Data/Commands/FindCommand.cs
Expand Up @@ -6,7 +6,7 @@

namespace Simple.Data.Commands
{
class FindCommand : ICommand
class FindCommand : ICommand, IQueryCompatibleCommand
{
/// <summary>
/// Determines whether the instance is able to handle the specified method.
Expand Down Expand Up @@ -43,10 +43,5 @@ public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMember
{
return query.Where((SimpleExpression) args[0]).Take(1).FirstOrDefault();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
2 changes: 1 addition & 1 deletion Simple.Data/Commands/GetCommand.cs
Expand Up @@ -8,7 +8,7 @@ namespace Simple.Data.Commands
{
using Extensions;

public class GetCommand : ICommand
public class GetCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand
{
public bool IsCommandFor(string method)
{
Expand Down
10 changes: 0 additions & 10 deletions Simple.Data/Commands/GetCountByCommand.cs
Expand Up @@ -30,15 +30,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
return new SimpleQuery(dataStrategy, table.GetQualifiedName()).Where(criteria).Count();
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
10 changes: 0 additions & 10 deletions Simple.Data/Commands/GetCountCommand.cs
Expand Up @@ -39,15 +39,5 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe

return query.Count();
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}
}
}
8 changes: 8 additions & 0 deletions Simple.Data/Commands/ICommand.cs
Expand Up @@ -27,8 +27,16 @@ interface ICommand
/// <returns></returns>
object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args);


}

interface IQueryCompatibleCommand
{
object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args);
}

interface ICreateDelegate
{
Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder,
object[] args);
}
Expand Down
10 changes: 0 additions & 10 deletions Simple.Data/Commands/InsertCommand.cs
Expand Up @@ -23,16 +23,6 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe
return ResultHelper.TypeResult(result, table, dataStrategy);
}

public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

public Func<object[], object> CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
{
throw new NotImplementedException();
}

private static object DoInsert(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName)
{
if (binder.HasSingleUnnamedArgument())
Expand Down

0 comments on commit 782ea4c

Please sign in to comment.