public override INullableQuerySerie <T> ExecuteGrouping() { var rows = Serie.Rows; if (!rows.Any() || !GroupTimes.Any()) { return(new NullableQuerySerie <T>(new List <ISingleDataRow <T?> >(), Serie)); } int index = 0; var max = rows.Count; var result = new List <ISingleDataRow <T?> >(); int?nextTimeRangeIndex = null; for (int groupIndex = 0; groupIndex < GroupTimes.Count; groupIndex++) { StartEndTime groupTime = GroupTimes[groupIndex]; StartEndTime nextGroupTime = (groupIndex + 1 < GroupTimes.Count) ? GroupTimes[groupIndex + 1] : null; var group = new List <ISingleDataRow <T> >(); while (index < max && rows[index].TimeUtc < groupTime.Start) { index++; } var startIndex = index; while (index < max && rows[index].TimeUtc < groupTime.End) { group.Add(rows[index]); if (nextTimeRangeIndex == null && nextGroupTime != null && rows[index].TimeUtc > nextGroupTime.Start) { nextTimeRangeIndex = Math.Max(index - 1, 0); } index++; } var aggregationData = new QuerySerie <T>(@group, groupTime.Start, groupTime.End) { PreviousRow = startIndex > 0 ? rows[startIndex - 1] : Serie.PreviousRow, NextRow = index < max ? rows[index] : Serie.NextRow }; result.Add(new SingleDataRow <T?>(groupTime.GetTimeStampByType(TimeStampType), AggregationFunc(aggregationData))); if (nextTimeRangeIndex != null) { index = nextTimeRangeIndex.Value; nextTimeRangeIndex = null; } } var resultData = new NullableQuerySerie <T>(result, Serie); return(resultData); }
public virtual IReadOnlyList <StartEndTime> CreateGroupTimes() { GroupTimes = (GroupTimes?.Select(i => CreateGroupTime(i.Start, i.End)) ?? Enumerable.Empty <StartEndTime>()).ToList(); return(GroupTimes); }