Example #1
0
        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);
        }
Example #2
0
 public virtual IReadOnlyList <StartEndTime> CreateGroupTimes()
 {
     GroupTimes =
         (GroupTimes?.Select(i => CreateGroupTime(i.Start, i.End)) ?? Enumerable.Empty <StartEndTime>()).ToList();
     return(GroupTimes);
 }