This commit is contained in:
parent
ce0ad70369
commit
9736b41f1a
@ -13,11 +13,11 @@ namespace DD.Persistence.API.Controllers;
|
|||||||
[ApiController]
|
[ApiController]
|
||||||
//[Authorize]
|
//[Authorize]
|
||||||
[Route("api/[controller]/{discriminatorId}")]
|
[Route("api/[controller]/{discriminatorId}")]
|
||||||
public class TimestampedSetController : ControllerBase
|
public class TimestampedValuesController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly ITimestampedValuesRepository<TimestampedValuesDto> repository;
|
private readonly ITimestampedValuesRepository<TimestampedValuesDto> repository;
|
||||||
|
|
||||||
public TimestampedSetController(ITimestampedValuesRepository<TimestampedValuesDto> repository)
|
public TimestampedValuesController(ITimestampedValuesRepository<TimestampedValuesDto> repository)
|
||||||
{
|
{
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
}
|
}
|
@ -4,7 +4,7 @@
|
|||||||
"Port": 5432,
|
"Port": 5432,
|
||||||
"Database": "persistence",
|
"Database": "persistence",
|
||||||
"Username": "postgres",
|
"Username": "postgres",
|
||||||
"Password": "postgres"
|
"Password": "q"
|
||||||
},
|
},
|
||||||
"NeedUseKeyCloak": false,
|
"NeedUseKeyCloak": false,
|
||||||
"AuthUser": {
|
"AuthUser": {
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"DefaultConnection": "Host=localhost;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True"
|
"DefaultConnection": "Host=localhost;Database=persistence;Username=postgres;Password=q;Persist Security Info=True"
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"NeedUseKeyCloak": false,
|
"NeedUseKeyCloak": false,
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
using DD.Persistence.Models.Common;
|
|
||||||
using DD.Persistence.ModelsAbstractions;
|
|
||||||
|
|
||||||
namespace DD.Persistence.Client.Clients.Interfaces;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Клиент для работы с временными данными
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDto"></typeparam>
|
|
||||||
public interface ITimeSeriesClient<TDto> : IDisposable where TDto : class, ITimestampAbstractDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Добавление записей
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dtos"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<int> AddRange(IEnumerable<TDto> dtos, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получить список объектов, удовлетворяющий диапазону дат
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dateBegin"></param>
|
|
||||||
/// <param name="dateEnd"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<TDto>> Get(DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получить диапазон дат, для которых есть данные в репозитории
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<DatesRangeDto?> GetDatesRange(CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получить список объектов с прореживанием, удовлетворяющий диапазону дат
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dateBegin"></param>
|
|
||||||
/// <param name="intervalSec"></param>
|
|
||||||
/// <param name="approxPointsCount"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<TDto>> GetResampledData(DateTimeOffset dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default);
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
using DD.Persistence.Models;
|
|
||||||
using DD.Persistence.Models.Common;
|
|
||||||
|
|
||||||
namespace DD.Persistence.Client.Clients.Interfaces;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Клиент для работы с репозиторием для хранения разных наборов данных рядов.
|
|
||||||
/// idDiscriminator - идентифицирует конкретный набор данных, прим.: циклы измерения АСИБР, или отчет о DrillTest.
|
|
||||||
/// idDiscriminator формируют клиенты и только им известно что они обозначают.
|
|
||||||
/// Так как данные приходят редко, то их прореживания для построения графиков не предусмотрено.
|
|
||||||
/// </summary>
|
|
||||||
public interface ITimestampedSetClient : IDisposable
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Записать новые данные
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idDiscriminator"></param>
|
|
||||||
/// <param name="sets"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<int> AddRange(Guid idDiscriminator, IEnumerable<TimestampedValuesDto> sets, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Количество записей по указанному набору в БД. Для пагинации
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idDiscriminator"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<int> Count(Guid idDiscriminator, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получение данных с фильтрацией. Значение фильтра null - отключен
|
|
||||||
/// </summary>
|
|
||||||
/// <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<TimestampedValuesDto>> Get(Guid idDiscriminator, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Диапазон дат за которые есть данные
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idDiscriminator"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<DatesRangeDto?> GetDatesRange(Guid idDiscriminator, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idDiscriminator"></param>
|
|
||||||
/// <param name="columnNames"></param>
|
|
||||||
/// <param name="take"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<TimestampedValuesDto>> GetLast(Guid idDiscriminator, IEnumerable<string>? columnNames, int take, CancellationToken token);
|
|
||||||
}
|
|
@ -0,0 +1,70 @@
|
|||||||
|
using DD.Persistence.Models;
|
||||||
|
using DD.Persistence.Models.Common;
|
||||||
|
|
||||||
|
namespace DD.Persistence.Client.Clients.Interfaces;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Клиент для работы с репозиторием для хранения разных наборов данных рядов.
|
||||||
|
/// discriminatorId - идентифицирует конкретный набор данных, прим.: циклы измерения АСИБР, или отчет о DrillTest.
|
||||||
|
/// discriminatorId формируют клиенты и только им известно что они обозначают.
|
||||||
|
/// </summary>
|
||||||
|
public interface ITimestampedValuesClient : IDisposable
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Записать новые данные
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorId"></param>
|
||||||
|
/// <param name="sets"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> sets, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество записей по указанному набору в БД. Для пагинации
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorId"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
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="take"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<IEnumerable<TimestampedValuesDto>> Get(Guid discriminatorId, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Диапазон дат за которые есть данные
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorId"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить последние данные
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorId"></param>
|
||||||
|
/// <param name="columnNames"></param>
|
||||||
|
/// <param name="take"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<IEnumerable<TimestampedValuesDto>> GetLast(Guid discriminatorId, IEnumerable<string>? columnNames, int take, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить список объектов с прореживанием, удовлетворяющий диапазону дат
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="discriminatorId"></param>
|
||||||
|
/// <param name="dateBegin"></param>
|
||||||
|
/// <param name="intervalSec"></param>
|
||||||
|
/// <param name="approxPointsCount"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<IEnumerable<TimestampedValuesDto>> GetResampledData(Guid discriminatorId, DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default);
|
||||||
|
}
|
@ -1,22 +0,0 @@
|
|||||||
using DD.Persistence.Models.Common;
|
|
||||||
using DD.Persistence.ModelsAbstractions;
|
|
||||||
using Refit;
|
|
||||||
|
|
||||||
namespace DD.Persistence.Client.Clients.Interfaces.Refit;
|
|
||||||
public interface IRefitTimeSeriesClient<TDto> : IRefitClient, IDisposable
|
|
||||||
where TDto : class, ITimestampAbstractDto
|
|
||||||
{
|
|
||||||
private const string BaseRoute = "/api/dataSaub";
|
|
||||||
|
|
||||||
[Post($"{BaseRoute}")]
|
|
||||||
Task<IApiResponse<int>> AddRange(IEnumerable<TDto> dtos, CancellationToken token);
|
|
||||||
|
|
||||||
[Get($"{BaseRoute}")]
|
|
||||||
Task<IApiResponse<IEnumerable<TDto>>> Get(DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);
|
|
||||||
|
|
||||||
[Get($"{BaseRoute}/resampled")]
|
|
||||||
Task<IApiResponse<IEnumerable<TDto>>> GetResampledData(DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default);
|
|
||||||
|
|
||||||
[Get($"{BaseRoute}/datesRange")]
|
|
||||||
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(CancellationToken token);
|
|
||||||
}
|
|
@ -6,13 +6,13 @@ namespace DD.Persistence.Client.Clients.Interfaces.Refit;
|
|||||||
|
|
||||||
public interface IRefitTimestampedValuesClient : IRefitClient, IDisposable
|
public interface IRefitTimestampedValuesClient : IRefitClient, IDisposable
|
||||||
{
|
{
|
||||||
private const string baseUrl = "/api/TimestampedSet/{idDiscriminator}";
|
private const string baseUrl = "/api/TimestampedValues/{discriminatorId}";
|
||||||
|
|
||||||
[Post(baseUrl)]
|
[Post(baseUrl)]
|
||||||
Task<IApiResponse<int>> AddRange(Guid idDiscriminator, IEnumerable<TimestampedValuesDto> sets, CancellationToken token);
|
Task<IApiResponse<int>> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> sets, CancellationToken token);
|
||||||
|
|
||||||
[Get(baseUrl)]
|
[Get(baseUrl)]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> Get(Guid idDiscriminator, [Query] DateTimeOffset? geTimestamp, [Query] IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> Get(Guid discriminatorId, [Query] DateTimeOffset? geTimestamp, [Query] IEnumerable<string>? columnNames, int skip, int take, CancellationToken token);
|
||||||
|
|
||||||
[Get($"{baseUrl}/last")]
|
[Get($"{baseUrl}/last")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetLast(Guid discriminatorId, [Query] IEnumerable<string>? columnNames, int take, CancellationToken token);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetLast(Guid discriminatorId, [Query] IEnumerable<string>? columnNames, int take, CancellationToken token);
|
||||||
@ -24,5 +24,5 @@ public interface IRefitTimestampedValuesClient : IRefitClient, IDisposable
|
|||||||
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid discriminatorId, CancellationToken token);
|
||||||
|
|
||||||
[Get($"{baseUrl}/resampled")]
|
[Get($"{baseUrl}/resampled")]
|
||||||
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetResampledData(DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default);
|
Task<IApiResponse<IEnumerable<TimestampedValuesDto>>> GetResampledData(Guid discriminatorId, DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default);
|
||||||
}
|
}
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using DD.Persistence.Client.Clients.Base;
|
|
||||||
using DD.Persistence.Client.Clients.Interfaces;
|
|
||||||
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
|
||||||
using DD.Persistence.Models.Common;
|
|
||||||
using DD.Persistence.ModelsAbstractions;
|
|
||||||
|
|
||||||
namespace DD.Persistence.Client.Clients;
|
|
||||||
public class TimeSeriesClient<TDto> : BaseClient, ITimeSeriesClient<TDto> where TDto : class, ITimestampAbstractDto
|
|
||||||
{
|
|
||||||
private readonly IRefitTimeSeriesClient<TDto> timeSeriesClient;
|
|
||||||
|
|
||||||
public TimeSeriesClient(IRefitClientFactory<IRefitTimeSeriesClient<TDto>> refitTechMessagesClientFactory, ILogger<TimeSeriesClient<TDto>> logger) : base(logger)
|
|
||||||
{
|
|
||||||
this.timeSeriesClient = refitTechMessagesClientFactory.Create();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> AddRange(IEnumerable<TDto> dtos, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecutePostResponse(
|
|
||||||
async () => await timeSeriesClient.AddRange(dtos, token), token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<TDto>> Get(DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await timeSeriesClient.Get(dateBegin, dateEnd, token), token);
|
|
||||||
|
|
||||||
return result!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<TDto>> GetResampledData(DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await timeSeriesClient.GetResampledData(dateBegin, intervalSec, approxPointsCount, token), token);
|
|
||||||
|
|
||||||
return result!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<DatesRangeDto?> GetDatesRange(CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await timeSeriesClient.GetDatesRange(token), token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
timeSeriesClient.Dispose();
|
|
||||||
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,64 +0,0 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using DD.Persistence.Client.Clients.Base;
|
|
||||||
using DD.Persistence.Client.Clients.Interfaces;
|
|
||||||
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
|
||||||
using DD.Persistence.Models;
|
|
||||||
using DD.Persistence.Models.Common;
|
|
||||||
|
|
||||||
namespace DD.Persistence.Client.Clients;
|
|
||||||
public class TimestampedSetClient : BaseClient, ITimestampedSetClient
|
|
||||||
{
|
|
||||||
private readonly IRefitTimestampedValuesClient refitTimestampedSetClient;
|
|
||||||
|
|
||||||
public TimestampedSetClient(IRefitClientFactory<IRefitTimestampedValuesClient> refitTimestampedSetClientFactory, ILogger<TimestampedSetClient> logger) : base(logger)
|
|
||||||
{
|
|
||||||
this.refitTimestampedSetClient = refitTimestampedSetClientFactory.Create();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<TimestampedValuesDto> sets, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecutePostResponse(
|
|
||||||
async () => await refitTimestampedSetClient.AddRange(idDiscriminator, sets, token), token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<TimestampedValuesDto>> Get(Guid idDiscriminator, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await refitTimestampedSetClient.Get(idDiscriminator, geTimestamp, columnNames, skip, take, token), token);
|
|
||||||
|
|
||||||
return result!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<TimestampedValuesDto>> GetLast(Guid idDiscriminator, IEnumerable<string>? columnNames, int take, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await refitTimestampedSetClient.GetLast(idDiscriminator, columnNames, take, token), token);
|
|
||||||
|
|
||||||
return result!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> Count(Guid idDiscriminator, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await refitTimestampedSetClient.Count(idDiscriminator, token), token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<DatesRangeDto?> GetDatesRange(Guid idDiscriminator, CancellationToken token)
|
|
||||||
{
|
|
||||||
var result = await ExecuteGetResponse(
|
|
||||||
async () => await refitTimestampedSetClient.GetDatesRange(idDiscriminator, token), token);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
refitTimestampedSetClient.Dispose();
|
|
||||||
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
72
DD.Persistence.Client/Clients/TimestampedValuesClient.cs
Normal file
72
DD.Persistence.Client/Clients/TimestampedValuesClient.cs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using DD.Persistence.Client.Clients.Base;
|
||||||
|
using DD.Persistence.Client.Clients.Interfaces;
|
||||||
|
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
||||||
|
using DD.Persistence.Models;
|
||||||
|
using DD.Persistence.Models.Common;
|
||||||
|
|
||||||
|
namespace DD.Persistence.Client.Clients;
|
||||||
|
public class TimestampedValuesClient : BaseClient, ITimestampedValuesClient
|
||||||
|
{
|
||||||
|
private readonly IRefitTimestampedValuesClient refitTimestampedSetClient;
|
||||||
|
|
||||||
|
public TimestampedValuesClient(IRefitClientFactory<IRefitTimestampedValuesClient> refitTimestampedSetClientFactory, ILogger<TimestampedValuesClient> logger) : base(logger)
|
||||||
|
{
|
||||||
|
this.refitTimestampedSetClient = refitTimestampedSetClientFactory.Create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> sets, CancellationToken token)
|
||||||
|
{
|
||||||
|
var result = await ExecutePostResponse(
|
||||||
|
async () => await refitTimestampedSetClient.AddRange(discriminatorId, sets, token), token);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<TimestampedValuesDto>> Get(Guid discriminatorId, DateTimeOffset? geTimestamp, IEnumerable<string>? columnNames, int skip, int take, CancellationToken token)
|
||||||
|
{
|
||||||
|
var result = await ExecuteGetResponse(
|
||||||
|
async () => await refitTimestampedSetClient.Get(discriminatorId, geTimestamp, columnNames, skip, take, token), token);
|
||||||
|
|
||||||
|
return result!;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<TimestampedValuesDto>> GetLast(Guid discriminatorId, IEnumerable<string>? columnNames, int take, CancellationToken token)
|
||||||
|
{
|
||||||
|
var result = await ExecuteGetResponse(
|
||||||
|
async () => await refitTimestampedSetClient.GetLast(discriminatorId, columnNames, take, token), token);
|
||||||
|
|
||||||
|
return result!;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<int> Count(Guid discriminatorId, CancellationToken token)
|
||||||
|
{
|
||||||
|
var result = await ExecuteGetResponse(
|
||||||
|
async () => await refitTimestampedSetClient.Count(discriminatorId, token), token);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token)
|
||||||
|
{
|
||||||
|
var result = await ExecuteGetResponse(
|
||||||
|
async () => await refitTimestampedSetClient.GetDatesRange(discriminatorId, token), token);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<TimestampedValuesDto>> GetResampledData(Guid discriminatorId, DateTimeOffset dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
var result = await ExecuteGetResponse(
|
||||||
|
async () => await refitTimestampedSetClient.GetResampledData(discriminatorId, dateBegin, intervalSec, approxPointsCount, token), token);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
refitTimestampedSetClient.Dispose();
|
||||||
|
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
}
|
@ -22,7 +22,7 @@ public static class DependencyInjection
|
|||||||
services.AddTransient<IDataSourceSystemClient, DataSourceSystemClient>();
|
services.AddTransient<IDataSourceSystemClient, DataSourceSystemClient>();
|
||||||
services.AddTransient<ISetpointClient, SetpointClient>();
|
services.AddTransient<ISetpointClient, SetpointClient>();
|
||||||
services.AddTransient<ITechMessagesClient, TechMessagesClient>();
|
services.AddTransient<ITechMessagesClient, TechMessagesClient>();
|
||||||
services.AddTransient<ITimestampedSetClient, TimestampedSetClient>();
|
services.AddTransient<ITimestampedValuesClient, TimestampedValuesClient>();
|
||||||
services.AddTransient<IWitsDataClient, WitsDataClient>();
|
services.AddTransient<IWitsDataClient, WitsDataClient>();
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
//using DD.Persistence.Database.Model;
|
|
||||||
//using DD.Persistence.Models;
|
|
||||||
//using Xunit;
|
|
||||||
|
|
||||||
//namespace DD.Persistence.IntegrationTests.Controllers;
|
|
||||||
//public class DataSaubControllerTest : TimeSeriesBaseControllerTest<DataSaub, DataSaubDto>
|
|
||||||
//{
|
|
||||||
// private readonly DataSaubDto dto = new()
|
|
||||||
// {
|
|
||||||
// AxialLoad = 1,
|
|
||||||
// BitDepth = 2,
|
|
||||||
// BlockPosition = 3,
|
|
||||||
// BlockSpeed = 4,
|
|
||||||
// Date = DateTimeOffset.UtcNow,
|
|
||||||
// Flow = 5,
|
|
||||||
// HookWeight = 6,
|
|
||||||
// IdFeedRegulator = 8,
|
|
||||||
// Mode = 9,
|
|
||||||
// Mse = 10,
|
|
||||||
// MseState = 11,
|
|
||||||
// Pressure = 12,
|
|
||||||
// Pump0Flow = 13,
|
|
||||||
// Pump1Flow = 14,
|
|
||||||
// Pump2Flow = 15,
|
|
||||||
// RotorSpeed = 16,
|
|
||||||
// RotorTorque = 17,
|
|
||||||
// User = string.Empty,
|
|
||||||
// WellDepth = 18,
|
|
||||||
// };
|
|
||||||
|
|
||||||
// private readonly DataSaub entity = new()
|
|
||||||
// {
|
|
||||||
// AxialLoad = 1,
|
|
||||||
// BitDepth = 2,
|
|
||||||
// BlockPosition = 3,
|
|
||||||
// BlockSpeed = 4,
|
|
||||||
// Timestamp = DateTimeOffset.UtcNow,
|
|
||||||
// Flow = 5,
|
|
||||||
// HookWeight = 6,
|
|
||||||
// IdFeedRegulator = 8,
|
|
||||||
// Mode = 9,
|
|
||||||
// Mse = 10,
|
|
||||||
// MseState = 11,
|
|
||||||
// Pressure = 12,
|
|
||||||
// Pump0Flow = 13,
|
|
||||||
// Pump1Flow = 14,
|
|
||||||
// Pump2Flow = 15,
|
|
||||||
// RotorSpeed = 16,
|
|
||||||
// RotorTorque = 17,
|
|
||||||
// User = string.Empty,
|
|
||||||
// WellDepth = 18,
|
|
||||||
// };
|
|
||||||
|
|
||||||
// public DataSaubControllerTest(WebAppFactoryFixture factory) : base(factory)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// [Fact]
|
|
||||||
// public async Task InsertRange_returns_success()
|
|
||||||
// {
|
|
||||||
// await InsertRangeSuccess(dto);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// [Fact]
|
|
||||||
// public async Task Get_returns_success()
|
|
||||||
// {
|
|
||||||
// var beginDate = DateTimeOffset.UtcNow.AddDays(-1);
|
|
||||||
// var endDate = DateTimeOffset.UtcNow;
|
|
||||||
// await GetSuccess(beginDate, endDate, entity);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// [Fact]
|
|
||||||
// public async Task GetDatesRange_returns_success()
|
|
||||||
// {
|
|
||||||
// await GetDatesRangeSuccess(entity);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// [Fact]
|
|
||||||
// public async Task GetResampledData_returns_success()
|
|
||||||
// {
|
|
||||||
// await GetResampledDataSuccess(entity);
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,122 +0,0 @@
|
|||||||
using DD.Persistence.Client;
|
|
||||||
using DD.Persistence.Client.Clients;
|
|
||||||
using DD.Persistence.Client.Clients.Interfaces;
|
|
||||||
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
|
||||||
using DD.Persistence.Database.EntityAbstractions;
|
|
||||||
using DD.Persistence.ModelsAbstractions;
|
|
||||||
using Mapster;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace DD.Persistence.IntegrationTests.Controllers;
|
|
||||||
|
|
||||||
public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrationTest
|
|
||||||
where TEntity : class, ITimestampedItem, new()
|
|
||||||
where TDto : class, ITimestampAbstractDto, new()
|
|
||||||
{
|
|
||||||
private readonly ITimeSeriesClient<TDto> timeSeriesClient;
|
|
||||||
|
|
||||||
public TimeSeriesBaseControllerTest(WebAppFactoryFixture factory) : base(factory)
|
|
||||||
{
|
|
||||||
dbContext.CleanupDbSet<TEntity>();
|
|
||||||
|
|
||||||
var refitClientFactory = scope.ServiceProvider
|
|
||||||
.GetRequiredService<IRefitClientFactory<IRefitTimeSeriesClient<TDto>>>();
|
|
||||||
var logger = scope.ServiceProvider.GetRequiredService<ILogger<TimeSeriesClient<TDto>>>();
|
|
||||||
|
|
||||||
timeSeriesClient = scope.ServiceProvider
|
|
||||||
.GetRequiredService<ITimeSeriesClient<TDto>>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task InsertRangeSuccess(TDto dto)
|
|
||||||
{
|
|
||||||
//arrange
|
|
||||||
var expected = dto.Adapt<TDto>();
|
|
||||||
|
|
||||||
//act
|
|
||||||
var response = await timeSeriesClient.AddRange(new TDto[] { expected }, new CancellationToken());
|
|
||||||
|
|
||||||
//assert
|
|
||||||
Assert.Equal(1, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task GetSuccess(DateTimeOffset beginDate, DateTimeOffset endDate, TEntity entity)
|
|
||||||
{
|
|
||||||
//arrange
|
|
||||||
var dbset = dbContext.Set<TEntity>();
|
|
||||||
|
|
||||||
dbset.Add(entity);
|
|
||||||
|
|
||||||
dbContext.SaveChanges();
|
|
||||||
|
|
||||||
var response = await timeSeriesClient.Get(beginDate, endDate, new CancellationToken());
|
|
||||||
|
|
||||||
//assert
|
|
||||||
Assert.NotNull(response);
|
|
||||||
Assert.Single(response);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task GetDatesRangeSuccess(TEntity entity)
|
|
||||||
{
|
|
||||||
//arrange
|
|
||||||
var datesRangeExpected = 30;
|
|
||||||
|
|
||||||
var entity2 = entity.Adapt<TEntity>();
|
|
||||||
entity2.Timestamp = entity.Timestamp.AddDays(datesRangeExpected);
|
|
||||||
|
|
||||||
var dbset = dbContext.Set<TEntity>();
|
|
||||||
dbset.Add(entity);
|
|
||||||
dbset.Add(entity2);
|
|
||||||
|
|
||||||
dbContext.SaveChanges();
|
|
||||||
|
|
||||||
var response = await timeSeriesClient.GetDatesRange(new CancellationToken());
|
|
||||||
|
|
||||||
//assert
|
|
||||||
Assert.NotNull(response);
|
|
||||||
|
|
||||||
var datesRangeActual = (response.To - response.From).Days;
|
|
||||||
Assert.Equal(datesRangeExpected, datesRangeActual);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task GetResampledDataSuccess(TEntity entity)
|
|
||||||
{
|
|
||||||
//arrange
|
|
||||||
var approxPointsCount = 10;
|
|
||||||
var differenceBetweenStartAndEndDays = 50;
|
|
||||||
|
|
||||||
var entities = new List<TEntity>();
|
|
||||||
for (var i = 1; i <= differenceBetweenStartAndEndDays; i++)
|
|
||||||
{
|
|
||||||
var entity2 = entity.Adapt<TEntity>();
|
|
||||||
entity2.Timestamp = entity.Timestamp.AddDays(i - 1);
|
|
||||||
|
|
||||||
entities.Add(entity2);
|
|
||||||
}
|
|
||||||
|
|
||||||
var dbset = dbContext.Set<TEntity>();
|
|
||||||
dbset.AddRange(entities);
|
|
||||||
|
|
||||||
dbContext.SaveChanges();
|
|
||||||
|
|
||||||
var response = await timeSeriesClient.GetResampledData(entity.Timestamp.AddMinutes(-1), differenceBetweenStartAndEndDays * 24 * 60 * 60 + 60, approxPointsCount, new CancellationToken());
|
|
||||||
|
|
||||||
//assert
|
|
||||||
Assert.NotNull(response);
|
|
||||||
|
|
||||||
var ratio = entities.Count / approxPointsCount;
|
|
||||||
if (ratio > 1)
|
|
||||||
{
|
|
||||||
var expectedResampledCount = entities
|
|
||||||
.Where((_, index) => index % ratio == 0)
|
|
||||||
.Count();
|
|
||||||
|
|
||||||
Assert.Equal(expectedResampledCount, response.Count());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Assert.Equal(entities.Count(), response.Count());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,20 +6,25 @@ using Xunit;
|
|||||||
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
||||||
using DD.Persistence.Client.Clients;
|
using DD.Persistence.Client.Clients;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.Extensions.Primitives;
|
||||||
|
using System.Dynamic;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace DD.Persistence.IntegrationTests.Controllers;
|
namespace DD.Persistence.IntegrationTests.Controllers;
|
||||||
public class TimestampedSetControllerTest : BaseIntegrationTest
|
public class TimestampedSetControllerTest : BaseIntegrationTest
|
||||||
{
|
{
|
||||||
private readonly ITimestampedSetClient client;
|
private readonly ITimestampedValuesClient client;
|
||||||
|
|
||||||
public TimestampedSetControllerTest(WebAppFactoryFixture factory) : base(factory)
|
public TimestampedSetControllerTest(WebAppFactoryFixture factory) : base(factory)
|
||||||
{
|
{
|
||||||
var refitClientFactory = scope.ServiceProvider
|
var refitClientFactory = scope.ServiceProvider
|
||||||
.GetRequiredService<IRefitClientFactory<IRefitTimestampedValuesClient>>();
|
.GetRequiredService<IRefitClientFactory<IRefitTimestampedValuesClient>>();
|
||||||
var logger = scope.ServiceProvider.GetRequiredService<ILogger<TimestampedSetClient>>();
|
var logger = scope.ServiceProvider.GetRequiredService<ILogger<TimestampedValuesClient>>();
|
||||||
|
|
||||||
client = scope.ServiceProvider
|
client = scope.ServiceProvider
|
||||||
.GetRequiredService<ITimestampedSetClient>();
|
.GetRequiredService<ITimestampedValuesClient>();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -71,8 +76,8 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
Assert.Equal(count, response.Count());
|
Assert.Equal(count, response.Count());
|
||||||
foreach (var item in response)
|
foreach (var item in response)
|
||||||
{
|
{
|
||||||
Assert.Single(item.Values);
|
Assert.Single(item.Values!);
|
||||||
var kv = item.Values.First();
|
var kv = item.Values!.First();
|
||||||
Assert.Equal("A", ((KeyValuePair<string, object>) kv).Key);
|
Assert.Equal("A", ((KeyValuePair<string, object>) kv).Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,18 +201,28 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
|
|||||||
|
|
||||||
private static IEnumerable<TimestampedValuesDto> Generate(int n, DateTimeOffset from)
|
private static IEnumerable<TimestampedValuesDto> Generate(int n, DateTimeOffset from)
|
||||||
{
|
{
|
||||||
|
var result = new List<TimestampedValuesDto>();
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
var t = new object[] {
|
||||||
|
new { A = i },
|
||||||
|
new { B = i * 1.1 },
|
||||||
|
new { C = $"Any{i}" },
|
||||||
|
new { D = DateTimeOffset.Now }
|
||||||
|
};
|
||||||
|
string jsonString = JsonSerializer.Serialize(t);
|
||||||
|
var values = JsonSerializer.Deserialize<object[]>(jsonString);
|
||||||
|
//// Ñîçäàíèå äèíàìè÷åñêîãî îáúåêòà
|
||||||
|
//dynamic obj = new ExpandoObject();
|
||||||
|
|
||||||
|
//// Äîáàâëÿåì ïîëå ñ èìåíåì "FieldName" è çíà÷åíèåì 123
|
||||||
|
//obj.FieldName = 123;
|
||||||
|
|
||||||
yield return new TimestampedValuesDto()
|
yield return new TimestampedValuesDto()
|
||||||
{
|
{
|
||||||
Timestamp = from.AddSeconds(i),
|
Timestamp = from.AddSeconds(i),
|
||||||
Values = new Dictionary<string, object> {
|
Values = values
|
||||||
{"A", i },
|
|
||||||
{"B", i * 1.1 },
|
|
||||||
{"C", $"Any{i}" },
|
|
||||||
{"D", DateTimeOffset.Now}
|
|
||||||
}
|
|
||||||
.Select(e => (object) e)
|
|
||||||
.ToArray()
|
|
||||||
};
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,11 @@ public class TimestampedValuesRepository<TDto> : ITimestampedValuesRepository<TD
|
|||||||
.Select(d => d.Adapt<TimestampedValues>())
|
.Select(d => d.Adapt<TimestampedValues>())
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
entities.ForEach(d => d.DiscriminatorId = discriminatorId);
|
entities.ForEach(d =>
|
||||||
|
{
|
||||||
|
d.DiscriminatorId = discriminatorId;
|
||||||
|
d.Timestamp = d.Timestamp.ToUniversalTime();
|
||||||
|
});
|
||||||
|
|
||||||
await db.Set<TimestampedValues>().AddRangeAsync(entities, token);
|
await db.Set<TimestampedValues>().AddRangeAsync(entities, token);
|
||||||
var result = await db.SaveChangesAsync(token);
|
var result = await db.SaveChangesAsync(token);
|
||||||
|
Loading…
Reference in New Issue
Block a user