Example #1
0
        public ActionResult Counter([FromQuery] string[] name, DateTimeOffset from, DateTimeOffset to, int groupBySeconds)
        {
            var groupBy = TimeSpan.FromSeconds(groupBySeconds);

            // must be a whole number of groupBySeconds per day.
            if (!groupBy.IsDivisorOf(TimeSpan.FromDays(1)))
            {
                return(new JsonResult("Invalid groupBySeconds"));
            }

            DateTime fromUtc = from.UtcDateTime.RoundDown(groupBy);
            DateTime toUtc   = to.UtcDateTime.RoundUp(groupBy);

            // Database must order by Name, From.
            var aggregatedCounters = _database.GetAggregatedCounters(name, fromUtc, toUtc, groupBy);

            var counterResponses = new List <CounterResponseModel>();

            // partition by counter name
            foreach (var partition in aggregatedCounters.Partition((a, b) => a.name != b.name))
            {
                counterResponses.Add(new CounterResponseModel {
                    Name = partition.First().name, From = from, GroupBySeconds = groupBySeconds, Values = new List <object>()
                });

                foreach (var c in partition)
                {
                    for (var expected = fromUtc; expected < toUtc; expected = expected + groupBy)
                    {
                        counterResponses.Last().Values.Add(expected == c.from ? c.count : 0);
                    }
                }
            }

            return(new JsonResult(counterResponses));
        }