@@ -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