public Task <IEnumerable <Snapshot> > GetAsync(
            [FromRoute] Guid minerId,
            [FromQuery] DateTime?from = null,
            [FromQuery] DateTime?to   = null,
            CancellationToken token   = default)
        {
            var end    = to?.ToUniversalTime() ?? DateTime.UtcNow;
            var start  = from?.ToUniversalTime() ?? end.AddHours(-1);
            var period = new ConcretePeriod(start, end);

            return(_snapshotService.GetByMinerFillGapsAsync(minerId, period, TimeSpan.FromMinutes(1), token));
        }
Пример #2
0
 public async Task <IEnumerable <Snapshot> > GetByMinerFillGapsAsync(Guid minerId, ConcretePeriod period, TimeSpan interval, CancellationToken token = default)
 {
     return((await GetByMinerAsync(minerId, period, token)).FillGaps(period, interval).ToList());
 }
Пример #3
0
        public static IEnumerable <Snapshot> FillGaps(this IEnumerable <Snapshot> snapshots, ConcretePeriod expectedPeriod, TimeSpan expectedInterval)
        {
            var bufferTime = expectedInterval + expectedInterval;
            var previous   = new Snapshot
            {
                SnapshotTime = expectedPeriod.Start
            };

            foreach (var snapshot in snapshots.OrderBy(s => s.SnapshotTime))
            {
                while (expectedInterval > TimeSpan.Zero && snapshot.SnapshotTime - previous.SnapshotTime >= bufferTime)
                {
                    previous = new Snapshot
                    {
                        SnapshotTime = previous.SnapshotTime + expectedInterval
                    };
                    yield return(previous);
                }

                yield return(snapshot);

                previous = snapshot;
            }
            var doubleBufferTime = bufferTime + bufferTime;

            if (previous.SnapshotTime >= expectedPeriod.End - doubleBufferTime)
            {
                yield break;
            }
            while (expectedInterval > TimeSpan.Zero && previous.SnapshotTime <= expectedPeriod.End - bufferTime)
            {
                previous = new Snapshot
                {
                    SnapshotTime = previous.SnapshotTime + expectedInterval
                };
                yield return(previous);
            }
        }