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 GetDatesRangeAsync(int idDiscriminator, CancellationToken token) { var result = witsDataRepository.GetDatesRangeAsync(idDiscriminator, token); return result; } public async Task> GetPart(int idDiscriminator, DateTimeOffset dateBegin, int take, CancellationToken token) { var dtos = await witsDataRepository.GetPart(idDiscriminator, dateBegin, take, token); var result = new List(); 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 GetValuesForGraph(DateTimeOffset dateFrom, DateTimeOffset dateTo) { throw new NotImplementedException(); } public async Task InsertRange(IEnumerable 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; } }