Skip to content

Commit

Permalink
Merge pull request #8 from PoweredSoft/feature/queryinterceptorprovider
Browse files Browse the repository at this point in the history
Resolve Query Interceptor and queryable Interceptor provider :)
  • Loading branch information
dlebee authored Dec 12, 2019
2 parents 5be4b7e + 6a49098 commit a8468e3
Show file tree
Hide file tree
Showing 22 changed files with 158 additions and 52 deletions.
2 changes: 1 addition & 1 deletion PoweredSoft.DynamicQuery.Cli/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ private static void Play1()
new Aggregate { Path = "AgeStr", Type = AggregateType.Avg }
};;

var handler = new QueryHandler();
var handler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
handler.AddInterceptor(new PersonQueryInterceptor());
var result = handler.Execute(queryable, criteria);

Expand Down
2 changes: 2 additions & 0 deletions PoweredSoft.DynamicQuery.Core/IQueryHandler.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
Expand All @@ -9,6 +10,7 @@ namespace PoweredSoft.DynamicQuery.Core
public interface IInterceptableQueryHandler
{
void AddInterceptor(IQueryInterceptor interceptor);
IReadOnlyList<IQueryInterceptor> ResolveInterceptors<TSource, TResult>(IQueryCriteria criteria, IQueryable<TSource> queryable);
}

public interface IQueryHandler : IInterceptableQueryHandler
Expand Down
10 changes: 10 additions & 0 deletions PoweredSoft.DynamicQuery.Core/IQueryInterceptorProvider.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
2 changes: 1 addition & 1 deletion PoweredSoft.DynamicQuery.Test/AggregateInterceptorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public void Simple()
Type = AggregateType.Avg,
Path = "ItemPrice"
});
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(new MockAggregateInterceptor());
var result = queryHandler.Execute(ctx.Items, criteria);
Assert.Equal(expected.PriceAtTheTime, result.Aggregates.First().Value);
Expand Down
4 changes: 2 additions & 2 deletions PoweredSoft.DynamicQuery.Test/AggregateTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void WithoutGrouping()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.OrderItems, criteria, new QueryExecutionOptions
{
GroupByInMemory = true
Expand Down Expand Up @@ -122,7 +122,7 @@ public void WithGrouping()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var queryable = ctx.OrderItems.Include(t => t.Order);
var result = queryHandler.Execute(queryable, criteria, new QueryExecutionOptions
{
Expand Down
12 changes: 6 additions & 6 deletions PoweredSoft.DynamicQuery.Test/AsyncTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void TestEmptyCriteria()
// query handler that is empty should be the same as running to list.
var aqf = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() });
var criteria = new QueryCriteria();
var queryHandler = new QueryHandlerAsync(aqf);
var queryHandler = new QueryHandlerAsync(aqf, Enumerable.Empty<IQueryInterceptorProvider>());
var result = await queryHandler.ExecuteAsync(queryable, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down Expand Up @@ -66,7 +66,7 @@ public void WithGrouping()
}
};
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
{
GroupByInMemory = true
Expand Down Expand Up @@ -118,7 +118,7 @@ public void SimpleFilter()
};

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);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down Expand Up @@ -146,7 +146,7 @@ public void SimpleFilterWithNot()
};

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);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand All @@ -166,7 +166,7 @@ public void TestPaging()
criteria.PageSize = 5;

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);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down Expand Up @@ -205,7 +205,7 @@ public void WithGroupingInterceptorOptions()
}
};
var asyncService = new AsyncQueryableService(new[] { new AsyncQueryableHandlerService() });
var queryHandler = new QueryHandlerAsync(asyncService);
var queryHandler = new QueryHandlerAsync(asyncService, Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(new MockQueryExecutionOptionsInterceptor());
var result = await queryHandler.ExecuteAsync(ctx.OrderItems.Include(t => t.Order.Customer), criteria);

Expand Down
4 changes: 2 additions & 2 deletions PoweredSoft.DynamicQuery.Test/BeforeFilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public void NonGeneric()
queryable = (IQueryable<Order>)interceptor.InterceptBeforeFiltering(criteria, queryable);

// query handler should pass by the same interceptor.
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute(ctx.Orders, criteria);

Expand All @@ -75,7 +75,7 @@ public void Generic()
queryable = interceptor.InterceptBeforeFiltering(criteria, queryable);

// query handler should pass by the same interceptor.
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute(ctx.Orders, criteria);

Expand Down
7 changes: 4 additions & 3 deletions PoweredSoft.DynamicQuery.Test/ConvertibleInterceptorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using PoweredSoft.DynamicQuery.Test.Mock;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xunit;

Expand Down Expand Up @@ -77,7 +78,7 @@ public void NonGeneric()
MockContextFactory.SeedAndTestContextFor("QueryConvertInterceptorTests_NonGeneric", TestSeeders.SimpleSeedScenario, ctx =>
{
var criteria = new QueryCriteria();
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(new MockQueryConvertInterceptor());
var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria);
Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t));
Expand All @@ -90,7 +91,7 @@ public void Generic()
MockContextFactory.SeedAndTestContextFor("ConvertibleIntereceptorTests_Generic", TestSeeders.SimpleSeedScenario, ctx =>
{
var criteria = new QueryCriteria();
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(new MockQueryConvertGenericInterceptor());
var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria);
Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t));
Expand All @@ -103,7 +104,7 @@ public void Generic2()
MockContextFactory.SeedAndTestContextFor("ConvertibleIntereceptorTests_Generic2", TestSeeders.SimpleSeedScenario, ctx =>
{
var criteria = new QueryCriteria();
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(new MockQueryConvertGenericInterceptor2());
var result = queryHandler.Execute<Customer, CustomerModel>(ctx.Customers, criteria);
Assert.All(result.Data, t => Assert.IsType<CustomerModel>(t));
Expand Down
5 changes: 3 additions & 2 deletions PoweredSoft.DynamicQuery.Test/CriteriaTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using PoweredSoft.DynamicQuery.Core;
using PoweredSoft.DynamicQuery.Test.Mock;
using Xunit;

Expand All @@ -19,7 +20,7 @@ public void TestEmptyCriteria()

// query handler that is empty should be the same as running to list.
var criteria = new QueryCriteria();
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(queryable, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand All @@ -38,7 +39,7 @@ public void TestPaging()
criteria.Page = 2;
criteria.PageSize = 5;

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.OrderItems, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down
8 changes: 4 additions & 4 deletions PoweredSoft.DynamicQuery.Test/FilterInterceptorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void Simple()
}
};

var query = new QueryHandler();
var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
query.AddInterceptor(new MockFilterInterceptorA());
var result = query.Execute(queryable, criteria);

Expand All @@ -83,7 +83,7 @@ public void SimpleWithExtensions()
}
};

var query = new QueryHandler();
var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
query.AddInterceptor(new MockFilterInterceptorAWithExtension());
var result = query.Execute(queryable, criteria);

Expand All @@ -108,7 +108,7 @@ public void SimpleWithExtensions2()
}
};

var query = new QueryHandler();
var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
query.AddInterceptor(new MockFilterInterceptorAWithExtension());
var result = query.Execute(queryable, criteria);

Expand All @@ -133,7 +133,7 @@ public void Multi()
}
};

var query = new QueryHandler();
var query = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
query.AddInterceptor(new MockFilterInterceptorA());
query.AddInterceptor(new MockFilterInterceptorB());
var result = query.Execute(queryable, criteria);
Expand Down
8 changes: 4 additions & 4 deletions PoweredSoft.DynamicQuery.Test/FilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void TestInversionOfControl()
Filters = new List<IFilter> { new MockIsChuckFilter() }
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.Customers, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand All @@ -58,7 +58,7 @@ public void SimpleFilter()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.Items, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down Expand Up @@ -89,7 +89,7 @@ public void CompositeFilter()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.Customers, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down Expand Up @@ -125,7 +125,7 @@ public void MoreComplexCompositeFilter()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.Customers, criteria);
Assert.Equal(resultShouldMatch, result.Data);
});
Expand Down
6 changes: 3 additions & 3 deletions PoweredSoft.DynamicQuery.Test/GroupInterceptorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void Simple()

var criteria = new QueryCriteria();
criteria.Groups.Add(new Group { Path = "CustomerFirstName" });
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(new MockGroupInterceptor());
var result = queryHandler.Execute(ctx.Orders.Include(t => t.Customer), criteria, new QueryExecutionOptions
{
Expand All @@ -52,7 +52,7 @@ public void Simple()
[Fact]
public void WithInterptorSimple()
{
MockContextFactory.SeedAndTestContextFor("GroupInterceptorTests_Simple", TestSeeders.SimpleSeedScenario, ctx =>
MockContextFactory.SeedAndTestContextFor("GroupInterceptorTests_WithInterptorSimple", TestSeeders.SimpleSeedScenario, ctx =>
{
var expected = ctx.Orders
.OrderBy(t => t.Customer.FirstName)
Expand All @@ -62,7 +62,7 @@ public void WithInterptorSimple()

var criteria = new QueryCriteria();
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 MockQueryExecutionOptionsInterceptor());
var result = queryHandler.Execute(ctx.Orders.Include(t => t.Customer), criteria);
Expand Down
6 changes: 3 additions & 3 deletions PoweredSoft.DynamicQuery.Test/GroupTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void Simple()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.Orders, criteria, new QueryExecutionOptions
{
GroupByInMemory = true,
Expand Down Expand Up @@ -80,7 +80,7 @@ public void GroupComplex()
}
};

var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
var result = queryHandler.Execute(ctx.Tickets, criteria, new QueryExecutionOptions
{
GroupByInMemory = true
Expand Down Expand Up @@ -117,7 +117,7 @@ public void InterceptorsWithGrouping()
};

var interceptor = new InterceptorsWithGrouping();
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute<Ticket, InterceptorWithGroupingFakeModel>(ctx.Tickets, criteria, new QueryExecutionOptions
{
Expand Down
4 changes: 2 additions & 2 deletions PoweredSoft.DynamicQuery.Test/IncludeStrategyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void NonGeneric()
queryable = (IQueryable<Order>)interceptor.InterceptIncludeStrategy(criteria, queryable);

// query handler should pass by the same interceptor.
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute(ctx.Orders, criteria);

Expand All @@ -76,7 +76,7 @@ public void Generic()
queryable = interceptor.InterceptIncludeStrategy(criteria, queryable);

// query handler should pass by the same interceptor.
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute(ctx.Orders, criteria);

Expand Down
4 changes: 2 additions & 2 deletions PoweredSoft.DynamicQuery.Test/NoSortTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void NonGeneric()
queryable = (IQueryable<Order>)interceptor.InterceptNoSort(criteria, queryable);

// query handler should pass by the same interceptor.
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute(ctx.Orders, criteria);

Expand All @@ -76,7 +76,7 @@ public void Generic()
queryable = interceptor.InterceptNoSort(criteria, queryable);

// query handler should pass by the same interceptor.
var queryHandler = new QueryHandler();
var queryHandler = new QueryHandler(Enumerable.Empty<IQueryInterceptorProvider>());
queryHandler.AddInterceptor(interceptor);
var result = queryHandler.Execute(ctx.Orders, criteria);

Expand Down
Loading

0 comments on commit a8468e3

Please sign in to comment.