Merge pull request #8 from PoweredSoft/feature/queryinterceptorprovider
Resolve Query Interceptor and queryable Interceptor provider :)
This commit is contained in:
		
						commit
						a8468e35ca
					
				| @ -119,7 +119,7 @@ namespace PoweredSoft.DynamicQuery.Cli | |||||||
|                 new Aggregate { Path = "AgeStr", Type = AggregateType.Avg } |                 new Aggregate { Path = "AgeStr", Type = AggregateType.Avg } | ||||||
|             };; |             };; | ||||||
| 
 | 
 | ||||||
|             var handler = new QueryHandler(); |             var handler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|             handler.AddInterceptor(new PersonQueryInterceptor()); |             handler.AddInterceptor(new PersonQueryInterceptor()); | ||||||
|             var result = handler.Execute(queryable, criteria); |             var result = handler.Execute(queryable, criteria); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| using System; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; | using System.Text; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| @ -9,6 +10,7 @@ namespace PoweredSoft.DynamicQuery.Core | |||||||
|     public interface IInterceptableQueryHandler |     public interface IInterceptableQueryHandler | ||||||
|     { |     { | ||||||
|         void AddInterceptor(IQueryInterceptor interceptor); |         void AddInterceptor(IQueryInterceptor interceptor); | ||||||
|  |         IReadOnlyList<IQueryInterceptor> ResolveInterceptors<TSource, TResult>(IQueryCriteria criteria, IQueryable<TSource> queryable); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public interface IQueryHandler : IInterceptableQueryHandler |     public interface IQueryHandler : IInterceptableQueryHandler | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								PoweredSoft.DynamicQuery.Core/IQueryInterceptorProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								PoweredSoft.DynamicQuery.Core/IQueryInterceptorProvider.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | 
 | ||||||
|  | namespace PoweredSoft.DynamicQuery.Core | ||||||
|  | { | ||||||
|  |     public interface IQueryInterceptorProvider | ||||||
|  |     { | ||||||
|  |         IEnumerable<IQueryInterceptor> GetInterceptors<TSource, TResult>(IQueryCriteria queryCriteria, IQueryable<TSource> queryable); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -38,7 +38,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     Type = AggregateType.Avg, |                     Type = AggregateType.Avg, | ||||||
|                     Path = "ItemPrice" |                     Path = "ItemPrice" | ||||||
|                 }); |                 }); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockAggregateInterceptor()); |                 queryHandler.AddInterceptor(new MockAggregateInterceptor()); | ||||||
|                 var result = queryHandler.Execute(ctx.Items, criteria); |                 var result = queryHandler.Execute(ctx.Items, criteria); | ||||||
|                 Assert.Equal(expected.PriceAtTheTime, result.Aggregates.First().Value); |                 Assert.Equal(expected.PriceAtTheTime, result.Aggregates.First().Value); | ||||||
|  | |||||||
| @ -56,7 +56,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.OrderItems, criteria, new QueryExecutionOptions |                 var result = queryHandler.Execute(ctx.OrderItems, criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
|                     GroupByInMemory = true |                     GroupByInMemory = true | ||||||
| @ -122,7 +122,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var queryable = ctx.OrderItems.Include(t => t.Order); |                 var queryable = ctx.OrderItems.Include(t => t.Order); | ||||||
|                 var result = queryHandler.Execute(queryable, criteria, new QueryExecutionOptions |                 var result = queryHandler.Execute(queryable, criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 // query handler that is empty should be the same as running to list. |                 // query handler that is empty should be the same as running to list. | ||||||
|                 var aqf = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); |                 var aqf = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 var queryHandler = new QueryHandlerAsync(aqf); |                 var queryHandler = new QueryHandlerAsync(aqf, Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = await queryHandler.ExecuteAsync(queryable, criteria); |                 var result = await queryHandler.ExecuteAsync(queryable, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -66,7 +66,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
|                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); |                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); | ||||||
|                 var queryHandler = new QueryHandlerAsync(asyncService); |                 var queryHandler = new QueryHandlerAsync(asyncService, Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = await queryHandler.ExecuteAsync(ctx.OrderItems.Include(t => t.Order.Customer), criteria, new QueryExecutionOptions |                 var result = await queryHandler.ExecuteAsync(ctx.OrderItems.Include(t => t.Order.Customer), criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
|                     GroupByInMemory = true |                     GroupByInMemory = true | ||||||
| @ -118,7 +118,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); |                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); | ||||||
|                 var queryHandler = new QueryHandlerAsync(asyncService); |                 var queryHandler = new QueryHandlerAsync(asyncService, Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = await queryHandler.ExecuteAsync(ctx.Items, criteria); |                 var result = await queryHandler.ExecuteAsync(ctx.Items, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -146,7 +146,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); |                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); | ||||||
|                 var queryHandler = new QueryHandlerAsync(asyncService); |                 var queryHandler = new QueryHandlerAsync(asyncService, Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = await queryHandler.ExecuteAsync(ctx.Items, criteria); |                 var result = await queryHandler.ExecuteAsync(ctx.Items, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -166,7 +166,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 criteria.PageSize = 5; |                 criteria.PageSize = 5; | ||||||
| 
 | 
 | ||||||
|                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); |                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); | ||||||
|                 var queryHandler = new QueryHandlerAsync(asyncService); |                 var queryHandler = new QueryHandlerAsync(asyncService, Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = await queryHandler.ExecuteAsync(ctx.OrderItems, criteria); |                 var result = await queryHandler.ExecuteAsync(ctx.OrderItems, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -205,7 +205,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
|                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); |                 var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() }); | ||||||
|                 var queryHandler = new QueryHandlerAsync(asyncService); |                 var queryHandler = new QueryHandlerAsync(asyncService, Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockQueryExecutionOptionsInterceptor()); |                 queryHandler.AddInterceptor(new MockQueryExecutionOptionsInterceptor()); | ||||||
|                 var result = await queryHandler.ExecuteAsync(ctx.OrderItems.Include(t => t.Order.Customer), criteria); |                 var result = await queryHandler.ExecuteAsync(ctx.OrderItems.Include(t => t.Order.Customer), criteria); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -50,7 +50,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 queryable = (IQueryable<Order>)interceptor.InterceptBeforeFiltering(criteria, queryable); |                 queryable = (IQueryable<Order>)interceptor.InterceptBeforeFiltering(criteria, queryable); | ||||||
| 
 | 
 | ||||||
|                 // query handler should pass by the same interceptor. |                 // query handler should pass by the same interceptor. | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
| 
 | 
 | ||||||
| @ -75,7 +75,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 queryable = interceptor.InterceptBeforeFiltering(criteria, queryable); |                 queryable = interceptor.InterceptBeforeFiltering(criteria, queryable); | ||||||
| 
 | 
 | ||||||
|                 // query handler should pass by the same interceptor. |                 // query handler should pass by the same interceptor. | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| using PoweredSoft.DynamicQuery.Test.Mock; | using PoweredSoft.DynamicQuery.Test.Mock; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
| using System.Text; | using System.Text; | ||||||
| using Xunit; | using Xunit; | ||||||
| 
 | 
 | ||||||
| @ -77,7 +78,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|             MockContextFactory.SeedAndTestContextFor("QueryConvertInterceptorTests_NonGeneric", TestSeeders.SimpleSeedScenario, ctx => |             MockContextFactory.SeedAndTestContextFor("QueryConvertInterceptorTests_NonGeneric", TestSeeders.SimpleSeedScenario, ctx => | ||||||
|             { |             { | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockQueryConvertInterceptor()); |                 queryHandler.AddInterceptor(new MockQueryConvertInterceptor()); | ||||||
|                 var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria); |                 var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria); | ||||||
|                 Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t)); |                 Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t)); | ||||||
| @ -90,7 +91,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|             MockContextFactory.SeedAndTestContextFor("ConvertibleIntereceptorTests_Generic", TestSeeders.SimpleSeedScenario, ctx => |             MockContextFactory.SeedAndTestContextFor("ConvertibleIntereceptorTests_Generic", TestSeeders.SimpleSeedScenario, ctx => | ||||||
|             { |             { | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockQueryConvertGenericInterceptor()); |                 queryHandler.AddInterceptor(new MockQueryConvertGenericInterceptor()); | ||||||
|                 var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria); |                 var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria); | ||||||
|                 Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t)); |                 Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t)); | ||||||
| @ -103,7 +104,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|             MockContextFactory.SeedAndTestContextFor("ConvertibleIntereceptorTests_Generic2", TestSeeders.SimpleSeedScenario, ctx => |             MockContextFactory.SeedAndTestContextFor("ConvertibleIntereceptorTests_Generic2", TestSeeders.SimpleSeedScenario, ctx => | ||||||
|             { |             { | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockQueryConvertGenericInterceptor2()); |                 queryHandler.AddInterceptor(new MockQueryConvertGenericInterceptor2()); | ||||||
|                 var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria); |                 var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria); | ||||||
|                 Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t)); |                 Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t)); | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ using System; | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using PoweredSoft.DynamicQuery.Core; | ||||||
| using PoweredSoft.DynamicQuery.Test.Mock; | using PoweredSoft.DynamicQuery.Test.Mock; | ||||||
| using Xunit; | using Xunit; | ||||||
| 
 | 
 | ||||||
| @ -19,7 +20,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
| 
 | 
 | ||||||
|                 // query handler that is empty should be the same as running to list. |                 // query handler that is empty should be the same as running to list. | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(queryable, criteria); |                 var result = queryHandler.Execute(queryable, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -38,7 +39,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 criteria.Page = 2; |                 criteria.Page = 2; | ||||||
|                 criteria.PageSize = 5; |                 criteria.PageSize = 5; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.OrderItems, criteria); |                 var result = queryHandler.Execute(ctx.OrderItems, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
|  | |||||||
| @ -58,7 +58,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var query = new QueryHandler(); |                 var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 query.AddInterceptor(new MockFilterInterceptorA()); |                 query.AddInterceptor(new MockFilterInterceptorA()); | ||||||
|                 var result = query.Execute(queryable, criteria); |                 var result = query.Execute(queryable, criteria); | ||||||
| 
 | 
 | ||||||
| @ -83,7 +83,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var query = new QueryHandler(); |                 var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 query.AddInterceptor(new MockFilterInterceptorAWithExtension()); |                 query.AddInterceptor(new MockFilterInterceptorAWithExtension()); | ||||||
|                 var result = query.Execute(queryable, criteria); |                 var result = query.Execute(queryable, criteria); | ||||||
| 
 | 
 | ||||||
| @ -108,7 +108,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var query = new QueryHandler(); |                 var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 query.AddInterceptor(new MockFilterInterceptorAWithExtension()); |                 query.AddInterceptor(new MockFilterInterceptorAWithExtension()); | ||||||
|                 var result = query.Execute(queryable, criteria); |                 var result = query.Execute(queryable, criteria); | ||||||
| 
 | 
 | ||||||
| @ -133,7 +133,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var query = new QueryHandler(); |                 var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 query.AddInterceptor(new MockFilterInterceptorA()); |                 query.AddInterceptor(new MockFilterInterceptorA()); | ||||||
|                 query.AddInterceptor(new MockFilterInterceptorB()); |                 query.AddInterceptor(new MockFilterInterceptorB()); | ||||||
|                 var result = query.Execute(queryable, criteria); |                 var result = query.Execute(queryable, criteria); | ||||||
|  | |||||||
| @ -32,7 +32,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     Filters = new List<IFilter> { new MockIsChuckFilter() } |                     Filters = new List<IFilter> { new MockIsChuckFilter() } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Customers, criteria); |                 var result = queryHandler.Execute(ctx.Customers, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -58,7 +58,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Items, criteria); |                 var result = queryHandler.Execute(ctx.Items, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -89,7 +89,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Customers, criteria); |                 var result = queryHandler.Execute(ctx.Customers, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -125,7 +125,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Customers, criteria); |                 var result = queryHandler.Execute(ctx.Customers, criteria); | ||||||
|                 Assert.Equal(resultShouldMatch, result.Data); |                 Assert.Equal(resultShouldMatch, result.Data); | ||||||
|             }); |             }); | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
| 
 | 
 | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 criteria.Groups.Add(new Group { Path = "CustomerFirstName" }); |                 criteria.Groups.Add(new Group { Path = "CustomerFirstName" }); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockGroupInterceptor()); |                 queryHandler.AddInterceptor(new MockGroupInterceptor()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders.Include(t => t.Customer), criteria, new QueryExecutionOptions |                 var result = queryHandler.Execute(ctx.Orders.Include(t => t.Customer), criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
| @ -52,7 +52,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|         [Fact] |         [Fact] | ||||||
|         public void WithInterptorSimple() |         public void WithInterptorSimple() | ||||||
|         { |         { | ||||||
|             MockContextFactory.SeedAndTestContextFor("GroupInterceptorTests_Simple", TestSeeders.SimpleSeedScenario, ctx => |             MockContextFactory.SeedAndTestContextFor("GroupInterceptorTests_WithInterptorSimple", TestSeeders.SimpleSeedScenario, ctx => | ||||||
|             { |             { | ||||||
|                 var expected = ctx.Orders |                 var expected = ctx.Orders | ||||||
|                     .OrderBy(t => t.Customer.FirstName) |                     .OrderBy(t => t.Customer.FirstName) | ||||||
| @ -62,7 +62,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
| 
 | 
 | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 criteria.Groups.Add(new Group { Path = "CustomerFirstName" }); |                 criteria.Groups.Add(new Group { Path = "CustomerFirstName" }); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockGroupInterceptor()); |                 queryHandler.AddInterceptor(new MockGroupInterceptor()); | ||||||
|                 queryHandler.AddInterceptor(new MockQueryExecutionOptionsInterceptor()); |                 queryHandler.AddInterceptor(new MockQueryExecutionOptionsInterceptor()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders.Include(t => t.Customer), criteria); |                 var result = queryHandler.Execute(ctx.Orders.Include(t => t.Customer), criteria); | ||||||
|  | |||||||
| @ -39,7 +39,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria, new QueryExecutionOptions |                 var result = queryHandler.Execute(ctx.Orders, criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
|                     GroupByInMemory = true, |                     GroupByInMemory = true, | ||||||
| @ -80,7 +80,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Tickets, criteria, new QueryExecutionOptions |                 var result = queryHandler.Execute(ctx.Tickets, criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
|                     GroupByInMemory = true |                     GroupByInMemory = true | ||||||
| @ -117,7 +117,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var interceptor = new InterceptorsWithGrouping(); |                 var interceptor = new InterceptorsWithGrouping(); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute<Ticket, InterceptorWithGroupingFakeModel>(ctx.Tickets, criteria, new QueryExecutionOptions |                 var result = queryHandler.Execute<Ticket, InterceptorWithGroupingFakeModel>(ctx.Tickets, criteria, new QueryExecutionOptions | ||||||
|                 { |                 { | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 queryable = (IQueryable<Order>)interceptor.InterceptIncludeStrategy(criteria, queryable); |                 queryable = (IQueryable<Order>)interceptor.InterceptIncludeStrategy(criteria, queryable); | ||||||
|                  |                  | ||||||
|                 // query handler should pass by the same interceptor. |                 // query handler should pass by the same interceptor. | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
| 
 | 
 | ||||||
| @ -76,7 +76,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 queryable = interceptor.InterceptIncludeStrategy(criteria, queryable); |                 queryable = interceptor.InterceptIncludeStrategy(criteria, queryable); | ||||||
| 
 | 
 | ||||||
|                 // query handler should pass by the same interceptor. |                 // query handler should pass by the same interceptor. | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 queryable = (IQueryable<Order>)interceptor.InterceptNoSort(criteria, queryable); |                 queryable = (IQueryable<Order>)interceptor.InterceptNoSort(criteria, queryable); | ||||||
|                  |                  | ||||||
|                 // query handler should pass by the same interceptor. |                 // query handler should pass by the same interceptor. | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
| 
 | 
 | ||||||
| @ -76,7 +76,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 queryable = interceptor.InterceptNoSort(criteria, queryable); |                 queryable = interceptor.InterceptNoSort(criteria, queryable); | ||||||
| 
 | 
 | ||||||
|                 // query handler should pass by the same interceptor. |                 // query handler should pass by the same interceptor. | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(interceptor); |                 queryHandler.AddInterceptor(interceptor); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										44
									
								
								PoweredSoft.DynamicQuery.Test/QueryProviderTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								PoweredSoft.DynamicQuery.Test/QueryProviderTests.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | using PoweredSoft.DynamicQuery.Core; | ||||||
|  | using PoweredSoft.DynamicQuery.Test.Mock; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using Xunit; | ||||||
|  | 
 | ||||||
|  | namespace PoweredSoft.DynamicQuery.Test | ||||||
|  | { | ||||||
|  |     public class QueryProviderTests | ||||||
|  |     { | ||||||
|  |         private class FakeInterceptor : IQueryInterceptor | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private class QueryInterceptorProvider : IQueryInterceptorProvider | ||||||
|  |         { | ||||||
|  |             public IEnumerable<IQueryInterceptor> GetInterceptors<TSource, TResult>(IQueryCriteria queryCriteria, IQueryable<TSource> queryable) | ||||||
|  |             { | ||||||
|  |                 yield return new FakeInterceptor(); | ||||||
|  |                 yield return new FakeInterceptor(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Fact] | ||||||
|  |         public void Simple() | ||||||
|  |         { | ||||||
|  |             MockContextFactory.SeedAndTestContextFor("QueryProviderTests_Simple", TestSeeders.SimpleSeedScenario, ctx => | ||||||
|  |             { | ||||||
|  |                 // criteria | ||||||
|  |                 var criteria = new QueryCriteria(); | ||||||
|  |                 var queryHandler = new QueryHandler(new List<IQueryInterceptorProvider>{ | ||||||
|  |                     new QueryInterceptorProvider() | ||||||
|  |                 }); | ||||||
|  |                 queryHandler.AddInterceptor(new FakeInterceptor()); | ||||||
|  |                 var interceptors = queryHandler.ResolveInterceptors<Order, Order>(criteria, ctx.Orders); | ||||||
|  |                 Assert.Equal(1, interceptors.Count); | ||||||
|  |                 Assert.True(interceptors[0].GetType() == typeof(FakeInterceptor)); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -33,7 +33,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                 // criteria |                 // criteria | ||||||
|                 var criteria = new QueryCriteria(); |                 var criteria = new QueryCriteria(); | ||||||
|                 criteria.Sorts.Add(new Sort("CustomerFullName")); |                 criteria.Sorts.Add(new Sort("CustomerFullName")); | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockSortInterceptor()); |                 queryHandler.AddInterceptor(new MockSortInterceptor()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
|                 Assert.Equal(expected, result.Data); |                 Assert.Equal(expected, result.Data); | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
|                 Assert.Equal(shouldResult, result.Data); |                 Assert.Equal(shouldResult, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -50,7 +50,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
|                 Assert.Equal(shouldResult, result.Data); |                 Assert.Equal(shouldResult, result.Data); | ||||||
|             }); |             }); | ||||||
| @ -83,7 +83,7 @@ namespace PoweredSoft.DynamicQuery.Test | |||||||
|                     } |                     } | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 var queryHandler = new QueryHandler(); |                 var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>()); | ||||||
|                 queryHandler.AddInterceptor(new MockSortInterceptor()); |                 queryHandler.AddInterceptor(new MockSortInterceptor()); | ||||||
|                 var result = queryHandler.Execute(ctx.Orders, criteria); |                 var result = queryHandler.Execute(ctx.Orders, criteria); | ||||||
|                 Assert.Equal(shouldResult, result.Data); |                 Assert.Equal(shouldResult, result.Data); | ||||||
|  | |||||||
| @ -14,6 +14,10 @@ namespace PoweredSoft.DynamicQuery | |||||||
| { | { | ||||||
|     public class QueryHandler : QueryHandlerBase, IQueryHandler |     public class QueryHandler : QueryHandlerBase, IQueryHandler | ||||||
|     { |     { | ||||||
|  |         public QueryHandler(IEnumerable<IQueryInterceptorProvider> queryableInterceptorProviders) : base(queryableInterceptorProviders) | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         protected virtual IQueryExecutionResult<TRecord> FinalExecute<TSource, TRecord>() |         protected virtual IQueryExecutionResult<TRecord> FinalExecute<TSource, TRecord>() | ||||||
|         { |         { | ||||||
|             CommonBeforeExecute<TSource>(); |             CommonBeforeExecute<TSource>(); | ||||||
| @ -127,25 +131,25 @@ namespace PoweredSoft.DynamicQuery | |||||||
| 
 | 
 | ||||||
|         public IQueryExecutionResult<TSource> Execute<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria) |         public IQueryExecutionResult<TSource> Execute<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, new QueryExecutionOptions()); |             Reset<TSource, TSource>(queryable, criteria, new QueryExecutionOptions()); | ||||||
|             return FinalExecute<TSource, TSource>(); |             return FinalExecute<TSource, TSource>(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public IQueryExecutionResult<TRecord> Execute<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria) |         public IQueryExecutionResult<TRecord> Execute<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, new QueryExecutionOptions()); |             Reset<TSource, TRecord>(queryable, criteria, new QueryExecutionOptions()); | ||||||
|             return FinalExecute<TSource, TRecord>(); |             return FinalExecute<TSource, TRecord>(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public IQueryExecutionResult<TSource> Execute<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options) |         public IQueryExecutionResult<TSource> Execute<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, options); |             Reset<TSource, TSource>(queryable, criteria, options); | ||||||
|             return FinalExecute<TSource, TSource>(); |             return FinalExecute<TSource, TSource>(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public IQueryExecutionResult<TRecord> Execute<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options) |         public IQueryExecutionResult<TRecord> Execute<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, options); |             Reset<TSource, TRecord>(queryable, criteria, options); | ||||||
|             return FinalExecute<TSource, TRecord>(); |             return FinalExecute<TSource, TRecord>(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ namespace PoweredSoft.DynamicQuery | |||||||
|     { |     { | ||||||
|         public IAsyncQueryableService AsyncQueryableService { get; } |         public IAsyncQueryableService AsyncQueryableService { get; } | ||||||
| 
 | 
 | ||||||
|         public QueryHandlerAsync(IAsyncQueryableService asyncQueryableService) |         public QueryHandlerAsync(IAsyncQueryableService asyncQueryableService, IEnumerable<IQueryInterceptorProvider> queryInterceptorProviders) : base(queryInterceptorProviders) | ||||||
|         { |         { | ||||||
|             AsyncQueryableService = asyncQueryableService; |             AsyncQueryableService = asyncQueryableService; | ||||||
|         } |         } | ||||||
| @ -157,25 +157,25 @@ namespace PoweredSoft.DynamicQuery | |||||||
| 
 | 
 | ||||||
|         public Task<IQueryExecutionResult<TSource>> ExecuteAsync<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria, CancellationToken cancellationToken = default) |         public Task<IQueryExecutionResult<TSource>> ExecuteAsync<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria, CancellationToken cancellationToken = default) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, new QueryExecutionOptions()); |             Reset<TSource, TSource>(queryable, criteria, new QueryExecutionOptions()); | ||||||
|             return FinalExecuteAsync<TSource, TSource>(cancellationToken); |             return FinalExecuteAsync<TSource, TSource>(cancellationToken); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Task<IQueryExecutionResult<TRecord>> ExecuteAsync<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria, CancellationToken cancellationToken = default) |         public Task<IQueryExecutionResult<TRecord>> ExecuteAsync<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria, CancellationToken cancellationToken = default) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, new QueryExecutionOptions()); |             Reset<TSource, TRecord>(queryable, criteria, new QueryExecutionOptions()); | ||||||
|             return FinalExecuteAsync<TSource, TRecord>(cancellationToken); |             return FinalExecuteAsync<TSource, TRecord>(cancellationToken); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Task<IQueryExecutionResult<TSource>> ExecuteAsync<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options, CancellationToken cancellationToken = default) |         public Task<IQueryExecutionResult<TSource>> ExecuteAsync<TSource>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options, CancellationToken cancellationToken = default) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, options); |             Reset<TSource, TSource>(queryable, criteria, options); | ||||||
|             return FinalExecuteAsync<TSource, TSource>(cancellationToken); |             return FinalExecuteAsync<TSource, TSource>(cancellationToken); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Task<IQueryExecutionResult<TRecord>> ExecuteAsync<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options, CancellationToken cancellationToken = default) |         public Task<IQueryExecutionResult<TRecord>> ExecuteAsync<TSource, TRecord>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options, CancellationToken cancellationToken = default) | ||||||
|         { |         { | ||||||
|             Reset(queryable, criteria, options); |             Reset<TSource, TRecord>(queryable, criteria, options); | ||||||
|             return FinalExecuteAsync<TSource, TRecord>(cancellationToken); |             return FinalExecuteAsync<TSource, TRecord>(cancellationToken); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -16,7 +16,9 @@ namespace PoweredSoft.DynamicQuery | |||||||
| { | { | ||||||
|     public abstract class QueryHandlerBase : IInterceptableQueryHandler |     public abstract class QueryHandlerBase : IInterceptableQueryHandler | ||||||
|     { |     { | ||||||
|         protected List<IQueryInterceptor> Interceptors { get; } = new List<IQueryInterceptor>(); |         private readonly IEnumerable<IQueryInterceptorProvider> queryableInterceptorProviders; | ||||||
|  | 
 | ||||||
|  |         protected List<IQueryInterceptor> AddedInterceptors { get; } = new List<IQueryInterceptor>(); | ||||||
|         protected IQueryCriteria Criteria { get; set; } |         protected IQueryCriteria Criteria { get; set; } | ||||||
|         protected IQueryable QueryableAtStart { get; private set; } |         protected IQueryable QueryableAtStart { get; private set; } | ||||||
|         protected IQueryable CurrentQueryable { get; set; } |         protected IQueryable CurrentQueryable { get; set; } | ||||||
| @ -26,8 +28,21 @@ namespace PoweredSoft.DynamicQuery | |||||||
|         protected bool HasGrouping => Criteria.Groups?.Any() == true; |         protected bool HasGrouping => Criteria.Groups?.Any() == true; | ||||||
|         protected bool HasPaging => Criteria.PageSize.HasValue && Criteria.PageSize > 0; |         protected bool HasPaging => Criteria.PageSize.HasValue && Criteria.PageSize > 0; | ||||||
| 
 | 
 | ||||||
|         protected virtual void Reset(IQueryable queryable, IQueryCriteria criteria, IQueryExecutionOptions options) |         protected IReadOnlyList<IQueryInterceptor> Interceptors { get; set; } | ||||||
|  | 
 | ||||||
|  |         protected virtual void ResetInterceptors<TSource, TResult>(IQueryCriteria criteria, IQueryable<TSource> queryable) | ||||||
|         { |         { | ||||||
|  |             Interceptors = ResolveInterceptors<TSource, TResult>(criteria, queryable); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public QueryHandlerBase(IEnumerable<IQueryInterceptorProvider> queryableInterceptorProviders) | ||||||
|  |         { | ||||||
|  |             this.queryableInterceptorProviders = queryableInterceptorProviders; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         protected virtual void Reset<TSource, TResult>(IQueryable<TSource> queryable, IQueryCriteria criteria, IQueryExecutionOptions options) | ||||||
|  |         { | ||||||
|  |             ResetInterceptors<TSource, TResult>(criteria, queryable); | ||||||
|             Criteria = criteria ?? throw new ArgumentNullException("criteria"); |             Criteria = criteria ?? throw new ArgumentNullException("criteria"); | ||||||
|             QueryableAtStart = queryable ?? throw new ArgumentNullException("queryable"); |             QueryableAtStart = queryable ?? throw new ArgumentNullException("queryable"); | ||||||
|             CurrentQueryable = QueryableAtStart; |             CurrentQueryable = QueryableAtStart; | ||||||
| @ -54,8 +69,8 @@ namespace PoweredSoft.DynamicQuery | |||||||
|         { |         { | ||||||
|             if (interceptor == null) throw new ArgumentNullException("interceptor"); |             if (interceptor == null) throw new ArgumentNullException("interceptor"); | ||||||
| 
 | 
 | ||||||
|             if (!Interceptors.Contains(interceptor)) |             if (!AddedInterceptors.Contains(interceptor)) | ||||||
|                 Interceptors.Add(interceptor); |                 AddedInterceptors.Add(interceptor); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         protected virtual IGroup InterceptGroup<TSource>(IGroup group) |         protected virtual IGroup InterceptGroup<TSource>(IGroup group) | ||||||
| @ -473,5 +488,16 @@ namespace PoweredSoft.DynamicQuery | |||||||
| 
 | 
 | ||||||
|             await AfterReadInterceptors<TSource, TRecord>(pairs); |             await AfterReadInterceptors<TSource, TRecord>(pairs); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public IReadOnlyList<IQueryInterceptor> ResolveInterceptors<TSource, TResult>(IQueryCriteria criteria, IQueryable<TSource> queryable) | ||||||
|  |         { | ||||||
|  |             var providedInterceptors = queryableInterceptorProviders.SelectMany(t => t.GetInterceptors<TSource, TResult>(criteria, queryable)).ToList(); | ||||||
|  |             var final = providedInterceptors | ||||||
|  |                 .Concat(AddedInterceptors) | ||||||
|  |                 .Distinct(new QueryInterceptorEqualityComparer()) | ||||||
|  |                 .ToList(); | ||||||
|  | 
 | ||||||
|  |             return final; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								PoweredSoft.DynamicQuery/QueryInterceptorEqualityComparer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								PoweredSoft.DynamicQuery/QueryInterceptorEqualityComparer.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | using PoweredSoft.DynamicQuery.Core; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | 
 | ||||||
|  | namespace PoweredSoft.DynamicQuery | ||||||
|  | { | ||||||
|  |     public class QueryInterceptorEqualityComparer : IEqualityComparer<IQueryInterceptor> | ||||||
|  |     { | ||||||
|  |         public bool Equals(IQueryInterceptor x, IQueryInterceptor y) | ||||||
|  |         { | ||||||
|  |             return x.GetType() == y.GetType(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public int GetHashCode(IQueryInterceptor obj) | ||||||
|  |         { | ||||||
|  |             return obj.GetType().GetHashCode(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user