Skip to content

Commit e48e9de

Browse files
committed
FindBy tests all passing again
1 parent 20efb8e commit e48e9de

File tree

14 files changed

+144
-83
lines changed

14 files changed

+144
-83
lines changed

Simple.Data.Ado/AdoAdapter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ internal int Execute(ICommandBuilder commandBuilder, IDbConnection connection)
311311

312312
internal int Execute(ICommandBuilder commandBuilder, IAdapterTransaction transaction)
313313
{
314+
if (transaction == null) return Execute(commandBuilder);
314315
IDbTransaction dbTransaction = ((AdoAdapterTransaction) transaction).DbTransaction;
315316
return Execute(commandBuilder, dbTransaction);
316317
}

Simple.Data.Ado/AdoAdapterTransaction.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,12 @@ public string Name
5353
get { return _name; }
5454
}
5555
}
56+
57+
static class AdoAdapterTransactionEx
58+
{
59+
public static IDbTransaction TransactionOrDefault(this AdoAdapterTransaction transaction)
60+
{
61+
return ReferenceEquals(transaction, null) ? null : transaction.DbTransaction;
62+
}
63+
}
5664
}

Simple.Data.Ado/DeleteExecutor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Simple.Data.Ado
2+
{
3+
using Operations;
4+
5+
internal class DeleteExecutor
6+
{
7+
public static CommandResult Execute(DeleteOperation operation, AdoAdapter adapter,
8+
AdoAdapterTransaction transaction)
9+
{
10+
ICommandBuilder commandBuilder = new DeleteHelper(adapter.GetSchema()).GetDeleteCommand(operation.TableName, operation.Criteria);
11+
return new CommandResult(adapter.Execute(commandBuilder, transaction));
12+
}
13+
}
14+
}

Simple.Data.Ado/ExecutorFactory.cs

Lines changed: 4 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ internal class ExecutorFactory
1515
private static FuncDict CreateFunctionDictionary()
1616
{
1717
ICollection<KeyValuePair<Type, ExecuteFunc>> dict = new FuncDict();
18-
dict.Add(CreateFunction<QueryOperation>(ExecuteQuery));
19-
dict.Add(CreateFunction<InsertOperation>(ExecuteInsert));
20-
dict.Add(CreateFunction<UpdateEntityOperation>(ExecuteUpdateEntity));
18+
dict.Add(CreateFunction<QueryOperation>(QueryExecutor.ExecuteQuery));
19+
dict.Add(CreateFunction<InsertOperation>(InsertExecutor.ExecuteInsert));
20+
dict.Add(CreateFunction<UpdateEntityOperation>(UpdateEntityExecutor.ExecuteUpdateEntity));
21+
dict.Add(CreateFunction<DeleteOperation>(DeleteExecutor.Execute));
2122
return (FuncDict)dict;
2223
}
2324

@@ -27,81 +28,9 @@ private static KeyValuePair<Type, ExecuteFunc> CreateFunction<T>(Func<T, AdoAdap
2728
return new KeyValuePair<Type, ExecuteFunc>(typeof(T), func);
2829
}
2930

30-
private static QueryResult ExecuteQuery(QueryOperation query, AdoAdapter adapter, AdoAdapterTransaction transaction)
31-
{
32-
var queryRunner = new AdoAdapterQueryRunner(adapter, transaction);
33-
IEnumerable<SimpleQueryClauseBase> unhandled;
34-
var data = queryRunner.RunQuery(query.Query, out unhandled);
35-
return new QueryResult(data, unhandled);
36-
}
37-
38-
private static DataResult ExecuteInsert(InsertOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction)
39-
{
40-
var checkedEnumerable = CheckedEnumerable.Create(operation.Data);
41-
if (checkedEnumerable.IsEmpty) return DataResult.Empty;
42-
var inserter = transaction == null ?
43-
new AdoAdapterInserter(adapter)
44-
:
45-
new AdoAdapterInserter(adapter, transaction.DbTransaction);
46-
47-
if (checkedEnumerable.HasMoreThanOneValue)
48-
{
49-
return new DataResult(
50-
inserter.InsertMany(operation.TableName, checkedEnumerable, operation.ErrorCallback,
51-
operation.ResultRequired));
52-
}
53-
return new DataResult(inserter.Insert(operation.TableName, checkedEnumerable.Single, operation.ResultRequired));
54-
}
55-
56-
private static CommandResult ExecuteUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter,
57-
AdoAdapterTransaction transaction)
58-
{
59-
var checkedEnumerable = CheckedEnumerable.Create(operation.Data);
60-
if (checkedEnumerable.IsEmpty) return CommandResult.Empty;
61-
62-
if (checkedEnumerable.HasMoreThanOneValue)
63-
{
64-
return BulkUpdateEntity(operation, adapter, transaction, checkedEnumerable);
65-
}
66-
67-
string[] keyFieldNames = adapter.GetKeyNames(operation.TableName).ToArray();
68-
if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", operation.TableName));
69-
var dict = checkedEnumerable.Single;
70-
71-
return new CommandResult(Update(adapter, operation.TableName, checkedEnumerable.Single, Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict), GetDbTransaction(transaction)));
72-
}
73-
74-
private static int Update(AdoAdapter adapter, string tableName, IReadOnlyDictionary<string, object> data, SimpleExpression criteria, IDbTransaction transaction)
75-
{
76-
ICommandBuilder commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(tableName, data, criteria);
77-
return transaction == null ? adapter.Execute(commandBuilder) : adapter.Execute(commandBuilder, transaction);
78-
}
79-
80-
private static CommandResult BulkUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter,
81-
AdoAdapterTransaction transaction, IEnumerable<IReadOnlyDictionary<string, object>> checkedEnumerable)
82-
{
83-
IBulkUpdater bulkUpdater = adapter.ProviderHelper.GetCustomProvider<IBulkUpdater>(adapter.ConnectionProvider) ??
84-
new BulkUpdater();
85-
if (operation.CriteriaFieldNames != null)
86-
{
87-
return
88-
new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable,
89-
operation.CriteriaFieldNames,
90-
GetDbTransaction(transaction)));
91-
}
92-
return
93-
new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable,
94-
GetDbTransaction(transaction)));
95-
}
96-
9731
public bool TryGet(IOperation operation, out ExecuteFunc func)
9832
{
9933
return Functions.TryGetValue(operation.GetType(), out func);
10034
}
101-
102-
private static IDbTransaction GetDbTransaction(AdoAdapterTransaction transaction)
103-
{
104-
return transaction != null ? transaction.DbTransaction : null;
105-
}
10635
}
10736
}

Simple.Data.Ado/InsertExecutor.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace Simple.Data.Ado
2+
{
3+
using Operations;
4+
5+
internal class InsertExecutor
6+
{
7+
public static DataResult ExecuteInsert(InsertOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction)
8+
{
9+
var checkedEnumerable = CheckedEnumerable.Create(operation.Data);
10+
if (checkedEnumerable.IsEmpty) return DataResult.Empty;
11+
var inserter = transaction == null ?
12+
new AdoAdapterInserter(adapter)
13+
:
14+
new AdoAdapterInserter(adapter, transaction.DbTransaction);
15+
16+
if (checkedEnumerable.HasMoreThanOneValue)
17+
{
18+
return new DataResult(
19+
inserter.InsertMany(operation.TableName, checkedEnumerable, operation.ErrorCallback,
20+
operation.ResultRequired));
21+
}
22+
return new DataResult(inserter.Insert(operation.TableName, checkedEnumerable.Single, operation.ResultRequired));
23+
}
24+
}
25+
}

Simple.Data.Ado/QueryExecutor.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace Simple.Data.Ado
2+
{
3+
using System.Collections.Generic;
4+
using Operations;
5+
6+
internal class QueryExecutor
7+
{
8+
public static QueryResult ExecuteQuery(QueryOperation query, AdoAdapter adapter, AdoAdapterTransaction transaction)
9+
{
10+
var queryRunner = new AdoAdapterQueryRunner(adapter, transaction);
11+
IEnumerable<SimpleQueryClauseBase> unhandled;
12+
var data = queryRunner.RunQuery(query.Query, out unhandled);
13+
return new QueryResult(data, unhandled);
14+
}
15+
}
16+
}

Simple.Data.Ado/Simple.Data.Ado.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
<Compile Include="DbConnectionEx.cs" />
9090
<Compile Include="DbConnectionExtensions.cs" />
9191
<Compile Include="DelegatingConnectionBase1.cs" />
92+
<Compile Include="DeleteExecutor.cs" />
9293
<Compile Include="DeleteHelper.cs" />
9394
<Compile Include="DictionaryExtensions.cs" />
9495
<Compile Include="EagerLoadingEnumerable.cs" />
@@ -110,6 +111,7 @@
110111
<Compile Include="IDbParameterFactory.cs" />
111112
<Compile Include="IExpressionFormatter.cs" />
112113
<Compile Include="IFunctionNameConverter.cs" />
114+
<Compile Include="InsertExecutor.cs" />
113115
<Compile Include="IObservableQueryRunner.cs" />
114116
<Compile Include="IQueryPager.cs" />
115117
<Compile Include="ISchemaGetter.cs" />
@@ -131,6 +133,7 @@
131133
<Compile Include="ProviderHelper.cs" />
132134
<Compile Include="QueryBuilder.cs" />
133135
<Compile Include="QueryBuilderBase.cs" />
136+
<Compile Include="QueryExecutor.cs" />
134137
<Compile Include="SimpleReferenceFormatter.cs" />
135138
<Compile Include="SchemaResolutionException.cs" />
136139
<Compile Include="Schema\AmbiguousObjectNameException.cs" />
@@ -153,6 +156,7 @@
153156
<Compile Include="TraceHelper.cs" />
154157
<Compile Include="TupleExtensions.cs" />
155158
<Compile Include="TypeHelper.cs" />
159+
<Compile Include="UpdateEntityExecutor.cs" />
156160
<Compile Include="UpdateHelper.cs" />
157161
</ItemGroup>
158162
<ItemGroup>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
namespace Simple.Data.Ado
2+
{
3+
using System.Collections.Generic;
4+
using System.Data;
5+
using System.Linq;
6+
using Operations;
7+
8+
internal class UpdateEntityExecutor
9+
{
10+
public static CommandResult ExecuteUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter,
11+
AdoAdapterTransaction transaction)
12+
{
13+
var checkedEnumerable = CheckedEnumerable.Create(operation.Data);
14+
if (checkedEnumerable.IsEmpty) return CommandResult.Empty;
15+
16+
if (checkedEnumerable.HasMoreThanOneValue)
17+
{
18+
return BulkUpdateEntity(operation, adapter, transaction, checkedEnumerable);
19+
}
20+
21+
string[] keyFieldNames = adapter.GetKeyNames(operation.TableName).ToArray();
22+
if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", operation.TableName));
23+
var dict = checkedEnumerable.Single;
24+
25+
return new CommandResult(Update(adapter, operation.TableName, checkedEnumerable.Single, Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict), transaction.TransactionOrDefault()));
26+
}
27+
28+
private static int Update(AdoAdapter adapter, string tableName, IReadOnlyDictionary<string, object> data, SimpleExpression criteria, IDbTransaction transaction)
29+
{
30+
ICommandBuilder commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(tableName, data, criteria);
31+
return transaction == null ? adapter.Execute(commandBuilder) : adapter.Execute(commandBuilder, transaction);
32+
}
33+
34+
private static CommandResult BulkUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter,
35+
AdoAdapterTransaction transaction, IEnumerable<IReadOnlyDictionary<string, object>> checkedEnumerable)
36+
{
37+
IBulkUpdater bulkUpdater = adapter.ProviderHelper.GetCustomProvider<IBulkUpdater>(adapter.ConnectionProvider) ??
38+
new BulkUpdater();
39+
if (operation.CriteriaFieldNames != null)
40+
{
41+
return
42+
new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable,
43+
operation.CriteriaFieldNames, transaction.TransactionOrDefault()));
44+
}
45+
return
46+
new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable,
47+
transaction.TransactionOrDefault()));
48+
}
49+
}
50+
}

Simple.Data.BehaviourTest/FindTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ protected override void SetSchema(MockSchemaProvider schemaProvider)
2222
// ReSharper restore CoVariantArrayConversion
2323
}
2424

25-
private const string UsersColumns = "[dbo].[Users].[Id], [dbo].[Users].[Name], [dbo].[Users].[Password], [dbo].[Users].[Age]";
25+
private const string UsersColumns = "[dbo].[Users].[Id],[dbo].[Users].[Name],[dbo].[Users].[Password],[dbo].[Users].[Age]";
2626
[Test]
2727
public void TestFindEqualWithInt32()
2828
{

Simple.Data.BehaviourTest/NaturalNamingTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ protected override void SetSchema(MockSchemaProvider schemaProvider)
2525
public void DotNetNamingIsCorrectlyResolvedInFind()
2626
{
2727
_db.Customers.Find(_db.Customers.CustomerName == "Arthur");
28-
GeneratedSqlIs("select [dbo].[Customers].[CustomerId], [dbo].[Customers].[Customer_Name] from [dbo].[customers] where [dbo].[customers].[customer_name] = @p1");
28+
GeneratedSqlIs("select [dbo].[Customers].[CustomerId],[dbo].[Customers].[Customer_Name] from [dbo].[customers] where [dbo].[customers].[customer_name] = @p1");
2929
Parameter(0).Is("Arthur");
3030
}
3131

0 commit comments

Comments
 (0)