#925 Доработать ITimestampedValuesClient и IChangeLogClient под асибр #20
@ -12,14 +12,14 @@ 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;
|
||||||
|
|
||||||
public TimestampedValuesController(ITimestampedValuesService repository)
|
public TimestampedValuesController(ITimestampedValuesService service)
|
||||||
{
|
{
|
||||||
this.timestampedValuesRepository = repository;
|
this.timestampedValuesService = service;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -29,11 +29,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);
|
||||||
}
|
}
|
||||||
@ -47,12 +47,31 @@ public class TimestampedValuesController : ControllerBase
|
|||||||
/// <param name="skip"></param>
|
/// <param name="skip"></param>
|
||||||
/// <param name="take"></param>
|
/// <param name="take"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
[HttpGet]
|
[HttpGet("{discriminatorId}")]
|
||||||
[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([FromRoute] Guid discriminatorId, 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(discriminatorId, timestampBegin, columnNames, skip, take, token);
|
||||||
|
|
||||||
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение данных с фильтрацией для нескольких систем. Значение фильтра null - отключен
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorIds">Набор дискриминаторов (идентификаторов)</param>
|
||||||
|
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
||||||
|
/// <param name="columnNames">Фильтр свойств набора</param>
|
||||||
|
/// <param name="skip"></param>
|
||||||
|
/// <param name="take"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
[HttpGet]
|
||||||
|
[ProducesResponseType(typeof(IEnumerable<TimestampedValuesDto>), (int)HttpStatusCode.OK)]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.NoContent)]
|
||||||
|
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 timestampedValuesService.Get(discriminatorIds, timestampBegin, columnNames, skip, take, token);
|
||||||
|
|
||||||
return result.Any() ? Ok(result) : NoContent();
|
return result.Any() ? Ok(result) : NoContent();
|
||||||
}
|
}
|
||||||
@ -63,12 +82,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 +98,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 +114,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 +132,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,10 +147,10 @@ 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 timestampedValuesService.Count(discriminatorId, token);
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
@ -141,10 +160,10 @@ 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 timestampedValuesService.GetDatesRange(discriminatorId, token);
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,28 @@ public interface ITimestampedValuesClient : IDisposable
|
|||||||
/// <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(Guid discriminatorId,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить данные с фильтрацией для нескольких систем. Значение фильтра null - отключен
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorIds">Набор дискриминаторов (идентификаторов)</param>
|
||||||
|
/// <param name="timestampBegin">Фильтр позднее даты</param>
|
||||||
|
/// <param name="columnNames">Фильтр свойств набора</param>
|
||||||
|
/// <param name="skip"></param>
|
||||||
|
/// <param name="take"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
Task<IEnumerable<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить данные, начиная с заданной отметки времени
|
/// Получить данные, начиная с заданной отметки времени
|
||||||
|
@ -9,53 +9,69 @@ 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>
|
||||||
|
[Get($"{baseUrl}/{{discriminatorId}}")]
|
||||||
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> Get(Guid discriminatorId,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
[Query(CollectionFormat.Multi)] IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,15 @@ public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
|||||||
{
|
{
|
||||||
var result = await ExecuteGetResponse(
|
var result = await ExecuteGetResponse(
|
||||||
async () => await refitTimestampedSetClient.Get(discriminatorId, geTimestamp, columnNames, skip, take, token), token);
|
async () => await refitTimestampedSetClient.Get(discriminatorId, geTimestamp, columnNames, skip, take, token), token);
|
||||||
return result;
|
return result!;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task<IEnumerable<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
||||||
|
{
|
||||||
|
var result = await ExecuteGetResponse(
|
||||||
|
async () => await refitTimestampedSetClient.Get(discriminatorIds, geTimestamp, columnNames, skip, take, token), token);
|
||||||
|
return result!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -45,7 +53,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 +62,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 +71,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 +80,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/>
|
||||||
|
@ -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;
|
||||||
@ -92,6 +93,69 @@ public class TimestampedValuesControllerTest : BaseIntegrationTest
|
|||||||
Assert.Equal(expectedValueKind, actualValueKind);
|
Assert.Equal(expectedValueKind, actualValueKind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetWithManyDiscriminators_returns_success()
|
||||||
|
{
|
||||||
|
//arrange
|
||||||
|
Cleanup();
|
||||||
|
|
||||||
|
var firstDiscriminatorId = Guid.NewGuid();
|
||||||
|
discriminatorIds.Append(firstDiscriminatorId);
|
||||||
|
|
||||||
|
var secondDiscriminatorId = Guid.NewGuid();
|
||||||
|
discriminatorIds.Append(secondDiscriminatorId);
|
||||||
|
|
||||||
|
//act
|
||||||
|
var response = await timestampedValuesClient.Get([firstDiscriminatorId, secondDiscriminatorId], null, null, 0, 1, CancellationToken.None);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
Assert.Null(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetWithManyDiscriminators_AfterSave_returns_success()
|
||||||
|
{
|
||||||
|
//arrange
|
||||||
|
Cleanup();
|
||||||
|
|
||||||
|
var firstDiscriminatorId = Guid.NewGuid();
|
||||||
|
discriminatorIds.Append(firstDiscriminatorId);
|
||||||
|
|
||||||
|
var secondDiscriminatorId = Guid.NewGuid();
|
||||||
|
discriminatorIds.Append(secondDiscriminatorId);
|
||||||
|
|
||||||
|
var timestampBegin = DateTimeOffset.UtcNow.AddDays(-1);
|
||||||
|
var columnNames = new List<string>() { "A", "C" };
|
||||||
|
var skip = 2;
|
||||||
|
var take = 16;
|
||||||
|
|
||||||
|
var dtos = (await AddRange(firstDiscriminatorId)).ToList();
|
||||||
|
dtos.AddRange(await AddRange(secondDiscriminatorId));
|
||||||
|
|
||||||
|
//act
|
||||||
|
var response = await timestampedValuesClient.Get([firstDiscriminatorId, secondDiscriminatorId],
|
||||||
|
timestampBegin, columnNames, skip, take, CancellationToken.None);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
Assert.NotNull(response);
|
||||||
|
Assert.NotEmpty(response);
|
||||||
|
|
||||||
|
var actualCount = response.Count();
|
||||||
|
Assert.Equal(take, actualCount);
|
||||||
|
|
||||||
|
var actualColumnNames = response.SelectMany(e => e.Values.Keys).Distinct().ToList();
|
||||||
|
Assert.Equal(columnNames, actualColumnNames);
|
||||||
|
|
||||||
|
var expectedValueKind = JsonValueKind.Number;
|
||||||
|
var actualValueKind = ((JsonElement)response.First().Values["A"]).ValueKind;
|
||||||
|
Assert.Equal(expectedValueKind, actualValueKind);
|
||||||
|
|
||||||
|
expectedValueKind = JsonValueKind.String;
|
||||||
|
actualValueKind = ((JsonElement)response.First().Values["C"]).ValueKind;
|
||||||
|
Assert.Equal(expectedValueKind, actualValueKind);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task GetGtDate_returns_success()
|
public async Task GetGtDate_returns_success()
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,7 @@ using DD.Persistence.Models;
|
|||||||
using DD.Persistence.Models.Common;
|
using DD.Persistence.Models.Common;
|
||||||
using DD.Persistence.Repositories;
|
using DD.Persistence.Repositories;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace DD.Persistence.Repository.Repositories;
|
namespace DD.Persistence.Repository.Repositories;
|
||||||
public class TimestampedValuesRepository : ITimestampedValuesRepository
|
public class TimestampedValuesRepository : ITimestampedValuesRepository
|
||||||
@ -37,7 +38,12 @@ 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<IEnumerable<Tuple<DateTimeOffset, object[]>>> Get(Guid discriminatorId,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = GetQueryReadOnly()
|
var query = GetQueryReadOnly()
|
||||||
.Where(entity => entity.DiscriminatorId == discriminatorId);
|
.Where(entity => entity.DiscriminatorId == discriminatorId);
|
||||||
@ -62,6 +68,36 @@ public class TimestampedValuesRepository : ITimestampedValuesRepository
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> Get(IEnumerable<Guid> discriminatorIds,
|
||||||
|
DateTimeOffset? timestampBegin,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token)
|
||||||
|
{
|
||||||
|
var query = GetQueryReadOnly()
|
||||||
|
.Where(entity => discriminatorIds.Contains(entity.DiscriminatorId));
|
||||||
|
|
||||||
|
// Фильтрация по дате
|
||||||
|
if (timestampBegin.HasValue)
|
||||||
|
{
|
||||||
|
query = ApplyGeTimestamp(query, timestampBegin.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
query = query
|
||||||
|
.OrderBy(item => item.Timestamp)
|
||||||
|
.Skip(skip)
|
||||||
|
.Take(take);
|
||||||
|
var entities = await query.ToArrayAsync(token);
|
||||||
|
|
||||||
|
var result = entities.Select(e => Tuple.Create(
|
||||||
|
e.Timestamp,
|
||||||
|
e.Values
|
||||||
|
));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token)
|
public async virtual Task<IEnumerable<Tuple<DateTimeOffset, object[]>>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = GetQueryReadOnly()
|
var query = GetQueryReadOnly()
|
||||||
|
@ -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)
|
||||||
|
@ -35,7 +35,12 @@ public interface ITimestampedValuesRepository : ISyncRepository, ITimeSeriesBase
|
|||||||
/// <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<IEnumerable<Tuple<DateTimeOffset, object[]>>> Get(Guid idDiscriminator,
|
||||||
|
DateTimeOffset? geTimestamp,
|
||||||
|
IEnumerable<string>? columnNames,
|
||||||
|
int skip,
|
||||||
|
int take,
|
||||||
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с начала
|
/// Получение данных с начала
|
||||||
|
@ -35,7 +35,21 @@ public interface ITimestampedValuesService
|
|||||||
/// <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(Guid discriminatorId, DateTimeOffset? geTimestamp,
|
||||||
|
IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение данных с фильтрацией для нескольких систем. Значение фильтра null - отключен
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorIds">Набор дискриминаторов (идентификаторов)</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<TimestampedValuesDto>> Get(IEnumerable<Guid> discriminatorIds, DateTimeOffset? geTimestamp,
|
||||||
|
IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение данных с начала
|
/// Получение данных с начала
|
||||||
|
@ -49,6 +49,25 @@ public class TimestampedValuesService : ITimestampedValuesService
|
|||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
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(discriminatorIds, geTimestamp, columnNames, skip, take, token);
|
||||||
|
|
||||||
|
List<TimestampedValuesDto> dtos = [];
|
||||||
|
discriminatorIds.ForEach(async discriminatorId => {
|
||||||
|
var materializeDtos = await Materialize(discriminatorId, result, token);
|
||||||
|
dtos.AddRange(materializeDtos);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!columnNames.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
dtos = ReduceSetColumnsByNames(dtos, columnNames!).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return dtos;
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<IEnumerable<TimestampedValuesDto>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token)
|
public async Task<IEnumerable<TimestampedValuesDto>> GetFirst(Guid discriminatorId, int takeCount, CancellationToken token)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user