internal async Task CleanupAsync(IStatisticalDataAggregator aggregator, TimeResolution resolution, DateTime startTime, CancellationToken cancel)
        {
            var retentionPeriods = aggregator.RetentionPeriods;

            if (resolution == TimeResolution.Minute)
            {
                var recordsRetentionTime = startTime.AddMinutes(-retentionPeriods.Momentary);

                //_logger.LogTrace($"Cleaning up records for {aggregator.DataType}, resolution {resolution}, starttime {startTime}, retention time {recordsRetentionTime}");

                await _statDataProvider.CleanupRecordsAsync(aggregator.DataType, recordsRetentionTime, cancel)
                .ConfigureAwait(false);
            }

            DateTime retentionTime;

            switch (resolution)
            {
            case TimeResolution.Minute: retentionTime = startTime.AddHours(-retentionPeriods.Minutely); break;

            case TimeResolution.Hour: retentionTime = startTime.AddDays(-retentionPeriods.Hourly); break;

            case TimeResolution.Day: retentionTime = startTime.AddMonths(-retentionPeriods.Daily); break;

            case TimeResolution.Month: retentionTime = startTime.AddYears(-retentionPeriods.Monthly); break;

            default: throw new ArgumentOutOfRangeException(nameof(resolution), resolution, null);
            }

            //_logger.LogTrace($"Cleaning up aggregations for {aggregator.DataType}, resolution {resolution}, starttime {startTime}");

            await _statDataProvider.CleanupAggregationsAsync(aggregator.DataType, resolution, retentionTime, cancel)
            .ConfigureAwait(false);
        }
        private async Task <bool> TryProcessAggregationsAsync(IStatisticalDataAggregator aggregator,
                                                              DateTime startTime, DateTime endTimeExclusive,
                                                              TimeResolution targetResolution, CancellationToken cancel)
        {
            var resolution = targetResolution - 1;

            if (resolution < 0)
            {
                return(false);
            }

            var aggregations =
                (await _statDataProvider.LoadAggregatedUsageAsync(aggregator.DataType, resolution, startTime, endTimeExclusive, cancel))
                .ToArray();

            if (aggregations.Length == 0)
            {
                return(false);
            }

            //_logger.LogTrace($"Summarizing aggregations for {aggregator.DataType}, resolution: {targetResolution}, count: {aggregations.Length}");

            aggregator.Summarize(aggregations);
            return(true);
        }