StatisticsCalculator
using System.Collections.Concurrent;
using System.Linq;
namespace Relativity.Transfer.Job
{
internal class StatisticsCalculator : IStatisticsCalculator
{
private readonly ConcurrentBag<ITransferStatistics> savedStatistics = new ConcurrentBag<ITransferStatistics>();
private long lastTotalTransferredBytes;
private double lastTransferTimeSeconds;
private readonly IStatisticsTotalsCalculator totalsCalculator;
public int Count => savedStatistics.Count;
public StatisticsCalculator(IStatisticsTotalsCalculator totalsCalculator)
{
this.totalsCalculator = totalsCalculator;
}
public TransferStatistics Calculate(ITransferStatistics previousStatistics)
{
TransferStatistics transferStatistics = new TransferStatistics(previousStatistics);
IStatisticsTotals statisticsTotals = totalsCalculator.Calculate();
transferStatistics.AssignTotals(statisticsTotals);
transferStatistics.TransferTimeSeconds = previousStatistics.TransferTimeSeconds + savedStatistics.Sum((ITransferStatistics x) => x.TransferTimeSeconds);
transferStatistics.StartTime = (statisticsTotals.HasDirectories ? previousStatistics.StartTime : (savedStatistics.FirstOrDefault() ?? previousStatistics).StartTime);
transferStatistics.Progress = CalculateProgress(transferStatistics);
transferStatistics.AverageTransferRateMbps = TransferHelper.CalculateTransferRateMbps(transferStatistics.TotalTransferredBytes, transferStatistics.TransferTimeSeconds);
transferStatistics.TransferRateMbps = CalculateTransferRate(transferStatistics);
lastTransferTimeSeconds = transferStatistics.TransferTimeSeconds;
lastTotalTransferredBytes = transferStatistics.TotalTransferredBytes;
return transferStatistics;
}
public void Save(ITransferStatistics statistics)
{
savedStatistics.Add(statistics);
lastTotalTransferredBytes = 0;
lastTransferTimeSeconds = 0;
}
public void Clear()
{
while (!savedStatistics.IsEmpty) {
savedStatistics.TryTake(out ITransferStatistics _);
}
}
private static double CalculateProgress(ITransferStatistics statistics)
{
if (statistics.TotalRequestBytes > 0)
return TransferHelper.CalculateByteLevelProgress(statistics.TotalRequestBytes, statistics.TotalTransferredBytes);
return TransferHelper.CalculateFileLevelProgress(statistics.TotalRequestFiles, statistics.TotalTransferredFiles, statistics.TotalFailedFiles);
}
private double CalculateTransferRate(ITransferStatistics copy)
{
long num = copy.TotalTransferredBytes - lastTotalTransferredBytes;
double num2 = copy.TransferTimeSeconds - lastTransferTimeSeconds;
if (lastTotalTransferredBytes > 0 && num > 0 && num2 > 0)
return TransferHelper.CalculateTransferRateMbps(num, num2);
return copy.AverageTransferRateMbps;
}
}
}