persistence/Persistence/Services/WitsDataService.cs

90 lines
2.3 KiB
C#

using Persistence.Models;
using Persistence.Repositories;
using Persistence.Services.Interfaces;
namespace Persistence.Services;
public class WitsDataService : IWitsDataService
{
private readonly IParameterRepository witsDataRepository;
private const int multiplier = 1000;
public WitsDataService(IParameterRepository witsDataRepository)
{
this.witsDataRepository = witsDataRepository;
}
public Task<DatesRangeDto> GetDatesRangeAsync(int idDiscriminator, CancellationToken token)
{
var result = witsDataRepository.GetDatesRangeAsync(idDiscriminator, token);
return result;
}
public async Task<IEnumerable<WitsDataDto>> GetPart(int idDiscriminator, DateTimeOffset dateBegin, int take, CancellationToken token)
{
var dtos = await witsDataRepository.GetPart(idDiscriminator, dateBegin, take, token);
var result = new List<WitsDataDto>();
foreach (var dto in dtos)
{
var witsDataDto = result.FirstOrDefault(e => e.DiscriminatorId == dto.DiscriminatorId && e.Timestamped == dto.Timestamp);
if (witsDataDto == null)
{
witsDataDto = new WitsDataDto()
{
DiscriminatorId = dto.DiscriminatorId,
Timestamped = dto.Timestamp
};
result.Add(witsDataDto);
}
var witsValueDto = new WitsValueDto()
{
RecordId = DecodeRecordId(dto.ParameterId),
ItemId = DecodeItemId(dto.ParameterId),
Value = dto.Value
};
witsDataDto.Values.Append(witsValueDto);
}
return result;
}
public Task<WitsDataDto> GetValuesForGraph(DateTimeOffset dateFrom, DateTimeOffset dateTo)
{
throw new NotImplementedException();
}
public async Task<int> InsertRange(IEnumerable<WitsDataDto> dtos, CancellationToken token)
{
var parameterDtos = dtos.SelectMany(e => e.Values.Select(t => new ParameterDto()
{
DiscriminatorId = e.DiscriminatorId,
ParameterId = EncodeId(t.RecordId, t.ItemId),
Value = t.Value.ToString()!,
Timestamp = e.Timestamped
}));
var result = await witsDataRepository.InsertRange(parameterDtos, token);
return result;
}
private int EncodeId(int recordId, int itemId)
{
var resultId = multiplier * recordId + itemId;
return resultId;
}
private int DecodeRecordId(int id)
{
var resultId = id / multiplier;
return resultId;
}
private int DecodeItemId(int id)
{
var resultId = id % multiplier;
return resultId;
}
}