2022-04-08 13:10:06 +05:00
|
|
|
|
using AsbCloudApp.Data.SAUB;
|
2021-09-17 16:24:01 +05:00
|
|
|
|
using AsbCloudApp.Services;
|
|
|
|
|
using AsbCloudDb.Model;
|
|
|
|
|
using AsbCloudInfrastructure.Services.Cache;
|
2022-10-06 13:49:20 +05:00
|
|
|
|
using DocumentFormat.OpenXml.Drawing.Charts;
|
2021-09-17 16:24:01 +05:00
|
|
|
|
using Mapster;
|
2022-10-06 13:49:20 +05:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
2021-09-17 16:24:01 +05:00
|
|
|
|
|
2022-04-11 18:00:34 +05:00
|
|
|
|
namespace AsbCloudInfrastructure.Services.SAUB
|
2021-09-17 16:24:01 +05:00
|
|
|
|
{
|
2022-04-11 18:00:34 +05:00
|
|
|
|
public class TelemetryDataSaubService : TelemetryDataBaseService<TelemetryDataSaubDto, TelemetryDataSaub>
|
2021-09-17 16:24:01 +05:00
|
|
|
|
{
|
|
|
|
|
public TelemetryDataSaubService(
|
|
|
|
|
IAsbCloudDbContext db,
|
|
|
|
|
ITelemetryService telemetryService,
|
|
|
|
|
CacheDb cacheDb)
|
2022-04-11 18:00:34 +05:00
|
|
|
|
: base(db, telemetryService, cacheDb)
|
|
|
|
|
{ }
|
2021-09-17 16:24:01 +05:00
|
|
|
|
|
2022-01-05 17:50:45 +05:00
|
|
|
|
public override TelemetryDataSaub Convert(TelemetryDataSaubDto src, double timezoneOffset)
|
2021-09-17 16:24:01 +05:00
|
|
|
|
{
|
|
|
|
|
var entity = src.Adapt<TelemetryDataSaub>();
|
2021-09-23 10:53:48 +05:00
|
|
|
|
var telemetryUser = cacheTelemetryUsers?
|
2021-09-17 16:24:01 +05:00
|
|
|
|
.FirstOrDefault(u => u.IdTelemetry == src.IdTelemetry && (u.Name == src.User || u.Surname == src.User));
|
2021-09-23 10:53:48 +05:00
|
|
|
|
entity.IdUser = telemetryUser?.IdUser;
|
2022-04-08 13:10:06 +05:00
|
|
|
|
entity.DateTime = src.DateTime.ToUtcDateTimeOffset(timezoneOffset);
|
2021-09-17 16:24:01 +05:00
|
|
|
|
return entity;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-05 17:50:45 +05:00
|
|
|
|
public override TelemetryDataSaubDto Convert(TelemetryDataSaub src, double timezoneOffset)
|
2021-09-17 16:24:01 +05:00
|
|
|
|
{
|
|
|
|
|
var dto = src.Adapt<TelemetryDataSaubDto>();
|
2021-09-23 10:53:48 +05:00
|
|
|
|
var telemetryUser = cacheTelemetryUsers?
|
2021-09-17 16:24:01 +05:00
|
|
|
|
.FirstOrDefault(u => u.IdTelemetry == src.IdTelemetry && u.IdUser == src.IdUser);
|
2021-09-23 10:53:48 +05:00
|
|
|
|
dto.User = telemetryUser?.MakeDisplayName();
|
2022-04-08 13:10:06 +05:00
|
|
|
|
dto.DateTime = src.DateTime.ToRemoteDateTime(timezoneOffset);
|
2021-09-17 16:24:01 +05:00
|
|
|
|
return dto;
|
|
|
|
|
}
|
2022-10-06 13:49:20 +05:00
|
|
|
|
|
|
|
|
|
public override async Task<(int oldCount, int newCount)> RediceSamplingAsync(int idTelemetry, int ratio, int maxDateGapSec, CancellationToken token)
|
|
|
|
|
{
|
|
|
|
|
const int ramLimit = 50 * 1024 * 1024;
|
|
|
|
|
const int dataItemSize = 345; // by profiler
|
|
|
|
|
const int itemsCountLimit = ramLimit / dataItemSize; // ~ 150_000, iterations count ~ 46
|
|
|
|
|
const int maxWellDepthGap = 1;
|
|
|
|
|
|
|
|
|
|
var dbset = db.Set<TelemetryDataSaub>();
|
|
|
|
|
|
|
|
|
|
var sql =
|
|
|
|
|
"select" +
|
|
|
|
|
" *" +
|
|
|
|
|
"from" +
|
|
|
|
|
" (select" +
|
|
|
|
|
" *," +
|
|
|
|
|
" rank() over win1 as row_num," +
|
|
|
|
|
" lag(\"date\", 1) over win1 as lag_date," +
|
|
|
|
|
" lag(\"mode\", 1) over win1 as lag_mode," +
|
|
|
|
|
" lag(mse_state, 1) over win1 as lag_mse_state," +
|
|
|
|
|
" lag(well_depth, 1) over win1 as lag_well_depth," +
|
|
|
|
|
" lag(id_feed_regulator, 1) over win1 as lag_id_feed_regulator" +
|
|
|
|
|
" from t_telemetry_data_saub" +
|
|
|
|
|
$" where id_telemetry = {idTelemetry}" +
|
|
|
|
|
" window win1 as (order by \"date\")" +
|
|
|
|
|
" ) as ttt" +
|
|
|
|
|
"where" +
|
|
|
|
|
$" (row_num % {ratio}) = 0" +
|
|
|
|
|
" or \"mode\" != lag_mode" +
|
|
|
|
|
$" or(\"date\" - lag_date) > interval '{maxDateGapSec} second'" +
|
|
|
|
|
$" or well_depth - lag_well_depth > {maxWellDepthGap}" +
|
|
|
|
|
" or mse_state != lag_mse_state" +
|
|
|
|
|
" or id_feed_regulator != lag_id_feed_regulator;";
|
|
|
|
|
|
|
|
|
|
var query = dbset.FromSqlRaw(sql);
|
|
|
|
|
|
|
|
|
|
await Task.Delay(0);
|
|
|
|
|
return (0, 0);
|
|
|
|
|
}
|
2021-09-17 16:24:01 +05:00
|
|
|
|
}
|
|
|
|
|
}
|