intercept aggregate

This commit is contained in:
David Lebee
2018-10-21 16:37:59 -05:00
parent c0fa4c91b1
commit 13f4ef0b83
4 changed files with 45 additions and 11 deletions
+14 -9
View File
@@ -36,7 +36,7 @@ namespace PoweredSoft.DynamicQuery
var finalGroups = Criteria.Groups.Select(g => InterceptGroup<T>(g)).ToList();
// get the aggregates.
var aggregateResults = Criteria.Aggregates.Any() ? FetchAggregates(finalGroups) : null;
var aggregateResults = FetchAggregates<T>(finalGroups);
// sorting.
finalGroups.ForEach(fg => Criteria.Sorts.Insert(0, new Sort(fg.Path, fg.Ascending)));
@@ -101,11 +101,11 @@ namespace PoweredSoft.DynamicQuery
return (object)groupRecordResult;
}).ToList();
result.Aggregates = CalculateTotalAggregate(queryableAfterFilters);
result.Aggregates = CalculateTotalAggregate<T>(queryableAfterFilters);
return result;
}
protected virtual List<IAggregateResult> CalculateTotalAggregate(IQueryable queryableAfterFilters)
protected virtual List<IAggregateResult> CalculateTotalAggregate<T>(IQueryable queryableAfterFilters)
{
if (!Criteria.Aggregates.Any())
return null;
@@ -115,8 +115,9 @@ namespace PoweredSoft.DynamicQuery
{
Criteria.Aggregates.ForEach((a, index) =>
{
var selectType = ResolveSelectFrom(a.Type);
sb.Aggregate(a.Path, selectType, $"Agg_{index}");
var fa = InterceptAggregate<T>(a);
var selectType = ResolveSelectFrom(fa.Type);
sb.Aggregate(fa.Path, selectType, $"Agg_{index}");
});
});
@@ -153,8 +154,11 @@ namespace PoweredSoft.DynamicQuery
}
private List<List<DynamicClass>> FetchAggregates(List<IGroup> finalGroups)
private List<List<DynamicClass>> FetchAggregates<T>(List<IGroup> finalGroups)
{
if (!Criteria.Aggregates.Any())
return null;
List<List<DynamicClass>> aggregateResults;
var previousGroups = new List<IGroup>();
aggregateResults = finalGroups.Select(fg =>
@@ -173,8 +177,9 @@ namespace PoweredSoft.DynamicQuery
sb.Key($"Key_{++groupKeyIndex}", $"Key_{groupKeyIndex}");
Criteria.Aggregates.ForEach((a, ai) =>
{
var selectType = ResolveSelectFrom(a.Type);
sb.Aggregate(a.Path, selectType, $"Agg_{ai}");
var fa = InterceptAggregate<T>(a);
var selectType = ResolveSelectFrom(fa.Type);
sb.Aggregate(fa.Path, selectType, $"Agg_{ai}");
});
});
@@ -202,7 +207,7 @@ namespace PoweredSoft.DynamicQuery
// the data.
result.Data = CurrentQueryable.ToObjectList();
result.Aggregates = CalculateTotalAggregate(afterFilterQueryable);
result.Aggregates = CalculateTotalAggregate<T>(afterFilterQueryable);
return result;
}
@@ -6,6 +6,7 @@ using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using PoweredSoft.DynamicLinq.Fluent;
@@ -86,6 +87,14 @@ namespace PoweredSoft.DynamicQuery
result.NumberOfPages = result.TotalRecords / Criteria.PageSize + (result.TotalRecords % Criteria.PageSize != 0 ? 1 : 0);
}
protected virtual IAggregate InterceptAggregate<T>(IAggregate aggregate)
{
var ret = Interceptors
.Where(t => t is IAggregateInterceptor)
.Cast<IAggregateInterceptor>()
.Aggregate(aggregate, (prev, inter) => inter.InterceptAggregate(prev));
return ret;
}
protected virtual List<ISort> InterceptSort<T>(ISort sort)
{