private IEnumerable <TimeStatisticItem> SumItems(IEnumerable <TimeStatisticItem> statisticsPerDay, int daysPerItem, TimeRange expectedTimeRange)
 {
     for (var i = 0; i <= expectedTimeRange.DaysBetween / daysPerItem; i++)
     {
         var itemsToSum = statisticsPerDay.Skip(i * daysPerItem).Take(daysPerItem);
         var sum        = itemsToSum.Sum(x => x.Value);
         var item       = new TimeStatisticItem(TimeRange.Create(itemsToSum.First().Time.Start, itemsToSum.Last().Time.End), sum);
         yield return(item);
     }
 }
        public IEnumerable <TimeStatisticItem> GetStatisticsPerHour(IEnumerable <Message> latestMessages, TimeRange expectedTimeRange)
        {
            var result = new List <TimeStatisticItem>();

            expectedTimeRange.ForeachHour((i, hour) =>
            {
                var sum  = latestMessages.Where(x => x.SentAt.Date == hour.Date && x.SentAt.Hour == hour.Hour).Count();
                var item = new TimeStatisticItem(TimeRange.Create(hour, hour.AddHours(1).AddSeconds(-1)), sum);
                result.Add(item);
            });
            return(result);
        }
        public IEnumerable <TimeStatisticItem> GetStatisticsPerMinute(IEnumerable <Message> latestMessages, TimeRange expectedTimeRange)
        {
            var result = new List <TimeStatisticItem>();

            expectedTimeRange.ForeachMinute((i, minute) =>
            {
                var sum  = latestMessages.Where(x => x.SentAt.Date == minute.Date && x.SentAt.Hour == minute.Hour && x.SentAt.Minute == minute.Minute).Count();
                var item = new TimeStatisticItem(TimeRange.Create(minute, minute.AddMinutes(1).AddSeconds(-1)), sum);
                result.Add(item);
            });
            return(result);
        }
        public IEnumerable <TimeStatisticItem> GetStatisticsPerDay(IEnumerable <PreGeneratedStatistic> preGeneratedStatistics, IEnumerable <Message> latestMessages, TimeRange expectedTimeRange)
        {
            latestMessages = this.FilterMessages(latestMessages, preGeneratedStatistics);
            var oldestLastMessagesDate = latestMessages.OrderBy(x => x.SentAt).FirstOrDefault()?.SentAt ?? DateTime.Today;
            var result = new List <TimeStatisticItem>();

            expectedTimeRange.ForeachDay((i, day) =>
            {
                var sum = 0;
                if (day >= oldestLastMessagesDate.Date)
                {
                    sum += latestMessages.Where(x => x.SentAt.Date == day).Count();
                }
                sum     += preGeneratedStatistics.Where(x => x.Period == Period.Day && x.TimeRange.Start == day).OrderBy(x => x.CreatedAt).FirstOrDefault()?.Count ?? 0;
                var item = new TimeStatisticItem(TimeRange.Create(day, day.AddDays(1).AddSeconds(-1)), sum);
                result.Add(item);
            });
            return(result);
        }