Innovenergy_trunk/csharp/Lib/S3/Drivers/Internal/Reader.cs

50 lines
1.6 KiB
C#

using InnovEnergy.Lib.S3.Drivers.Internal.Delegates;
using InnovEnergy.Lib.S3.Metadata;
using InnovEnergy.Lib.S3.Records.Specialized;
using InnovEnergy.Lib.Time.Unix;
using InnovEnergy.Lib.Utils;
namespace InnovEnergy.Lib.S3.Drivers.Internal;
public partial class Reader
{
public IReadOnlyList<AggregationLevel> AggregationLevels { get; }
public UnixTimeSpan SamplePeriod => AggregationLevels[0].SamplePeriod;
private readonly ReadRecord _ReadRecord;
internal Reader(IReadOnlyList<AggregationLevel> levels, ReadRecord readRecord)
{
_ReadRecord = readRecord;
AggregationLevels = InitLevels(levels);
}
public Task<TimeStampedRecord> ReadRecord(AggregationLevel level, UInt32 index)
{
return _ReadRecord(level, index);
}
private static IReadOnlyList<AggregationLevel> InitLevels(IReadOnlyList<AggregationLevel> levels)
{
if (!levels.Any())
throw new ArgumentOutOfRangeException(nameof(levels));
levels = levels
.OrderBy(l => l.SamplePeriod.Ticks)
.ToReadOnlyList(levels.Count);
var pairwise = levels
.Select(l => l.SamplePeriod)
.Pairwise()
.ToReadOnlyList(levels.Count - 1);
var greater = pairwise.Any(ls => ls.right <= ls.left);
var multiple = pairwise.Any(ls => ls.right % ls.left != 0 );
var retention = levels .Any(l => l.RetentionPeriod % l.SamplePeriod != 0);
if (greater || multiple || retention)
throw new ArgumentException(nameof(levels)); // TODO: error messages
return levels;
}
}