From d598508ab2421073c5c78e7d80b5dd28c2390564 Mon Sep 17 00:00:00 2001 From: David Lebee Date: Sun, 21 Oct 2018 16:06:45 -0500 Subject: [PATCH] aggregates on all completed :) --- PoweredSoft.DynamicQuery.Cli/Program.cs | 4 +-- PoweredSoft.DynamicQuery/QueryHandler.cs | 45 +++++++++++++++++++++--- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/PoweredSoft.DynamicQuery.Cli/Program.cs b/PoweredSoft.DynamicQuery.Cli/Program.cs index 9addeee..da7f35f 100644 --- a/PoweredSoft.DynamicQuery.Cli/Program.cs +++ b/PoweredSoft.DynamicQuery.Cli/Program.cs @@ -83,8 +83,8 @@ namespace PoweredSoft.DynamicQuery.Cli criteria.Groups = new List() { - new Group { Path = "LastName" }, - new Group { Path = "Sexe" } + new Group { Path = "LastName" } + //, new Group { Path = "Sexe" } }; criteria.Aggregates = new List() diff --git a/PoweredSoft.DynamicQuery/QueryHandler.cs b/PoweredSoft.DynamicQuery/QueryHandler.cs index 598cda5..317a044 100644 --- a/PoweredSoft.DynamicQuery/QueryHandler.cs +++ b/PoweredSoft.DynamicQuery/QueryHandler.cs @@ -25,7 +25,11 @@ namespace PoweredSoft.DynamicQuery protected virtual IQueryExecutionResult ExecuteGrouping() { var result = new QueryExecutionResult(); - result.TotalRecords = CurrentQueryable.LongCount(); + + // preserve queryable. + var queryableAfterFilters = CurrentQueryable; + + result.TotalRecords = queryableAfterFilters.LongCount(); CalculatePageCount(result); // intercept groups in advance to avoid doing it more than once :) @@ -64,8 +68,6 @@ namespace PoweredSoft.DynamicQuery cgrr.GroupPath = g.Path; cgrr.GroupValue = groupRecord.GetDynamicPropertyValue($"Key_{gi}"); - - if (!isLast) cgrr.Data = new List(); else @@ -100,9 +102,39 @@ namespace PoweredSoft.DynamicQuery return (object)groupRecordResult; }).ToList(); + result.Aggregates = CalculateTotalAggregate(queryableAfterFilters); return result; } + protected virtual List CalculateTotalAggregate(IQueryable queryableAfterFilters) + { + if (!Criteria.Aggregates.Any()) + return null; + + var groupExpression = queryableAfterFilters.EmptyGroupBy(QueryableUnderlyingType); + var selectExpression = groupExpression.Select(sb => + { + Criteria.Aggregates.ForEach((a, index) => + { + var selectType = ResolveSelectFrom(a.Type); + sb.Aggregate(a.Path, selectType, $"Agg_{index}"); + }); + }); + + var aggregateResult = selectExpression.ToDynamicClassList().First(); + var ret = new List(); + Criteria.Aggregates.ForEach((a, index) => + { + ret.Add(new AggregateResult() + { + Path = a.Path, + Type = a.Type, + Value = aggregateResult.GetDynamicPropertyValue($"Agg_{index}") + }); + }); + return ret; + } + private DynamicClass FindMatchingAggregateResult(List> aggregateResults, List groups, List groupResults) { var groupIndex = groupResults.Count - 1; @@ -159,8 +191,11 @@ namespace PoweredSoft.DynamicQuery { var result = new QueryExecutionResult(); + // after filter queryable + var afterFilterQueryable = CurrentQueryable; + // total records. - result.TotalRecords = CurrentQueryable.LongCount(); + result.TotalRecords = afterFilterQueryable.LongCount(); CalculatePageCount(result); // sorts and paging. @@ -169,7 +204,7 @@ namespace PoweredSoft.DynamicQuery // the data. result.Data = CurrentQueryable.ToObjectList(); - + result.Aggregates = CalculateTotalAggregate(afterFilterQueryable); return result; }