#925 Доработать ITimestampedValuesClient и IChangeLogClient под асибр #20
@ -1,6 +1,9 @@
|
|||||||
name: Unit tests
|
name: Unit tests
|
||||||
run-name: ${{ gitea.actor }} is testing
|
run-name: ${{ gitea.actor }} is testing
|
||||||
on: push
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@ -32,7 +35,15 @@ jobs:
|
|||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: 9.0.x
|
dotnet-version: 9.0.x
|
||||||
|
- name: Add gitea as nuget source
|
||||||
|
run: dotnet nuget add source --name gitea --username publisher --password ${{ secrets.PUBLISHER_PASSWORD }} --store-password-in-clear-text https://git.ddrilling.ru/api/packages/DDrilling/nuget/index.json
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Run integration tests
|
- name: Run integration tests
|
||||||
run: dotnet test DD.Persistence.IntegrationTests
|
run: dotnet test DD.Persistence.IntegrationTests
|
||||||
|
- name: Run unit tests
|
||||||
|
run: dotnet test DD.Persistence.Test --no-build
|
||||||
|
- name: Pack Persistence Client
|
||||||
|
run: dotnet pack DD.Persistence.Client/DD.Persistence.Client.csproj -c Debug -o ./artifacts
|
||||||
|
- name: Publish Persistence Client Package
|
||||||
|
run: dotnet nuget push ./artifacts/DD.Persistence.Client.*.nupkg --source gitea --skip-duplicate
|
||||||
|
@ -24,7 +24,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
|
||||||
public async Task<IActionResult> Add(
|
public async Task<IActionResult> Add(
|
||||||
[FromRoute] Guid idDiscriminator,
|
[FromRoute] Guid idDiscriminator,
|
||||||
[FromBody] DataWithWellDepthAndSectionDto dto,
|
[FromBody] ChangeLogValuesDto dto,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
@ -37,7 +37,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
|
||||||
public async Task<IActionResult> AddRange(
|
public async Task<IActionResult> AddRange(
|
||||||
[FromRoute] Guid idDiscriminator,
|
[FromRoute] Guid idDiscriminator,
|
||||||
[FromBody] IEnumerable<DataWithWellDepthAndSectionDto> dtos,
|
[FromBody] IEnumerable<ChangeLogValuesDto> dtos,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
@ -70,7 +70,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> ClearAndAddRange(
|
public async Task<IActionResult> ClearAndAddRange(
|
||||||
[FromRoute] Guid idDiscriminator,
|
[FromRoute] Guid idDiscriminator,
|
||||||
[FromBody] IEnumerable<DataWithWellDepthAndSectionDto> dtos,
|
[FromBody] IEnumerable<ChangeLogValuesDto> dtos,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
@ -81,7 +81,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
[HttpPut]
|
[HttpPut]
|
||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> Update(
|
public async Task<IActionResult> Update(
|
||||||
DataWithWellDepthAndSectionDto dto,
|
ChangeLogValuesDto dto,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
@ -93,7 +93,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
[HttpPut("range")]
|
[HttpPut("range")]
|
||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> UpdateRange(
|
public async Task<IActionResult> UpdateRange(
|
||||||
IEnumerable<DataWithWellDepthAndSectionDto> dtos,
|
IEnumerable<ChangeLogValuesDto> dtos,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
@ -103,29 +103,27 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{idDiscriminator}")]
|
[HttpGet("{idDiscriminator}")]
|
||||||
[ProducesResponseType(typeof(PaginationContainer<DataWithWellDepthAndSectionDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(PaginationContainer<ChangeLogValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> GetCurrent(
|
public async Task<IActionResult> GetCurrent(
|
||||||
[FromRoute] Guid idDiscriminator,
|
[FromRoute] Guid idDiscriminator,
|
||||||
[FromQuery] SectionPartRequest filterRequest,
|
|
||||||
[FromQuery] PaginationRequest paginationRequest,
|
[FromQuery] PaginationRequest paginationRequest,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
||||||
var result = await repository.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, token);
|
var result = await repository.GetByDate(idDiscriminator, moment, paginationRequest, token);
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("moment/{idDiscriminator}")]
|
[HttpGet("moment/{idDiscriminator}")]
|
||||||
[ProducesResponseType(typeof(PaginationContainer<DataWithWellDepthAndSectionDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(PaginationContainer<ChangeLogValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> GetByDate(
|
public async Task<IActionResult> GetByDate(
|
||||||
[FromRoute] Guid idDiscriminator,
|
[FromRoute] Guid idDiscriminator,
|
||||||
DateTimeOffset moment,
|
DateTimeOffset moment,
|
||||||
[FromQuery] SectionPartRequest filterRequest,
|
|
||||||
[FromQuery] PaginationRequest paginationRequest,
|
[FromQuery] PaginationRequest paginationRequest,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await repository.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, token);
|
var result = await repository.GetByDate(idDiscriminator, moment, paginationRequest, token);
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
@ -155,9 +153,9 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("part/{idDiscriminator}")]
|
[HttpGet("part/{idDiscriminator}")]
|
||||||
[ProducesResponseType(typeof(IEnumerable<DataWithWellDepthAndSectionDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<ChangeLogValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
public async Task<ActionResult<IEnumerable<DataWithWellDepthAndSectionDto>>> GetPart([FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default)
|
public async Task<ActionResult<IEnumerable<ChangeLogValuesDto>>> GetPart([FromRoute] Guid idDiscriminator, DateTimeOffset dateBegin, int take = 86400, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var result = await repository.GetGtDate(idDiscriminator, dateBegin, token);
|
var result = await repository.GetGtDate(idDiscriminator, dateBegin, token);
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using DD.Persistence.Models;
|
using DD.Persistence.Models;
|
||||||
using DD.Persistence.Models.Common;
|
using DD.Persistence.Models.Common;
|
||||||
|
using DD.Persistence.Repositories;
|
||||||
using DD.Persistence.Services.Interfaces;
|
using DD.Persistence.Services.Interfaces;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@ -12,14 +13,15 @@ namespace DD.Persistence.API.Controllers;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[Route("api/[controller]/{discriminatorId}")]
|
[Route("api/[controller]")]
|
||||||
public class TimestampedValuesController : ControllerBase
|
public class TimestampedValuesController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly ITimestampedValuesService timestampedValuesRepository;
|
private readonly ITimestampedValuesService timestampedValuesService;
|
||||||
|
private readonly ITimestampedValuesRepository timestampedValuesRepository;
|
||||||
public TimestampedValuesController(ITimestampedValuesService repository)
|
public TimestampedValuesController(ITimestampedValuesService repository, ITimestampedValuesRepository timestampedValuesRepository)
|
||||||
{
|
{
|
||||||
this.timestampedValuesRepository = repository;
|
this.timestampedValuesService = repository;
|
||||||
|
this.timestampedValuesRepository = timestampedValuesRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -29,11 +31,11 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpPost]
|
[HttpPost("{discriminatorId}")]
|
||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
|
||||||
public async Task<IActionResult> AddRange([FromRoute] Guid discriminatorId, [FromBody] IEnumerable<TimestampedValuesDto> dtos, CancellationToken token)
|
public async Task<IActionResult> AddRange([FromRoute] Guid discriminatorId, [FromBody] IEnumerable<TimestampedValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.AddRange(discriminatorId, dtos, token);
|
var result = await timestampedValuesService.AddRange(discriminatorId, dtos, token);
|
||||||
|
|
||||||
return CreatedAtAction(nameof(AddRange), result);
|
return CreatedAtAction(nameof(AddRange), result);
|
||||||
}
|
}
|
||||||
@ -41,7 +43,7 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с фильтрацией. Значение фильтра null - отключен
|
/// Получение данных с фильтрацией. Значение фильтра null - отключен
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorIds">Набор дискриминаторов</param>
|
||||||
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
||||||
/// <param name="columnNames">Фильтр свойств набора</param>
|
/// <param name="columnNames">Фильтр свойств набора</param>
|
||||||
/// <param name="skip"></param>
|
/// <param name="skip"></param>
|
||||||
@ -50,9 +52,9 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> Get([FromRoute] Guid discriminatorId, DateTimeOffset? timestampBegin, [FromQuery] string[]? columnNames, int skip, int take, CancellationToken token)
|
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> Get([FromQuery] IEnumerable<Guid> discriminatorIds, DateTimeOffset? timestampBegin, [FromQuery] string[]? columnNames, int skip, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.Get(discriminatorId, timestampBegin, columnNames, skip, take, token);
|
var result = await timestampedValuesService.Get(discriminatorIds, timestampBegin, columnNames, skip, take, token);
|
||||||
|
|
||||||
return result.Any() ? Ok(result) : NoContent();
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
}
|
}
|
||||||
@ -63,12 +65,12 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
||||||
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet("gtdate")]
|
[HttpGet("{discriminatorId}/gtdate")]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetGtDate([FromRoute] Guid discriminatorId, DateTimeOffset timestampBegin, CancellationToken token)
|
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetGtDate([FromRoute] Guid discriminatorId, DateTimeOffset timestampBegin, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetGtDate(discriminatorId, timestampBegin, token);
|
var result = await timestampedValuesService.GetGtDate(discriminatorId, timestampBegin, token);
|
||||||
|
|
||||||
return result.Any() ? Ok(result) : NoContent();
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
}
|
}
|
||||||
@ -79,12 +81,12 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
||||||
/// <param name="take"></param>
|
/// <param name="take"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet("first")]
|
[HttpGet("{discriminatorId}/first")]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetFirst([FromRoute] Guid discriminatorId, int take, CancellationToken token)
|
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetFirst([FromRoute] Guid discriminatorId, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetFirst(discriminatorId, take, token);
|
var result = await timestampedValuesService.GetFirst(discriminatorId, take, token);
|
||||||
|
|
||||||
return result.Any() ? Ok(result) : NoContent();
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
}
|
}
|
||||||
@ -95,12 +97,12 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
||||||
/// <param name="take"></param>
|
/// <param name="take"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet("last")]
|
[HttpGet("{discriminatorId}/last")]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetLast([FromRoute] Guid discriminatorId, int take, CancellationToken token)
|
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetLast([FromRoute] Guid discriminatorId, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetLast(discriminatorId, take, token);
|
var result = await timestampedValuesService.GetLast(discriminatorId, take, token);
|
||||||
|
|
||||||
return result.Any() ? Ok(result) : NoContent();
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
}
|
}
|
||||||
@ -113,12 +115,12 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <param name="intervalSec"></param>
|
/// <param name="intervalSec"></param>
|
||||||
/// <param name="approxPointsCount"></param>
|
/// <param name="approxPointsCount"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet("resampled")]
|
[HttpGet("{discriminatorId}/resampled")]
|
||||||
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetResampledData([FromRoute] Guid discriminatorId, DateTimeOffset timestampBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default)
|
public async Task<ActionResult<IEnumerable<TimestampedValuesDto>>> GetResampledData([FromRoute] Guid discriminatorId, DateTimeOffset timestampBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetResampledData(discriminatorId, timestampBegin, intervalSec, approxPointsCount, token);
|
var result = await timestampedValuesService.GetResampledData(discriminatorId, timestampBegin, intervalSec, approxPointsCount, token);
|
||||||
|
|
||||||
return result.Any() ? Ok(result) : NoContent();
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
}
|
}
|
||||||
@ -128,7 +130,7 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet("count")]
|
[HttpGet("{discriminatorId}/count")]
|
||||||
public async Task<ActionResult<int>> Count([FromRoute] Guid discriminatorId, CancellationToken token)
|
public async Task<ActionResult<int>> Count([FromRoute] Guid discriminatorId, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.Count(discriminatorId, token);
|
var result = await timestampedValuesRepository.Count(discriminatorId, token);
|
||||||
@ -141,7 +143,7 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discriminatorId"></param>
|
/// <param name="discriminatorId"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet("datesRange")]
|
[HttpGet("{discriminatorId}/datesRange")]
|
||||||
public async Task<ActionResult<DatesRangeDto>> GetDatesRange([FromRoute] Guid discriminatorId, CancellationToken token)
|
public async Task<ActionResult<DatesRangeDto>> GetDatesRange([FromRoute] Guid discriminatorId, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetDatesRange(discriminatorId, token);
|
var result = await timestampedValuesRepository.GetDatesRange(discriminatorId, token);
|
||||||
|
@ -7,16 +7,19 @@ using DD.Persistence.Client.Clients.Interfaces.Refit;
|
|||||||
using DD.Persistence.Models.Common;
|
using DD.Persistence.Models.Common;
|
||||||
|
|
||||||
namespace DD.Persistence.Client.Clients;
|
namespace DD.Persistence.Client.Clients;
|
||||||
|
/// <inheritdoc/>
|
||||||
public class ChangeLogClient : BaseClient, IChangeLogClient
|
public class ChangeLogClient : BaseClient, IChangeLogClient
|
||||||
{
|
{
|
||||||
private readonly IRefitChangeLogClient refitChangeLogClient;
|
private readonly IRefitChangeLogClient refitChangeLogClient;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public ChangeLogClient(IRefitClientFactory<IRefitChangeLogClient> refitClientFactory, ILogger<ChangeLogClient> logger) : base(logger)
|
public ChangeLogClient(IRefitClientFactory<IRefitChangeLogClient> refitClientFactory, ILogger<ChangeLogClient> logger) : base(logger)
|
||||||
{
|
{
|
||||||
this.refitChangeLogClient = refitClientFactory.Create();
|
this.refitChangeLogClient = refitClientFactory.Create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token)
|
/// <inheritdoc/>
|
||||||
|
public async Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, token), token);
|
async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, token), token);
|
||||||
@ -24,15 +27,17 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment,
|
/// <inheritdoc/>
|
||||||
SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token)
|
public async Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment,
|
||||||
|
PaginationRequest paginationRequest, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitChangeLogClient.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, token), token);
|
async () => await refitChangeLogClient.GetByDate(idDiscriminator, moment, paginationRequest, token), token);
|
||||||
|
|
||||||
return result;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public async Task<IEnumerable<ChangeLogDto>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token)
|
public async Task<IEnumerable<ChangeLogDto>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
@ -41,7 +46,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result!;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token)
|
/// <inheritdoc/>
|
||||||
|
public async Task<int> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecutePostResponse(
|
var result = await ExecutePostResponse(
|
||||||
async () => await refitChangeLogClient.Add(idDiscriminator, dto, token), token);
|
async () => await refitChangeLogClient.Add(idDiscriminator, dto, token), token);
|
||||||
@ -49,7 +55,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token)
|
/// <inheritdoc/>
|
||||||
|
public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecutePostResponse(
|
var result = await ExecutePostResponse(
|
||||||
async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, token), token);
|
async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, token), token);
|
||||||
@ -57,7 +64,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token)
|
/// <inheritdoc/>
|
||||||
|
public async Task<int> Update(ChangeLogValuesDto dto, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecutePostResponse(
|
var result = await ExecutePostResponse(
|
||||||
async () => await refitChangeLogClient.Update(dto, token), token);
|
async () => await refitChangeLogClient.Update(dto, token), token);
|
||||||
@ -65,7 +73,8 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token)
|
/// <inheritdoc/>
|
||||||
|
public async Task<int> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecutePostResponse(
|
var result = await ExecutePostResponse(
|
||||||
async () => await refitChangeLogClient.UpdateRange(dtos, token), token);
|
async () => await refitChangeLogClient.UpdateRange(dtos, token), token);
|
||||||
@ -73,6 +82,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public async Task<int> Delete(Guid id, CancellationToken token)
|
public async Task<int> Delete(Guid id, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecutePostResponse(
|
var result = await ExecutePostResponse(
|
||||||
@ -81,6 +91,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public async Task<int> DeleteRange(IEnumerable<Guid> ids, CancellationToken token)
|
public async Task<int> DeleteRange(IEnumerable<Guid> ids, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecutePostResponse(
|
var result = await ExecutePostResponse(
|
||||||
@ -89,6 +100,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public async Task<DatesRangeDto?> GetDatesRange(Guid idDiscriminator, CancellationToken token)
|
public async Task<DatesRangeDto?> GetDatesRange(Guid idDiscriminator, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
@ -97,6 +109,7 @@ public class ChangeLogClient : BaseClient, IChangeLogClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
refitChangeLogClient.Dispose();
|
refitChangeLogClient.Dispose();
|
||||||
|
@ -16,7 +16,7 @@ public interface IChangeLogClient : IDisposable
|
|||||||
/// <param name="dto"></param>
|
/// <param name="dto"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token);
|
Task<int> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Добавить несколько записей
|
/// Добавить несколько записей
|
||||||
@ -25,7 +25,7 @@ public interface IChangeLogClient : IDisposable
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<int> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Импорт с заменой: удаление старых строк и добавление новых
|
/// Импорт с заменой: удаление старых строк и добавление новых
|
||||||
@ -34,7 +34,7 @@ public interface IChangeLogClient : IDisposable
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить одну запись
|
/// Удалить одну запись
|
||||||
@ -57,11 +57,10 @@ public interface IChangeLogClient : IDisposable
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idDiscriminator"></param>
|
/// <param name="idDiscriminator"></param>
|
||||||
/// <param name="moment"></param>
|
/// <param name="moment"></param>
|
||||||
/// <param name="filterRequest"></param>
|
|
||||||
/// <param name="paginationRequest"></param>
|
/// <param name="paginationRequest"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token);
|
Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, PaginationRequest paginationRequest, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение исторических данных за определенный период времени
|
/// Получение исторических данных за определенный период времени
|
||||||
@ -87,7 +86,7 @@ public interface IChangeLogClient : IDisposable
|
|||||||
/// <param name="dto"></param>
|
/// <param name="dto"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token);
|
Task<int> Update(ChangeLogValuesDto dto, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновить несколько записей
|
/// Обновить несколько записей
|
||||||
@ -95,5 +94,5 @@ public interface IChangeLogClient : IDisposable
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<int> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
}
|
}
|
@ -20,15 +20,20 @@ public interface ITimestampedValuesClient : IDisposable
|
|||||||
Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token);
|
Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить данные с фильтрацией. Значение фильтра null - отключен
|
/// Получить данные с фильтрацией для нескольких систем. Значение фильтра null - отключен
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorIds">Набор дискриминаторов (идентификаторов)</param>
|
||||||
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
||||||
/// <param name="columnNames">Фильтр свойств набора</param>
|
/// <param name="columnNames">Фильтр свойств набора</param>
|
||||||
/// <param name="skip"></param>
|
/// <param name="skip"></param>
|
||||||
/// <param name="take"></param>
|
/// <param name="take"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
Task<IEnumerable<TimestampedValuesDto>> Get(Guid discriminatorId, DateTimeOffset? timestampBegin, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
Task<IEnumerable<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить данные, начиная с заданной отметки времени
|
/// Получить данные, начиная с заданной отметки времени
|
||||||
@ -78,19 +83,6 @@ public interface ITimestampedValuesClient : IDisposable
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T"></typeparam>
|
|
||||||
/// <param name="idDiscriminator"></param>
|
|
||||||
/// <param name="geTimestamp"></param>
|
|
||||||
/// <param name="columnNames"></param>
|
|
||||||
/// <param name="skip"></param>
|
|
||||||
/// <param name="take"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<T>> Get<T>(Guid idDiscriminator, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -5,42 +5,74 @@ using Refit;
|
|||||||
|
|
||||||
namespace DD.Persistence.Client.Clients.Interfaces.Refit;
|
namespace DD.Persistence.Client.Clients.Interfaces.Refit;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Refit интерфейс для IRefitChangeLogClient
|
||||||
|
/// </summary>
|
||||||
public interface IRefitChangeLogClient : IRefitClient, IDisposable
|
public interface IRefitChangeLogClient : IRefitClient, IDisposable
|
||||||
{
|
{
|
||||||
private const string BaseRoute = "/api/ChangeLog";
|
private const string BaseRoute = "/api/ChangeLog";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Импорт с заменой: удаление старых строк и добавление новых
|
||||||
|
/// </summary>
|
||||||
[Post($"{BaseRoute}/replace/{{idDiscriminator}}")]
|
[Post($"{BaseRoute}/replace/{{idDiscriminator}}")]
|
||||||
Task<IApiResponse<int>> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<IApiResponse<int>> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение актуальных данных на определенную дату (с пагинацией)
|
||||||
|
/// </summary>
|
||||||
[Get($"{BaseRoute}/moment/{{idDiscriminator}}")]
|
[Get($"{BaseRoute}/moment/{{idDiscriminator}}")]
|
||||||
Task<IApiResponse<PaginationContainer<DataWithWellDepthAndSectionDto>>> GetByDate(
|
Task<IApiResponse<PaginationContainer<ChangeLogValuesDto>>> GetByDate(
|
||||||
Guid idDiscriminator,
|
Guid idDiscriminator,
|
||||||
DateTimeOffset moment,
|
DateTimeOffset moment,
|
||||||
[Query] SectionPartRequest filterRequest,
|
|
||||||
[Query] PaginationRequest paginationRequest,
|
[Query] PaginationRequest paginationRequest,
|
||||||
CancellationToken token);
|
CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение исторических данных за определенный период времени
|
||||||
|
/// </summary>
|
||||||
[Get($"{BaseRoute}/history/{{idDiscriminator}}")]
|
[Get($"{BaseRoute}/history/{{idDiscriminator}}")]
|
||||||
Task<IApiResponse<IEnumerable<ChangeLogDto>>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);
|
Task<IApiResponse<IEnumerable<ChangeLogDto>>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить одну запись
|
||||||
|
/// </summary>
|
||||||
[Post($"{BaseRoute}/{{idDiscriminator}}")]
|
[Post($"{BaseRoute}/{{idDiscriminator}}")]
|
||||||
Task<IApiResponse<int>> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token);
|
Task<IApiResponse<int>> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить несколько записей
|
||||||
|
/// </summary>
|
||||||
[Post($"{BaseRoute}/range/{{idDiscriminator}}")]
|
[Post($"{BaseRoute}/range/{{idDiscriminator}}")]
|
||||||
Task<IApiResponse<int>> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<IApiResponse<int>> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновить одну запись
|
||||||
|
/// </summary>
|
||||||
[Put($"{BaseRoute}")]
|
[Put($"{BaseRoute}")]
|
||||||
Task<IApiResponse<int>> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token);
|
Task<IApiResponse<int>> Update(ChangeLogValuesDto dto, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновить несколько записей
|
||||||
|
/// </summary>
|
||||||
[Put($"{BaseRoute}/range")]
|
[Put($"{BaseRoute}/range")]
|
||||||
Task<IApiResponse<int>> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<IApiResponse<int>> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удалить одну запись
|
||||||
|
/// </summary>
|
||||||
[Delete($"{BaseRoute}")]
|
[Delete($"{BaseRoute}")]
|
||||||
Task<IApiResponse<int>> Delete(Guid id, CancellationToken token);
|
Task<IApiResponse<int>> Delete(Guid id, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удалить несколько записей
|
||||||
|
/// </summary>
|
||||||
[Delete($"{BaseRoute}/range")]
|
[Delete($"{BaseRoute}/range")]
|
||||||
Task<IApiResponse<int>> DeleteRange([Body] IEnumerable<Guid> ids, CancellationToken token);
|
Task<IApiResponse<int>> DeleteRange([Body] IEnumerable<Guid> ids, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени)
|
||||||
|
/// </summary>
|
||||||
[Get($"{BaseRoute}/datesRange/{{idDiscriminator}}")]
|
[Get($"{BaseRoute}/datesRange/{{idDiscriminator}}")]
|
||||||
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid idDiscriminator, CancellationToken token);
|
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid idDiscriminator, CancellationToken token);
|
||||||
|
|
||||||
|
@ -9,53 +9,58 @@ namespace DD.Persistence.Client.Clients.Interfaces.Refit;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IRefitTimestampedValuesClient : IRefitClient, IDisposable
|
public interface IRefitTimestampedValuesClient : IRefitClient, IDisposable
|
||||||
{
|
{
|
||||||
private const string baseUrl = "/api/TimestampedValues/{discriminatorId}";
|
private const string baseUrl = "/api/TimestampedValues";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Записать новые данные
|
/// Записать новые данные
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Post(baseUrl)]
|
[Post($"{baseUrl}/{{discriminatorId}}")]
|
||||||
Task<IApiResponse<int>> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token);
|
Task<IApiResponse<int>> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с фильтрацией
|
/// Получение данных с фильтрацией
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get(baseUrl)]
|
[Get($"{baseUrl}")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> Get(Guid discriminatorId, DateTimeOffset? timestampBegin, [Query(CollectionFormat.Multi)] IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> Get([Query(CollectionFormat.Multi)] IEnumerable<Guid> discriminatorIds,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
[Query(CollectionFormat.Multi)] IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить данные, начиная с заданной отметки времени
|
/// Получить данные, начиная с заданной отметки времени
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get($"{baseUrl}/gtdate")]
|
[Get($"{baseUrl}/{{discriminatorId}}/gtdate")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetGtDate(Guid discriminatorId, DateTimeOffset timestampBegin, CancellationToken token);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetGtDate(Guid discriminatorId, DateTimeOffset timestampBegin, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить данные c начала
|
/// Получить данные c начала
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get($"{baseUrl}/first")]
|
[Get($"{baseUrl}/{{discriminatorId}}/first")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetFirst(Guid discriminatorId, int take, CancellationToken token);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetFirst(Guid discriminatorId, int take, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить данные c конца
|
/// Получить данные c конца
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get($"{baseUrl}/last")]
|
[Get($"{baseUrl}/{{discriminatorId}}/last")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetLast(Guid discriminatorId, int take, CancellationToken token);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetLast(Guid discriminatorId, int take, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить список объектов с прореживанием, удовлетворяющий диапазону временных отметок
|
/// Получить список объектов с прореживанием, удовлетворяющий диапазону временных отметок
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get($"{baseUrl}/resampled")]
|
[Get($"{baseUrl}/{{discriminatorId}}/resampled")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetResampledData(Guid discriminatorId, DateTimeOffset timestampBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetResampledData(Guid discriminatorId, DateTimeOffset timestampBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить количество записей по указанному набору в БД. Для пагинации
|
/// Получить количество записей по указанному набору в БД. Для пагинации
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get($"{baseUrl}/count")]
|
[Get($"{baseUrl}/{{discriminatorId}}/count")]
|
||||||
Task<IApiResponse<int>> Count(Guid discriminatorId, CancellationToken token);
|
Task<IApiResponse<int>> Count(Guid discriminatorId, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить диапазон дат, в пределах которых хранятся даные
|
/// Получить диапазон дат, в пределах которых хранятся даные
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Get($"{baseUrl}/datesRange")]
|
[Get($"{baseUrl}/{{discriminatorId}}/datesRange")]
|
||||||
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,11 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<IEnumerable<TimestampedValuesDto>> Get(Guid discriminatorId, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
public async Task<IEnumerable<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitTimestampedSetClient.Get(discriminatorId, geTimestamp, columnNames, skip, take, token), token);
|
async () => await refitTimestampedSetClient.Get(discriminatorIds, geTimestamp, columnNames, skip, take, token), token);
|
||||||
return result;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -45,7 +45,7 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitTimestampedSetClient.GetGtDate(discriminatorId, timestampBegin, token), token);
|
async () => await refitTimestampedSetClient.GetGtDate(discriminatorId, timestampBegin, token), token);
|
||||||
|
|
||||||
return result;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -54,7 +54,7 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitTimestampedSetClient.GetFirst(discriminatorId, take, token), token);
|
async () => await refitTimestampedSetClient.GetFirst(discriminatorId, take, token), token);
|
||||||
|
|
||||||
return result;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -63,7 +63,7 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitTimestampedSetClient.GetLast(discriminatorId, take, token), token);
|
async () => await refitTimestampedSetClient.GetLast(discriminatorId, take, token), token);
|
||||||
|
|
||||||
return result;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -72,7 +72,7 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitTimestampedSetClient.GetResampledData(discriminatorId, dateBegin, intervalSec, approxPointsCount, token), token);
|
async () => await refitTimestampedSetClient.GetResampledData(discriminatorId, dateBegin, intervalSec, approxPointsCount, token), token);
|
||||||
|
|
||||||
return result;
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -93,15 +93,6 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async Task<IEnumerable<T>> Get<T>(Guid idDiscriminator, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
|
||||||
{
|
|
||||||
var data = await Get(idDiscriminator, geTimestamp, columnNames, skip, take, token);
|
|
||||||
var mapper = GetMapper<T>(idDiscriminator);
|
|
||||||
|
|
||||||
return data.Select(mapper.DeserializeTimeStampedData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<IEnumerable<T>> GetLast<T>(Guid idDiscriminator, int take, CancellationToken token)
|
public async Task<IEnumerable<T>> GetLast<T>(Guid idDiscriminator, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
using DD.Persistence.Database.EntityAbstractions;
|
using DD.Persistence.Database.EntityAbstractions;
|
||||||
using DD.Persistence.ModelsAbstractions;
|
using DD.Persistence.ModelsAbstractions;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
@ -11,7 +11,7 @@ namespace DD.Persistence.Database.Entity;
|
|||||||
/// Часть записи, описывающая изменение
|
/// Часть записи, описывающая изменение
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Table("change_log")]
|
[Table("change_log")]
|
||||||
public class ChangeLog : IChangeLog, IWithSectionPart
|
public class ChangeLog : IChangeLog
|
||||||
{
|
{
|
||||||
[Key, Comment("Ключ записи")]
|
[Key, Comment("Ключ записи")]
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
@ -34,15 +34,6 @@ public class ChangeLog : IChangeLog, IWithSectionPart
|
|||||||
[Comment("Id заменяющей записи")]
|
[Comment("Id заменяющей записи")]
|
||||||
public Guid? IdNext { get; set; }
|
public Guid? IdNext { get; set; }
|
||||||
|
|
||||||
[Comment("Глубина забоя на дату начала интервала")]
|
|
||||||
public double DepthStart { get; set; }
|
|
||||||
|
|
||||||
[Comment("Глубина забоя на дату окончания интервала")]
|
|
||||||
public double DepthEnd { get; set; }
|
|
||||||
|
|
||||||
[Comment("Ключ секции")]
|
|
||||||
public Guid IdSection { get; set; }
|
|
||||||
|
|
||||||
[Column(TypeName = "jsonb"), Comment("Значение")]
|
[Column(TypeName = "jsonb"), Comment("Значение")]
|
||||||
public required IDictionary<string, object> Value { get; set; }
|
public required IDictionary<string, object> Value { get; set; }
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
var insertedCount = 10;
|
var insertedCount = 10;
|
||||||
var createdResult = CreateChangeLogItems(insertedCount, (-15, 15));
|
var createdResult = CreateChangeLogItems(insertedCount, (-15, 15));
|
||||||
var idDiscriminator = createdResult.Item1;
|
var idDiscriminator = createdResult.Item1;
|
||||||
var dtos = createdResult.Item2.Select(e => e.Adapt<DataWithWellDepthAndSectionDto>());
|
var dtos = createdResult.Item2.Select(e => e.Adapt<ChangeLogValuesDto>());
|
||||||
|
|
||||||
// act
|
// act
|
||||||
var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken());
|
var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken());
|
||||||
@ -104,8 +104,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
var entity = dbContext.ChangeLog
|
var entity = dbContext.ChangeLog
|
||||||
.Where(x => x.IdDiscriminator == idDiscriminator)
|
.Where(x => x.IdDiscriminator == idDiscriminator)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
dto = entity.Adapt<DataWithWellDepthAndSectionDto>();
|
dto = entity.Adapt<ChangeLogValuesDto>();
|
||||||
dto.DepthEnd += 10;
|
|
||||||
|
|
||||||
// act
|
// act
|
||||||
result = await client.Update(dto, new CancellationToken());
|
result = await client.Update(dto, new CancellationToken());
|
||||||
@ -147,12 +146,9 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
dbContext.ChangeLog.AddRange(entities);
|
dbContext.ChangeLog.AddRange(entities);
|
||||||
dbContext.SaveChanges();
|
dbContext.SaveChanges();
|
||||||
|
|
||||||
dtos = entities.Select(c => new DataWithWellDepthAndSectionDto()
|
dtos = entities.Select(c => new ChangeLogValuesDto()
|
||||||
{
|
{
|
||||||
DepthEnd = c.DepthEnd + 10,
|
|
||||||
DepthStart = c.DepthStart + 10,
|
|
||||||
Id = c.Id,
|
Id = c.Id,
|
||||||
IdSection = c.IdSection,
|
|
||||||
Value = c.Value
|
Value = c.Value
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
@ -243,12 +239,6 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
|
|
||||||
var deletedCount = await client.DeleteRange(idsToDelete, new CancellationToken());
|
var deletedCount = await client.DeleteRange(idsToDelete, new CancellationToken());
|
||||||
|
|
||||||
var filterRequest = new SectionPartRequest()
|
|
||||||
{
|
|
||||||
DepthStart = 0,
|
|
||||||
DepthEnd = 1000,
|
|
||||||
};
|
|
||||||
|
|
||||||
var paginationRequest = new PaginationRequest()
|
var paginationRequest = new PaginationRequest()
|
||||||
{
|
{
|
||||||
Skip = 0,
|
Skip = 0,
|
||||||
@ -257,7 +247,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
};
|
};
|
||||||
|
|
||||||
var moment = DateTimeOffset.UtcNow.AddDays(16);
|
var moment = DateTimeOffset.UtcNow.AddDays(16);
|
||||||
var result = await client.GetByDate(idDiscriminator, moment, filterRequest, paginationRequest, new CancellationToken());
|
var result = await client.GetByDate(idDiscriminator, moment, paginationRequest, new CancellationToken());
|
||||||
|
|
||||||
Assert.NotNull(result);
|
Assert.NotNull(result);
|
||||||
|
|
||||||
@ -290,11 +280,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
var idDiscriminator = changeLogItems.Item1;
|
var idDiscriminator = changeLogItems.Item1;
|
||||||
var entities = changeLogItems.Item2;
|
var entities = changeLogItems.Item2;
|
||||||
|
|
||||||
foreach (var entity in entities)
|
var dtos = entities.Select(e => e.Adapt<ChangeLogValuesDto>()).ToArray();
|
||||||
{
|
|
||||||
entity.DepthEnd += 10;
|
|
||||||
}
|
|
||||||
var dtos = entities.Select(e => e.Adapt<DataWithWellDepthAndSectionDto>()).ToArray();
|
|
||||||
await client.UpdateRange(dtos, new CancellationToken());
|
await client.UpdateRange(dtos, new CancellationToken());
|
||||||
|
|
||||||
//act
|
//act
|
||||||
@ -308,19 +294,16 @@ public class ChangeLogControllerTest : BaseIntegrationTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static IEnumerable<DataWithWellDepthAndSectionDto> Generate(int count)
|
private static IEnumerable<ChangeLogValuesDto> Generate(int count)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
yield return new DataWithWellDepthAndSectionDto()
|
yield return new ChangeLogValuesDto()
|
||||||
{
|
{
|
||||||
Value = new Dictionary<string, object>()
|
Value = new Dictionary<string, object>()
|
||||||
{
|
{
|
||||||
{ "Key", 1 }
|
{ "Key", 1 }
|
||||||
},
|
},
|
||||||
DepthStart = generatorRandomDigits.Next(1, 5),
|
Id = Guid.NewGuid()
|
||||||
DepthEnd = generatorRandomDigits.Next(5, 15),
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
IdSection = Guid.NewGuid()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ using DD.Persistence.Client.Clients;
|
|||||||
using DD.Persistence.Client.Clients.Interfaces;
|
using DD.Persistence.Client.Clients.Interfaces;
|
||||||
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
||||||
using DD.Persistence.Database.Entity;
|
using DD.Persistence.Database.Entity;
|
||||||
|
using DD.Persistence.Extensions;
|
||||||
using DD.Persistence.Models;
|
using DD.Persistence.Models;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
@ -43,35 +44,42 @@ public class TimestampedValuesControllerTest : BaseIntegrationTest
|
|||||||
//arrange
|
//arrange
|
||||||
Cleanup();
|
Cleanup();
|
||||||
|
|
||||||
var discriminatorId = Guid.NewGuid();
|
var firstDiscriminatorId = Guid.NewGuid();
|
||||||
discriminatorIds.Append(discriminatorId);
|
discriminatorIds.Append(firstDiscriminatorId);
|
||||||
|
|
||||||
|
var secondDiscriminatorId = Guid.NewGuid();
|
||||||
|
discriminatorIds.Append(secondDiscriminatorId);
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await timestampedValuesClient.Get(discriminatorId, null, null, 0, 1, CancellationToken.None);
|
var response = await timestampedValuesClient.Get([firstDiscriminatorId, secondDiscriminatorId], null, null, 0, 1, CancellationToken.None);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Null(response);
|
Assert.Null(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
||||||
public async Task Get_AfterSave_returns_success()
|
public async Task Get_AfterSave_returns_success()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
Cleanup();
|
Cleanup();
|
||||||
|
|
||||||
var discriminatorId = Guid.NewGuid();
|
var firstDiscriminatorId = Guid.NewGuid();
|
||||||
discriminatorIds.Append(discriminatorId);
|
discriminatorIds.Append(firstDiscriminatorId);
|
||||||
|
|
||||||
|
var secondDiscriminatorId = Guid.NewGuid();
|
||||||
|
discriminatorIds.Append(secondDiscriminatorId);
|
||||||
|
|
||||||
var timestampBegin = DateTimeOffset.UtcNow.AddDays(-1);
|
var timestampBegin = DateTimeOffset.UtcNow.AddDays(-1);
|
||||||
var columnNames = new List<string>() { "A", "C" };
|
var columnNames = new List<string>() { "A", "C" };
|
||||||
var skip = 5;
|
var skip = 2;
|
||||||
var take = 5;
|
var take = 16;
|
||||||
|
|
||||||
var dtos = await AddRange(discriminatorId);
|
var dtos = (await AddRange(firstDiscriminatorId)).ToList();
|
||||||
|
dtos.AddRange(await AddRange(secondDiscriminatorId));
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await timestampedValuesClient.Get(discriminatorId, timestampBegin, columnNames, skip, take, CancellationToken.None);
|
var response = await timestampedValuesClient.Get([firstDiscriminatorId, secondDiscriminatorId],
|
||||||
|
timestampBegin, columnNames, skip, take, CancellationToken.None);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.NotNull(response);
|
Assert.NotNull(response);
|
||||||
@ -84,7 +92,7 @@ public class TimestampedValuesControllerTest : BaseIntegrationTest
|
|||||||
Assert.Equal(columnNames, actualColumnNames);
|
Assert.Equal(columnNames, actualColumnNames);
|
||||||
|
|
||||||
var expectedValueKind = JsonValueKind.Number;
|
var expectedValueKind = JsonValueKind.Number;
|
||||||
var actualValueKind = ((JsonElement) response.First().Values["A"]).ValueKind;
|
var actualValueKind = ((JsonElement)response.First().Values["A"]).ValueKind;
|
||||||
Assert.Equal(expectedValueKind, actualValueKind);
|
Assert.Equal(expectedValueKind, actualValueKind);
|
||||||
|
|
||||||
expectedValueKind = JsonValueKind.String;
|
expectedValueKind = JsonValueKind.String;
|
||||||
@ -92,6 +100,7 @@ public class TimestampedValuesControllerTest : BaseIntegrationTest
|
|||||||
Assert.Equal(expectedValueKind, actualValueKind);
|
Assert.Equal(expectedValueKind, actualValueKind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task GetGtDate_returns_success()
|
public async Task GetGtDate_returns_success()
|
||||||
{
|
{
|
||||||
|
@ -38,5 +38,5 @@ public class ChangeLogDto
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Объект записи
|
/// Объект записи
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DataWithWellDepthAndSectionDto Value { get; set; } = default!;
|
public ChangeLogValuesDto Value { get; set; } = default!;
|
||||||
}
|
}
|
||||||
|
17
DD.Persistence.Models/ChangeLogValuesDto.cs
Normal file
17
DD.Persistence.Models/ChangeLogValuesDto.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
namespace DD.Persistence.Models;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dto для хранения записей, содержащих начальную и конечную глубину забоя, а также секцию
|
||||||
|
/// </summary>
|
||||||
|
public class ChangeLogValuesDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Ключ записи
|
||||||
|
/// </summary>
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объект записи
|
||||||
|
/// </summary>
|
||||||
|
public required IDictionary<string, object> Value { get; set; }
|
||||||
|
}
|
@ -1,32 +0,0 @@
|
|||||||
namespace DD.Persistence.Models;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dto для хранения записей, содержащих начальную и конечную глубину забоя, а также секцию
|
|
||||||
/// </summary>
|
|
||||||
public class DataWithWellDepthAndSectionDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Ключ записи
|
|
||||||
/// </summary>
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Глубина забоя на дату начала интервала
|
|
||||||
/// </summary>
|
|
||||||
public double DepthStart { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Глубина забоя на дату окончания интервала
|
|
||||||
/// </summary>
|
|
||||||
public double DepthEnd { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Ключ секции
|
|
||||||
/// </summary>
|
|
||||||
public Guid IdSection { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Объект записи
|
|
||||||
/// </summary>
|
|
||||||
public required IDictionary<string, object> Value { get; set; }
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
namespace DD.Persistence.ModelsAbstractions;
|
|
||||||
public interface IWithSectionPart
|
|
||||||
{
|
|
||||||
public double DepthStart { get; set; }
|
|
||||||
|
|
||||||
public double DepthEnd { get; set; }
|
|
||||||
|
|
||||||
public Guid IdSection { get; set; }
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
namespace DD.Persistence.Models.Requests;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Запрос для фильтрации данных по секции и глубине
|
|
||||||
/// </summary>
|
|
||||||
public class SectionPartRequest
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Глубина забоя на дату начала интервала
|
|
||||||
/// </summary>
|
|
||||||
public double? DepthStart { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Глубина забоя на дату окончания интервала
|
|
||||||
/// </summary>
|
|
||||||
public double? DepthEnd { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Ключ секции
|
|
||||||
/// </summary>
|
|
||||||
public Guid? IdSection { get; set; }
|
|
||||||
}
|
|
@ -17,11 +17,8 @@ public static class DependencyInjection
|
|||||||
.Ignore(dest => dest.System, dest => dest.SystemId);
|
.Ignore(dest => dest.System, dest => dest.SystemId);
|
||||||
|
|
||||||
TypeAdapterConfig<ChangeLog, ChangeLogDto>.NewConfig()
|
TypeAdapterConfig<ChangeLog, ChangeLogDto>.NewConfig()
|
||||||
.Map(dest => dest.Value, src => new DataWithWellDepthAndSectionDto()
|
.Map(dest => dest.Value, src => new ChangeLogValuesDto()
|
||||||
{
|
{
|
||||||
DepthEnd = src.DepthEnd,
|
|
||||||
DepthStart = src.DepthStart,
|
|
||||||
IdSection = src.IdSection,
|
|
||||||
Value = src.Value,
|
Value = src.Value,
|
||||||
Id = src.Id
|
Id = src.Id
|
||||||
});
|
});
|
||||||
|
@ -12,25 +12,6 @@ namespace DD.Persistence.Repository;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class QueryBuilders
|
public static class QueryBuilders
|
||||||
{
|
{
|
||||||
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, SectionPartRequest request)
|
|
||||||
where TEntity : class, IWithSectionPart
|
|
||||||
{
|
|
||||||
if (request.IdSection.HasValue)
|
|
||||||
{
|
|
||||||
query = query.Where(e => e.IdSection == request.IdSection);
|
|
||||||
}
|
|
||||||
if (request.DepthStart.HasValue)
|
|
||||||
{
|
|
||||||
query = query.Where(e => e.DepthStart >= request.DepthStart);
|
|
||||||
}
|
|
||||||
if (request.DepthEnd.HasValue)
|
|
||||||
{
|
|
||||||
query = query.Where(e => e.DepthEnd <= request.DepthEnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, DateTimeOffset momentUtc)
|
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, DateTimeOffset momentUtc)
|
||||||
where TEntity : class, IChangeLog
|
where TEntity : class, IChangeLog
|
||||||
{
|
{
|
||||||
@ -49,17 +30,10 @@ public static class QueryBuilders
|
|||||||
PaginationRequest request,
|
PaginationRequest request,
|
||||||
Func<TEntity, TDto> Convert,
|
Func<TEntity, TDto> Convert,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
where TEntity : class, IWithSectionPart
|
where TEntity : class
|
||||||
where TDto : class
|
where TDto : class
|
||||||
{
|
{
|
||||||
if (String.IsNullOrEmpty(request.SortSettings))
|
if (!String.IsNullOrEmpty(request.SortSettings))
|
||||||
{
|
|
||||||
query = query
|
|
||||||
.OrderBy(e => e.IdSection)
|
|
||||||
.ThenBy(e => e.DepthStart)
|
|
||||||
.ThenBy(e => e.DepthEnd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
query = query.SortBy(request.SortSettings);
|
query = query.SortBy(request.SortSettings);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
this.db = db;
|
this.db = db;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token)
|
public async Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var entities = new List<ChangeLog>();
|
var entities = new List<ChangeLog>();
|
||||||
foreach (var dto in dtos)
|
foreach (var dto in dtos)
|
||||||
@ -76,7 +76,7 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
return await db.SaveChangesAsync(token);
|
return await db.SaveChangesAsync(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token)
|
public async Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = 0;
|
var result = 0;
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> UpdateRange(Guid idEditor, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token)
|
public async Task<int> UpdateRange(Guid idEditor, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var dbSet = db.Set<ChangeLog>();
|
var dbSet = db.Set<ChangeLog>();
|
||||||
|
|
||||||
@ -127,16 +127,14 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(
|
public async Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(
|
||||||
Guid idDiscriminator,
|
Guid idDiscriminator,
|
||||||
DateTimeOffset momentUtc,
|
DateTimeOffset momentUtc,
|
||||||
SectionPartRequest filterRequest,
|
|
||||||
PaginationRequest paginationRequest,
|
PaginationRequest paginationRequest,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = CreateQuery(idDiscriminator);
|
var query = CreateQuery(idDiscriminator);
|
||||||
query = query.Apply(momentUtc);
|
query = query.Apply(momentUtc);
|
||||||
query = query.Apply(filterRequest);
|
|
||||||
|
|
||||||
var result = await query.ApplyPagination(paginationRequest, Convert, token);
|
var result = await query.ApplyPagination(paginationRequest, Convert, token);
|
||||||
|
|
||||||
@ -196,7 +194,7 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
return datesOnly;
|
return datesOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, DataWithWellDepthAndSectionDto dto)
|
private static ChangeLog CreateEntityFromDto(Guid idAuthor, Guid idDiscriminator, ChangeLogValuesDto dto)
|
||||||
{
|
{
|
||||||
var entity = new ChangeLog()
|
var entity = new ChangeLog()
|
||||||
{
|
{
|
||||||
@ -206,16 +204,13 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
IdDiscriminator = idDiscriminator,
|
IdDiscriminator = idDiscriminator,
|
||||||
IdEditor = idAuthor,
|
IdEditor = idAuthor,
|
||||||
|
|
||||||
Value = dto.Value,
|
Value = dto.Value
|
||||||
IdSection = dto.IdSection,
|
|
||||||
DepthStart = dto.DepthStart,
|
|
||||||
DepthEnd = dto.DepthEnd,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<DataWithWellDepthAndSectionDto>> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token)
|
public async Task<IEnumerable<ChangeLogValuesDto>> GetGtDate(Guid idDiscriminator, DateTimeOffset dateBegin, CancellationToken token)
|
||||||
{
|
{
|
||||||
var date = dateBegin.ToUniversalTime();
|
var date = dateBegin.ToUniversalTime();
|
||||||
var query = this.db.Set<ChangeLog>()
|
var query = this.db.Set<ChangeLog>()
|
||||||
@ -256,5 +251,5 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private DataWithWellDepthAndSectionDto Convert(ChangeLog entity) => entity.Adapt<DataWithWellDepthAndSectionDto>();
|
private ChangeLogValuesDto Convert(ChangeLog entity) => entity.Adapt<ChangeLogValuesDto>();
|
||||||
}
|
}
|
||||||
|
@ -18,17 +18,12 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
|
|
||||||
public async virtual Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token)
|
public async virtual Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token)
|
||||||
{
|
{
|
||||||
var timestampedValuesEntities = new List<TimestampedValues>();
|
var timestampedValuesEntities = dtos.Select(dto => new TimestampedValues()
|
||||||
foreach (var dto in dtos)
|
|
||||||
{
|
|
||||||
var timestampedValuesEntity = new TimestampedValues()
|
|
||||||
{
|
{
|
||||||
DiscriminatorId = discriminatorId,
|
DiscriminatorId = discriminatorId,
|
||||||
Timestamp = dto.Timestamp.ToUniversalTime(),
|
Timestamp = dto.Timestamp.ToUniversalTime(),
|
||||||
Values = dto.Values.Values.ToArray()
|
Values = dto.Values.Values.ToArray()
|
||||||
};
|
});
|
||||||
timestampedValuesEntities.Add(timestampedValuesEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
await db.Set<TimestampedValues>().AddRangeAsync(timestampedValuesEntities, token);
|
await db.Set<TimestampedValues>().AddRangeAsync(timestampedValuesEntities, token);
|
||||||
|
|
||||||
@ -37,10 +32,15 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> Get(Guid discriminatorId, DateTimeOffset? timestampBegin, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
public async virtual Task<IDictionary<Guid, IEnumerable<(DateTimeOffset Timestamp, object[] Values)>>> Get(IEnumerable<Guid> discriminatorIds,
|
||||||
|
|||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = GetQueryReadOnly()
|
var query = GetQueryReadOnly()
|
||||||
.Where(entity => entity.DiscriminatorId == discriminatorId);
|
.Where(entity => discriminatorIds.Contains(entity.DiscriminatorId));
|
||||||
|
|
||||||
// Фильтрация по дате
|
// Фильтрация по дате
|
||||||
if (timestampBegin.HasValue)
|
if (timestampBegin.HasValue)
|
||||||
@ -48,28 +48,28 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
query = ApplyGeTimestamp(query, timestampBegin.Value);
|
query = ApplyGeTimestamp(query, timestampBegin.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
query = query
|
// Группировка отсортированных значений по DiscriminatorId
|
||||||
.OrderBy(item => item.Timestamp)
|
var groupQuery = query
|
||||||
.Skip(skip)
|
.GroupBy(e => e.DiscriminatorId)
|
||||||
.Take(take);
|
.Select(g => KeyValuePair.Create(g.Key, g.OrderBy(i => i.Timestamp).Skip(skip).Take(take)));
|
||||||
var entities = await query.ToArrayAsync(token);
|
var entities = await groupQuery.ToArrayAsync(token);
|
||||||
|
|
||||||
var result = entities.Select(e => Tuple.Create(
|
var result = entities.ToDictionary(k => k.Key, v => v.Value.Select(e => (
|
||||||
e.Timestamp,
|
e.Timestamp,
|
||||||
e.Values
|
e.Values
|
||||||
));
|
)));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token)
|
public async virtual Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = GetQueryReadOnly()
|
var query = GetQueryReadOnly()
|
||||||
.OrderBy(e => e.Timestamp)
|
.OrderBy(e => e.Timestamp)
|
||||||
.Take(takeCount);
|
.Take(takeCount);
|
||||||
var entities = await query.ToArrayAsync(token);
|
var entities = await query.ToArrayAsync(token);
|
||||||
|
|
||||||
var result = entities.Select(e => Tuple.Create(
|
var result = entities.Select(e => (
|
||||||
e.Timestamp,
|
e.Timestamp,
|
||||||
e.Values
|
e.Values
|
||||||
));
|
));
|
||||||
@ -77,14 +77,14 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetLast(Guid discriminatorId, int takeCount, CancellationToken token)
|
public async virtual Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetLast(Guid discriminatorId, int takeCount, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = GetQueryReadOnly()
|
var query = GetQueryReadOnly()
|
||||||
.OrderByDescending(e => e.Timestamp)
|
.OrderByDescending(e => e.Timestamp)
|
||||||
.Take(takeCount);
|
.Take(takeCount);
|
||||||
var entities = await query.ToArrayAsync(token);
|
var entities = await query.ToArrayAsync(token);
|
||||||
|
|
||||||
var result = entities.Select(e => Tuple.Create(
|
var result = entities.Select(e => (
|
||||||
e.Timestamp,
|
e.Timestamp,
|
||||||
e.Values
|
e.Values
|
||||||
));
|
));
|
||||||
@ -93,7 +93,7 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: прореживание должно осуществляться до материализации
|
// ToDo: прореживание должно осуществляться до материализации
|
||||||
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetResampledData(
|
public async virtual Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetResampledData(
|
||||||
Guid discriminatorId,
|
Guid discriminatorId,
|
||||||
DateTimeOffset dateBegin,
|
DateTimeOffset dateBegin,
|
||||||
double intervalSec = 600d,
|
double intervalSec = 600d,
|
||||||
@ -114,13 +114,13 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetGtDate(Guid discriminatorId, DateTimeOffset timestampBegin, CancellationToken token)
|
public async virtual Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetGtDate(Guid discriminatorId, DateTimeOffset timestampBegin, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = GetQueryReadOnly()
|
var query = GetQueryReadOnly()
|
||||||
.Where(e => e.Timestamp > timestampBegin);
|
.Where(e => e.Timestamp > timestampBegin);
|
||||||
var entities = await query.ToArrayAsync(token);
|
var entities = await query.ToArrayAsync(token);
|
||||||
|
|
||||||
var result = entities.Select(e => Tuple.Create(
|
var result = entities.Select(e => (
|
||||||
e.Timestamp,
|
e.Timestamp,
|
||||||
e.Values
|
e.Values
|
||||||
));
|
));
|
||||||
|
@ -18,11 +18,14 @@ public class TimestampedValuesServiceShould
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async Task TestServiceEfficiency()
|
public async Task TestServiceEfficiency()
|
||||||
{
|
{
|
||||||
var discriminatorId = Guid.NewGuid();
|
var discriminatorIds = new[] { Guid.NewGuid(), Guid.NewGuid() };
|
||||||
const int count = 10;
|
const int count = 10;
|
||||||
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
var dtos = Generate(count, DateTimeOffset.UtcNow);
|
||||||
var addRangeResult = await timestampedValuesService
|
var addRangeResult = await timestampedValuesService
|
||||||
.AddRange(discriminatorId, dtos, CancellationToken.None);
|
.AddRange(discriminatorIds.First(), dtos, CancellationToken.None);
|
||||||
|
Assert.Equal(0, addRangeResult);
|
||||||
|
addRangeResult = await timestampedValuesService
|
||||||
|
.AddRange(discriminatorIds.Last(), dtos, CancellationToken.None);
|
||||||
Assert.Equal(0, addRangeResult);
|
Assert.Equal(0, addRangeResult);
|
||||||
|
|
||||||
var columnNames = new[] { "A", "B", "C", "D" };
|
var columnNames = new[] { "A", "B", "C", "D" };
|
||||||
@ -30,7 +33,7 @@ public class TimestampedValuesServiceShould
|
|||||||
.AddHours(-1)
|
.AddHours(-1)
|
||||||
.ToUniversalTime();
|
.ToUniversalTime();
|
||||||
var getResult = await timestampedValuesService
|
var getResult = await timestampedValuesService
|
||||||
.Get(discriminatorId, geTimestamp, columnNames, 0, count, CancellationToken.None);
|
.Get(discriminatorIds, geTimestamp, columnNames, 0, count, CancellationToken.None);
|
||||||
Assert.NotNull(getResult);
|
Assert.NotNull(getResult);
|
||||||
Assert.Empty(getResult);
|
Assert.Empty(getResult);
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DD.Persistence.Test", "DD.Persistence.Test\DD.Persistence.Test.csproj", "{B8C774E6-6B75-41AC-B3CF-10BD3623B2FA}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DD.Persistence.Test", "DD.Persistence.Test\DD.Persistence.Test.csproj", "{B8C774E6-6B75-41AC-B3CF-10BD3623B2FA}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Элементы решения", "Элементы решения", "{E0CEF8FC-C131-4CF3-9F0A-E7B4F895B811}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
.gitea\workflows\integrationTests.yaml = .gitea\workflows\integrationTests.yaml
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
@ -7,7 +7,7 @@ namespace DD.Persistence.API;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Интерфейс для работы с API журнала изменений
|
/// Интерфейс для работы с API журнала изменений
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndSectionDto>
|
public interface IChangeLogApi : ISyncWithDiscriminatorApi<ChangeLogValuesDto>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Импорт с заменой: удаление старых строк и добавление новых
|
/// Импорт с заменой: удаление старых строк и добавление новых
|
||||||
@ -16,28 +16,26 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<IActionResult> ClearAndAddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных на текущую дату (с пагинацией)
|
/// Получение данных на текущую дату (с пагинацией)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idDiscriminator"></param>
|
/// <param name="idDiscriminator"></param>
|
||||||
/// <param name="filterRequest">параметры запроса фильтрации</param>
|
|
||||||
/// <param name="paginationRequest">параметры запроса пагинации</param>
|
/// <param name="paginationRequest">параметры запроса пагинации</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> GetCurrent(Guid idDiscriminator, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token);
|
Task<IActionResult> GetCurrent(Guid idDiscriminator, PaginationRequest paginationRequest, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных на определенную дату (с пагинацией)
|
/// Получение данных на определенную дату (с пагинацией)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idDiscriminator"></param>
|
/// <param name="idDiscriminator"></param>
|
||||||
/// <param name="moment"></param>
|
/// <param name="moment"></param>
|
||||||
/// <param name="filterRequest">параметры запроса фильтрации</param>
|
|
||||||
/// <param name="paginationRequest">параметры запроса пагинации</param>
|
/// <param name="paginationRequest">параметры запроса пагинации</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token);
|
Task<IActionResult> GetByDate(Guid idDiscriminator, DateTimeOffset moment, PaginationRequest paginationRequest, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение исторических данных за определенный период времени
|
/// Получение исторических данных за определенный период времени
|
||||||
@ -56,7 +54,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
|
|||||||
/// <param name="dto"></param>
|
/// <param name="dto"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token);
|
Task<IActionResult> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Добавить несколько записей
|
/// Добавить несколько записей
|
||||||
@ -65,7 +63,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<IActionResult> AddRange(Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновить одну запись
|
/// Обновить одну запись
|
||||||
@ -73,7 +71,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
|
|||||||
/// <param name="dto"></param>
|
/// <param name="dto"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token);
|
Task<IActionResult> Update(ChangeLogValuesDto dto, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновить несколько записей
|
/// Обновить несколько записей
|
||||||
@ -81,7 +79,7 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<DataWithWellDepthAndS
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<IActionResult> UpdateRange(IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить одну запись
|
/// Удалить одну запись
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
namespace DD.Persistence.Extensions;
|
namespace DD.Persistence.Extensions;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public static class IEnumerableExtensions
|
public static class IEnumerableExtensions
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
|
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
|
||||||
{
|
{
|
||||||
if (source == null)
|
if (source == null)
|
||||||
@ -15,6 +17,7 @@ public static class IEnumerableExtensions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public static bool IsNullOrEmpty<T>(this IEnumerable<T>? enumerable)
|
public static bool IsNullOrEmpty<T>(this IEnumerable<T>? enumerable)
|
||||||
{
|
{
|
||||||
if (enumerable == null)
|
if (enumerable == null)
|
||||||
|
@ -8,7 +8,7 @@ namespace DD.Persistence.Repositories;
|
|||||||
/// Интерфейс для работы с историческими данными
|
/// Интерфейс для работы с историческими данными
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDto"></typeparam>
|
/// <typeparam name="TDto"></typeparam>
|
||||||
public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWithWellDepthAndSectionDto>
|
public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<ChangeLogValuesDto>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Добавление записей
|
/// Добавление записей
|
||||||
@ -18,7 +18,7 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWit
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<int> AddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Пометить записи как удаленные
|
/// Пометить записи как удаленные
|
||||||
@ -46,7 +46,7 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWit
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<int> ClearAndAddRange(Guid idAuthor, Guid idDiscriminator, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Редактирование записей
|
/// Редактирование записей
|
||||||
@ -55,18 +55,17 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<DataWit
|
|||||||
/// <param name="dtos"></param>
|
/// <param name="dtos"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> UpdateRange(Guid idEditor, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
|
Task<int> UpdateRange(Guid idEditor, IEnumerable<ChangeLogValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение актуальных записей на определенный момент времени (с пагинацией)
|
/// Получение актуальных записей на определенный момент времени (с пагинацией)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idDiscriminator"></param>
|
/// <param name="idDiscriminator"></param>
|
||||||
/// <param name="moment">текущий момент времени</param>
|
/// <param name="moment">текущий момент времени</param>
|
||||||
/// <param name="filterRequest">параметры запроса фильтрации</param>
|
|
||||||
/// <param name="paginationRequest">параметры запроса пагинации</param>
|
/// <param name="paginationRequest">параметры запроса пагинации</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token);
|
Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, PaginationRequest paginationRequest, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение измененных записей за период времени
|
/// Получение измененных записей за период времени
|
||||||
|
@ -28,14 +28,19 @@ public interface ITimestampedValuesRepository : ISyncRepository, ITimeSeriesBase
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с фильтрацией. Значение фильтра null - отключен
|
/// Получение данных с фильтрацией. Значение фильтра null - отключен
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idDiscriminator">Дискриминатор (идентификатор) набора</param>
|
/// <param name="idDiscriminators">Набор дискриминаторов (идентификаторов)</param>
|
||||||
/// <param name="geTimestamp">Фильтр позднее даты</param>
|
/// <param name="geTimestamp">Фильтр позднее даты</param>
|
||||||
/// <param name="columnNames">Фильтр свойств набора. Можно запросить только некоторые свойства из набора</param>
|
/// <param name="columnNames">Фильтр свойств набора. Можно запросить только некоторые свойства из набора</param>
|
||||||
/// <param name="skip"></param>
|
/// <param name="skip"></param>
|
||||||
/// <param name="take"></param>
|
/// <param name="take"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> Get(Guid idDiscriminator, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
Task<IDictionary<Guid, IEnumerable<(DateTimeOffset Timestamp, object[] Values)>>> Get(IEnumerable<Guid> idDiscriminators,
|
||||||
|
DateTimeOffset? geTimestamp,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с начала
|
/// Получение данных с начала
|
||||||
@ -44,7 +49,7 @@ public interface ITimestampedValuesRepository : ISyncRepository, ITimeSeriesBase
|
|||||||
/// <param name="takeCount">Количество</param>
|
/// <param name="takeCount">Количество</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token);
|
Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с конца
|
/// Получение данных с конца
|
||||||
@ -53,5 +58,5 @@ public interface ITimestampedValuesRepository : ISyncRepository, ITimeSeriesBase
|
|||||||
/// <param name="takeCount">Количество</param>
|
/// <param name="takeCount">Количество</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetLast(Guid discriminatorId, int takeCount, CancellationToken token);
|
Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetLast(Guid discriminatorId, int takeCount, CancellationToken token);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ public interface ISyncRepository // ToDo: исчерпывающая абстр
|
|||||||
/// <param name="dateBegin">дата начала</param>
|
/// <param name="dateBegin">дата начала</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetGtDate(Guid discriminatorId, DateTimeOffset dateBegin, CancellationToken token);
|
Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetGtDate(Guid discriminatorId, DateTimeOffset dateBegin, CancellationToken token);
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -16,7 +16,7 @@ public interface ITimeSeriesBaseRepository // ToDo: исчерпывающая
|
|||||||
/// <param name="approxPointsCount"></param>
|
/// <param name="approxPointsCount"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetResampledData(
|
Task<IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> GetResampledData(
|
||||||
Guid discriminatorId,
|
Guid discriminatorId,
|
||||||
DateTimeOffset dateBegin,
|
DateTimeOffset dateBegin,
|
||||||
double intervalSec = 600d,
|
double intervalSec = 600d,
|
||||||
|
@ -18,24 +18,17 @@ public interface ITimestampedValuesService
|
|||||||
Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token);
|
Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Количество записей по указанному набору в БД. Для пагинации
|
/// Получение данных с фильтрацией для нескольких систем. Значение фильтра null - отключен
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
/// <param name="discriminatorIds">Набор дискриминаторов (идентификаторов)</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="geTimestamp"></param>
|
||||||
/// <returns></returns>
|
/// <param name="columnNames"></param>
|
||||||
Task<int> Count(Guid discriminatorId, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получение данных с фильтрацией. Значение фильтра null - отключен
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="discriminatorId">Дискриминатор (идентификатор) набора</param>
|
|
||||||
/// <param name="geTimestamp">Фильтр позднее даты</param>
|
|
||||||
/// <param name="columnNames">Фильтр свойств набора. Можно запросить только некоторые свойства из набора</param>
|
|
||||||
/// <param name="skip"></param>
|
/// <param name="skip"></param>
|
||||||
/// <param name="take"></param>
|
/// <param name="take"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<TimestampedValuesDto>> Get(Guid discriminatorId, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
Task<IEnumerable<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds, DateTimeOffset? geTimestamp,
|
||||||
|
IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с начала
|
/// Получение данных с начала
|
||||||
@ -74,12 +67,4 @@ public interface ITimestampedValuesService
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<TimestampedValuesDto>> GetResampledData(Guid discriminatorId, DateTimeOffset timestampBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default);
|
Task<IEnumerable<TimestampedValuesDto>> GetResampledData(Guid discriminatorId, DateTimeOffset timestampBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получить диапазон дат, для которых есть данные
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="discriminatorId"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
|
||||||
}
|
}
|
@ -35,15 +35,15 @@ public class TimestampedValuesService : ITimestampedValuesService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<IEnumerable<TimestampedValuesDto>> Get(Guid discriminatorId, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
public async Task<IEnumerable<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.Get(discriminatorId, geTimestamp, columnNames, skip, take, token);
|
var result = await timestampedValuesRepository.Get(discriminatorIds, geTimestamp, columnNames, skip, take, token);
|
||||||
|
|
||||||
var dtos = await Materialize(discriminatorId, result, token);
|
var dtos = await Materialize(result, token);
|
||||||
|
|
||||||
if (!columnNames.IsNullOrEmpty())
|
if (!columnNames.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
dtos = ReduceSetColumnsByNames(dtos, columnNames!);
|
dtos = ReduceSetColumnsByNames(dtos, columnNames!).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return dtos;
|
return dtos;
|
||||||
@ -54,7 +54,9 @@ public class TimestampedValuesService : ITimestampedValuesService
|
|||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetFirst(discriminatorId, takeCount, token);
|
var result = await timestampedValuesRepository.GetFirst(discriminatorId, takeCount, token);
|
||||||
|
|
||||||
var dtos = await Materialize(discriminatorId, result, token);
|
var resultToMaterialize = new[] { KeyValuePair.Create(discriminatorId, result) }
|
||||||
|
.ToDictionary();
|
||||||
|
var dtos = await Materialize(resultToMaterialize, token);
|
||||||
|
|
||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
@ -64,7 +66,9 @@ public class TimestampedValuesService : ITimestampedValuesService
|
|||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetLast(discriminatorId, takeCount, token);
|
var result = await timestampedValuesRepository.GetLast(discriminatorId, takeCount, token);
|
||||||
|
|
||||||
var dtos = await Materialize(discriminatorId, result, token);
|
var resultToMaterialize = new[] { KeyValuePair.Create(discriminatorId, result) }
|
||||||
|
.ToDictionary();
|
||||||
|
var dtos = await Materialize(resultToMaterialize, token);
|
||||||
|
|
||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
@ -79,7 +83,9 @@ public class TimestampedValuesService : ITimestampedValuesService
|
|||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetResampledData(discriminatorId, beginTimestamp, intervalSec, approxPointsCount, token);
|
var result = await timestampedValuesRepository.GetResampledData(discriminatorId, beginTimestamp, intervalSec, approxPointsCount, token);
|
||||||
|
|
||||||
var dtos = await Materialize(discriminatorId, result, token);
|
var resultToMaterialize = new[] { KeyValuePair.Create(discriminatorId, result) }
|
||||||
|
.ToDictionary();
|
||||||
|
var dtos = await Materialize(resultToMaterialize, token);
|
||||||
|
|
||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
@ -89,59 +95,48 @@ public class TimestampedValuesService : ITimestampedValuesService
|
|||||||
{
|
{
|
||||||
var result = await timestampedValuesRepository.GetGtDate(discriminatorId, beginTimestamp, token);
|
var result = await timestampedValuesRepository.GetGtDate(discriminatorId, beginTimestamp, token);
|
||||||
|
|
||||||
var dtos = await Materialize(discriminatorId, result, token);
|
var resultToMaterialize = new[] { KeyValuePair.Create(discriminatorId, result) }
|
||||||
|
.ToDictionary();
|
||||||
|
var dtos = await Materialize(resultToMaterialize, token);
|
||||||
on.nemtina
commented
Метод Count можно убрать, так как внутри него нет особой бизнес-логики. К репозиторию можно обращаться напрямую. Метод Count можно убрать, так как внутри него нет особой бизнес-логики. К репозиторию можно обращаться напрямую.
|
|||||||
|
|
||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async Task<int> Count(Guid discriminatorId, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await timestampedValuesRepository.Count(discriminatorId, token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async virtual Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await timestampedValuesRepository.GetDatesRange(discriminatorId, token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Преобразовать результат запроса в набор dto
|
/// Преобразовать результат запроса в набор dto
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dataSchemeId"></param>
|
|
||||||
/// <param name="queryResult"></param>
|
/// <param name="queryResult"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task<IEnumerable<TimestampedValuesDto>> Materialize(Guid dataSchemeId, IEnumerable<Tuple<DateTimeOffset, object[]>> queryResult, CancellationToken token)
|
private async Task<IEnumerable<TimestampedValuesDto>> Materialize(IDictionary<Guid, IEnumerable<(DateTimeOffset Timestamp, object[] Values)>> queryResult, CancellationToken token)
|
||||||
{
|
{
|
||||||
var dataScheme = await dataSchemeRepository.Get(dataSchemeId, token);
|
IEnumerable<TimestampedValuesDto> result = [];
|
||||||
|
foreach (var keyValuePair in queryResult)
|
||||||
|
{
|
||||||
|
var dataScheme = await dataSchemeRepository.Get(keyValuePair.Key, token);
|
||||||
if (dataScheme is null)
|
if (dataScheme is null)
|
||||||
{
|
{
|
||||||
return [];
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dtos = queryResult.Select(entity =>
|
foreach (var tuple in keyValuePair.Value)
|
||||||
{
|
{
|
||||||
var dto = new TimestampedValuesDto()
|
|
||||||
{
|
|
||||||
Timestamp = entity.Item1.ToUniversalTime()
|
|
||||||
};
|
|
||||||
|
|
||||||
var identity = dataScheme!.PropNames;
|
var identity = dataScheme!.PropNames;
|
||||||
var indexedIdentity = identity
|
var indexedIdentity = identity
|
||||||
.Select((value, index) => new { index, value });
|
.Select((value, index) => new { index, value });
|
||||||
dto.Values = indexedIdentity
|
|
||||||
.ToDictionary(x => x.value, x => entity.Item2[x.index]);
|
|
||||||
|
|
||||||
return dto;
|
var dto = new TimestampedValuesDto()
|
||||||
});
|
{
|
||||||
|
Timestamp = tuple.Timestamp.ToUniversalTime(),
|
||||||
|
Values = indexedIdentity
|
||||||
|
.ToDictionary(x => x.value, x => tuple.Values[x.index])
|
||||||
|
};
|
||||||
|
|
||||||
return dtos;
|
result = result.Append(dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user
В методе AddRange лучше усовершенствовать код:
var timestampedValuesEntities = dtos.Select(dto => new TimestampedValues()
{
DiscriminatorId = discriminatorId,
Timestamp = dto.Timestamp.ToUniversalTime(),
Values = dto.Values.Values.ToArray()
});