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)); }
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()); }
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); } }