grouping result is ready, next step is to flatten the aggregates that match.
This commit is contained in:
parent
01de3b480b
commit
4bb96b2058
@ -79,7 +79,7 @@ namespace PoweredSoft.DynamicQuery.Cli
|
|||||||
var queryable = list.AsQueryable();
|
var queryable = list.AsQueryable();
|
||||||
var criteria = new QueryCriteria();
|
var criteria = new QueryCriteria();
|
||||||
criteria.Page = 1;
|
criteria.Page = 1;
|
||||||
criteria.PageSize = 2;
|
criteria.PageSize = 10;
|
||||||
|
|
||||||
criteria.Groups = new List<IGroup>()
|
criteria.Groups = new List<IGroup>()
|
||||||
{
|
{
|
||||||
|
@ -24,8 +24,9 @@ namespace PoweredSoft.DynamicQuery
|
|||||||
|
|
||||||
protected virtual IQueryExecutionResult ExecuteGrouping<T>()
|
protected virtual IQueryExecutionResult ExecuteGrouping<T>()
|
||||||
{
|
{
|
||||||
var result = new GroupedQueryExecutionResult();
|
var result = new QueryExecutionResult();
|
||||||
result.TotalRecords = CurrentQueryable.LongCount();
|
result.TotalRecords = CurrentQueryable.LongCount();
|
||||||
|
CalculatePageCount(result);
|
||||||
|
|
||||||
// intercept groups in advance to avoid doing it more than once :)
|
// intercept groups in advance to avoid doing it more than once :)
|
||||||
var finalGroups = Criteria.Groups.Select(g => InterceptGroup<T>(g)).ToList();
|
var finalGroups = Criteria.Groups.Select(g => InterceptGroup<T>(g)).ToList();
|
||||||
@ -48,7 +49,7 @@ namespace PoweredSoft.DynamicQuery
|
|||||||
{
|
{
|
||||||
var groupKeyIndex = -1;
|
var groupKeyIndex = -1;
|
||||||
previousGroups.ForEach(pg => sb.Key($"Key_{++groupKeyIndex}"));
|
previousGroups.ForEach(pg => sb.Key($"Key_{++groupKeyIndex}"));
|
||||||
sb.Key($"Key_{++groupKeyIndex}");
|
sb.Key($"Key_{++groupKeyIndex}", $"Key_{groupKeyIndex}");
|
||||||
Criteria.Aggregates.ForEach(a =>
|
Criteria.Aggregates.ForEach(a =>
|
||||||
{
|
{
|
||||||
var selectType = ResolveSelectFrom(a.Type);
|
var selectType = ResolveSelectFrom(a.Type);
|
||||||
@ -80,24 +81,51 @@ namespace PoweredSoft.DynamicQuery
|
|||||||
CurrentQueryable = CurrentQueryable.GroupBy(QueryableUnderlyingType, gb => finalGroups.ForEach((fg, index) => gb.Path(fg.Path, $"Key_{index}")));
|
CurrentQueryable = CurrentQueryable.GroupBy(QueryableUnderlyingType, gb => finalGroups.ForEach((fg, index) => gb.Path(fg.Path, $"Key_{index}")));
|
||||||
CurrentQueryable = CurrentQueryable.Select(sb =>
|
CurrentQueryable = CurrentQueryable.Select(sb =>
|
||||||
{
|
{
|
||||||
finalGroups.ForEach((fg, index) => sb.Key($"Key_{index}"));
|
finalGroups.ForEach((fg, index) => sb.Key($"Key_{index}", $"Key_{index}"));
|
||||||
sb.ToList("Records");
|
sb.ToList("Records");
|
||||||
});
|
});
|
||||||
|
|
||||||
var temp = CurrentQueryable.ToDynamicClassList();
|
var groupRecords = CurrentQueryable.ToDynamicClassList();
|
||||||
|
result.Data = groupRecords.Select((groupRecord, groupRecordIndex) =>
|
||||||
|
{
|
||||||
|
var groupRecordResult = new GroupQueryResult();
|
||||||
|
GroupQueryResult previous = null;
|
||||||
|
|
||||||
|
Criteria.Groups.ForEach((g, gi) =>
|
||||||
|
{
|
||||||
|
bool isFirst = gi == 0;
|
||||||
|
bool isLast = Criteria.Groups.Count - 1 == gi;
|
||||||
|
var cgrr = isFirst ? groupRecordResult : new GroupQueryResult();
|
||||||
|
cgrr.GroupPath = g.Path;
|
||||||
|
cgrr.GroupValue = groupRecord.GetDynamicPropertyValue($"Key_{gi}");
|
||||||
|
|
||||||
|
|
||||||
|
if (!isLast)
|
||||||
|
cgrr.Data = new List<object>();
|
||||||
|
else
|
||||||
|
cgrr.Data = groupRecord.GetDynamicPropertyValue<List<T>>("Records").Cast<object>().ToList();
|
||||||
|
|
||||||
|
if (previous != null)
|
||||||
|
previous.Data.Add(cgrr);
|
||||||
|
|
||||||
|
previous = cgrr;
|
||||||
|
});
|
||||||
|
|
||||||
|
return (object)groupRecordResult;
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected virtual IQueryExecutionResult ExecuteNoGrouping<T>()
|
protected virtual IQueryExecutionResult ExecuteNoGrouping<T>()
|
||||||
{
|
{
|
||||||
var result = new QueryExecutionResult();
|
var result = new QueryExecutionResult();
|
||||||
|
|
||||||
// total records.
|
// total records.
|
||||||
result.TotalRecords = CurrentQueryable.LongCount();
|
result.TotalRecords = CurrentQueryable.LongCount();
|
||||||
|
CalculatePageCount(result);
|
||||||
|
|
||||||
// sorts and paging.
|
// sorts and paging.
|
||||||
ApplySorting<T>();
|
ApplySorting<T>();
|
||||||
@ -106,14 +134,6 @@ namespace PoweredSoft.DynamicQuery
|
|||||||
// the data.
|
// the data.
|
||||||
result.Data = CurrentQueryable.ToObjectList();
|
result.Data = CurrentQueryable.ToObjectList();
|
||||||
|
|
||||||
// if there is paging.
|
|
||||||
if (HasPaging)
|
|
||||||
{
|
|
||||||
if (result.TotalRecords < Criteria.PageSize)
|
|
||||||
result.NumberOfPages = 1;
|
|
||||||
else
|
|
||||||
result.NumberOfPages = result.TotalRecords / Criteria.PageSize + (result.TotalRecords % Criteria.PageSize != 0 ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,18 @@ namespace PoweredSoft.DynamicQuery
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual void CalculatePageCount(IQueryExecutionResult result)
|
||||||
|
{
|
||||||
|
if (!HasPaging)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (result.TotalRecords < Criteria.PageSize)
|
||||||
|
result.NumberOfPages = 1;
|
||||||
|
else
|
||||||
|
result.NumberOfPages = result.TotalRecords / Criteria.PageSize + (result.TotalRecords % Criteria.PageSize != 0 ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected virtual List<ISort> InterceptSort<T>(ISort sort)
|
protected virtual List<ISort> InterceptSort<T>(ISort sort)
|
||||||
{
|
{
|
||||||
var original = new List<ISort>()
|
var original = new List<ISort>()
|
||||||
|
@ -25,26 +25,17 @@ namespace PoweredSoft.DynamicQuery
|
|||||||
public bool ShouldSerializeAggregates() => Aggregates != null;
|
public bool ShouldSerializeAggregates() => Aggregates != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// not grouped.
|
// just result
|
||||||
public class QueryExecutionResult : QueryResult, IQueryExecutionResult
|
public class QueryExecutionResult : QueryResult, IQueryExecutionResult
|
||||||
{
|
{
|
||||||
public long TotalRecords { get; set; }
|
public long TotalRecords { get; set; }
|
||||||
public long? NumberOfPages { get; set; }
|
public long? NumberOfPages { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// grouped.
|
// group result.
|
||||||
public class GroupQueryResult : QueryResult, IGroupQueryResult
|
public class GroupQueryResult : QueryResult, IGroupQueryResult
|
||||||
{
|
{
|
||||||
public string GroupPath { get; set; }
|
public string GroupPath { get; set; }
|
||||||
public object GroupValue { get; set; }
|
public object GroupValue { get; set; }
|
||||||
|
|
||||||
public IEnumerable<IQueryResult> GroupItems => Data.Cast<IQueryResult>();
|
|
||||||
public bool ShouldSerializeGroupItems() => false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GroupedQueryExecutionResult : GroupQueryResult, IQueryExecutionResult
|
|
||||||
{
|
|
||||||
public long TotalRecords { get; set; }
|
|
||||||
public long? NumberOfPages { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user