Skip to content

Commit 80dfc60

Browse files
committed
Refactor: AdoAdapterQueryRunner
1 parent d5f5ae6 commit 80dfc60

4 files changed

Lines changed: 202 additions & 160 deletions

File tree

Simple.Data.Ado/AdoAdapter.cs

Lines changed: 4 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ private AdoAdapterRelatedFinder CreateRelatedFinder()
243243

244244
public override IDictionary<string, object> Get(string tableName, params object[] keyValues)
245245
{
246+
// We don't need to implement Get because we provide a delegate for this operation...
246247
throw new NotImplementedException();
247248
}
248249

@@ -266,136 +267,9 @@ public override IEnumerable<IDictionary<string, object>> RunQuery(SimpleQuery qu
266267
out IEnumerable<SimpleQueryClauseBase>
267268
unhandledClauses)
268269
{
269-
if (query.Clauses.OfType<WithCountClause>().Any()) return RunQueryWithCount(query, out unhandledClauses);
270-
271-
ICommandBuilder[] commandBuilders = GetQueryCommandBuilders(query, out unhandledClauses);
272-
IDbConnection connection = CreateConnection();
273-
if (ProviderSupportsCompoundStatements || commandBuilders.Length == 1)
274-
{
275-
return
276-
CommandBuilder.CreateCommand(
277-
_providerHelper.GetCustomProvider<IDbParameterFactory>(_schema.SchemaProvider), commandBuilders,
278-
connection).ToEnumerable(this.CreateConnection);
279-
}
280-
else
281-
{
282-
return commandBuilders.SelectMany(cb => cb.GetCommand(connection).ToEnumerable(this.CreateConnection));
283-
}
284-
}
285-
286-
private IEnumerable<IDictionary<string, object>> RunQueryWithCount(SimpleQuery query,
287-
out IEnumerable<SimpleQueryClauseBase>
288-
unhandledClauses)
289-
{
290-
WithCountClause withCountClause;
291-
try
292-
{
293-
withCountClause = query.Clauses.OfType<WithCountClause>().First();
294-
}
295-
catch (InvalidOperationException)
296-
{
297-
// Rethrow with meaning.
298-
throw new InvalidOperationException("No WithCountClause specified.");
299-
}
300-
301-
query = query.ClearWithTotalCount();
302-
SimpleQuery countQuery =
303-
query.ClearSkip().ClearTake().ClearOrderBy().ReplaceSelect(new CountSpecialReference());
304-
var unhandledClausesList = new List<IEnumerable<SimpleQueryClauseBase>>
305-
{
306-
Enumerable.Empty<SimpleQueryClauseBase>(),
307-
Enumerable.Empty<SimpleQueryClauseBase>()
308-
};
309-
310-
using (
311-
IEnumerator<IEnumerable<IDictionary<string, object>>> enumerator =
312-
RunQueries(new[] {countQuery, query}, unhandledClausesList).GetEnumerator())
313-
{
314-
unhandledClauses = unhandledClausesList[1];
315-
if (!enumerator.MoveNext())
316-
{
317-
throw new InvalidOperationException();
318-
}
319-
IDictionary<string, object> countRow = enumerator.Current.Single();
320-
withCountClause.SetCount((int) countRow.First().Value);
321-
if (!enumerator.MoveNext())
322-
{
323-
throw new InvalidOperationException();
324-
}
325-
return enumerator.Current;
326-
}
327-
}
328-
329-
private ICommandBuilder[] GetPagedQueryCommandBuilders(SimpleQuery query,
330-
out IEnumerable<SimpleQueryClauseBase> unhandledClauses)
331-
{
332-
return GetPagedQueryCommandBuilders(query, -1, out unhandledClauses);
270+
return new AdoAdapterQueryRunner(this).RunQuery(query, out unhandledClauses);
333271
}
334272

335-
private ICommandBuilder[] GetPagedQueryCommandBuilders(SimpleQuery query, Int32 bulkIndex,
336-
out IEnumerable<SimpleQueryClauseBase> unhandledClauses)
337-
{
338-
var commandBuilders = new List<ICommandBuilder>();
339-
var unhandledClausesList = new List<SimpleQueryClauseBase>();
340-
unhandledClauses = unhandledClausesList;
341-
342-
IEnumerable<SimpleQueryClauseBase> unhandledClausesForPagedQuery;
343-
ICommandBuilder mainCommandBuilder = new QueryBuilder(this, bulkIndex).Build(query,
344-
out
345-
unhandledClausesForPagedQuery);
346-
unhandledClausesList.AddRange(unhandledClausesForPagedQuery);
347-
348-
const int maxInt = 2147483646;
349-
350-
SkipClause skipClause = query.Clauses.OfType<SkipClause>().FirstOrDefault() ?? new SkipClause(0);
351-
TakeClause takeClause = query.Clauses.OfType<TakeClause>().FirstOrDefault() ?? new TakeClause(maxInt);
352-
353-
if (skipClause.Count != 0 || takeClause.Count != maxInt)
354-
{
355-
var queryPager = ProviderHelper.GetCustomProvider<IQueryPager>(ConnectionProvider);
356-
if (queryPager == null)
357-
{
358-
unhandledClausesList.AddRange(query.OfType<SkipClause>());
359-
unhandledClausesList.AddRange(query.OfType<TakeClause>());
360-
}
361-
362-
IEnumerable<string> commandTexts = queryPager.ApplyPaging(mainCommandBuilder.Text, skipClause.Count,
363-
takeClause.Count);
364-
365-
foreach (string commandText in commandTexts)
366-
{
367-
var commandBuilder = new CommandBuilder(commandText, _schema, mainCommandBuilder.Parameters);
368-
commandBuilders.Add(commandBuilder);
369-
}
370-
}
371-
return commandBuilders.ToArray();
372-
}
373-
374-
private ICommandBuilder[] GetQueryCommandBuilders(SimpleQuery query,
375-
out IEnumerable<SimpleQueryClauseBase> unhandledClauses)
376-
{
377-
if (query.Clauses.OfType<TakeClause>().Any() || query.Clauses.OfType<SkipClause>().Any())
378-
{
379-
return GetPagedQueryCommandBuilders(query, out unhandledClauses);
380-
}
381-
else
382-
{
383-
return new[] {new QueryBuilder(this).Build(query, out unhandledClauses)};
384-
}
385-
}
386-
387-
private ICommandBuilder[] GetQueryCommandBuilders(SimpleQuery query, Int32 bulkIndex,
388-
out IEnumerable<SimpleQueryClauseBase> unhandledClauses)
389-
{
390-
if (query.Clauses.OfType<TakeClause>().Any() || query.Clauses.OfType<SkipClause>().Any())
391-
{
392-
return GetPagedQueryCommandBuilders(query, bulkIndex, out unhandledClauses);
393-
}
394-
else
395-
{
396-
return new[] {new QueryBuilder(this, bulkIndex).Build(query, out unhandledClauses)};
397-
}
398-
}
399273

400274
public override IEnumerable<IEnumerable<IDictionary<string, object>>> RunQueries(SimpleQuery[] queries,
401275
List
@@ -404,34 +278,7 @@ public override IEnumerable<IEnumerable<IDictionary<string, object>>> RunQueries
404278
<SimpleQueryClauseBase>>
405279
unhandledClauses)
406280
{
407-
if (ProviderSupportsCompoundStatements && queries.Length > 1)
408-
{
409-
var commandBuilders = new List<ICommandBuilder>();
410-
for (int i = 0; i < queries.Length; i++)
411-
{
412-
IEnumerable<SimpleQueryClauseBase> unhandledClausesForThisQuery;
413-
commandBuilders.AddRange(GetQueryCommandBuilders(queries[i], i, out unhandledClausesForThisQuery));
414-
unhandledClauses.Add(unhandledClausesForThisQuery);
415-
}
416-
IDbConnection connection = CreateConnection();
417-
IDbCommand command =
418-
CommandBuilder.CreateCommand(
419-
_providerHelper.GetCustomProvider<IDbParameterFactory>(_schema.SchemaProvider),
420-
commandBuilders.ToArray(), connection);
421-
foreach (var item in command.ToEnumerables(connection))
422-
{
423-
yield return item.ToList();
424-
}
425-
}
426-
else
427-
{
428-
foreach (SimpleQuery t in queries)
429-
{
430-
IEnumerable<SimpleQueryClauseBase> unhandledClausesForThisQuery;
431-
yield return RunQuery(t, out unhandledClausesForThisQuery);
432-
unhandledClauses.Add(unhandledClausesForThisQuery);
433-
}
434-
}
281+
return new AdoAdapterQueryRunner(this).RunQueries(queries, unhandledClauses);
435282
}
436283

437284
public override bool IsExpressionFunction(string functionName, params object[] args)
@@ -448,10 +295,7 @@ public override IObservable<IDictionary<string, object>> RunQueryAsObservable(Si
448295
<SimpleQueryClauseBase>
449296
unhandledClauses)
450297
{
451-
IDbConnection connection = CreateConnection();
452-
return new QueryBuilder(this).Build(query, out unhandledClauses)
453-
.GetCommand(connection)
454-
.ToObservable(connection, this);
298+
return new AdoAdapterQueryRunner(this).RunQueryAsObservable(query, out unhandledClauses);
455299
}
456300

457301
public override IDictionary<string, object> Insert(string tableName, IDictionary<string, object> data, bool resultRequired)

0 commit comments

Comments
 (0)