From 6730d64df1bcea70f7204c0a48946f18c44840ad Mon Sep 17 00:00:00 2001 From: KharchenkoVV Date: Mon, 27 Sep 2021 16:50:56 +0500 Subject: [PATCH] CS2-88: Changed telemetry analysis interval (to 12 hours parts) --- .../Services/TelemetryAnalyticsService.cs | 97 +++++++++++++------ 1 file changed, 70 insertions(+), 27 deletions(-) diff --git a/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs b/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs index 0ec88364..f95ff463 100644 --- a/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryAnalyticsService.cs @@ -233,45 +233,52 @@ namespace AsbCloudInfrastructure.Services public void SaveAnalytics() { - var alltelemetryIds = db.TelemetryDataSaub.Select(t => t.IdTelemetry).Distinct().ToList(); + var allTelemetryIds = (from telemetry in db.TelemetryDataSaub + select telemetry.Id) + .Distinct() + .ToList(); - foreach(var idTelemetry in alltelemetryIds) + foreach(var idTelemetry in allTelemetryIds) { - var telemetries = db.TelemetryDataSaub.Where(t => t.IdTelemetry == idTelemetry && - t.Date.Hour == (DateTime.UtcNow.Hour - 1)).ToList(); + var analyzeStartDate = GetAnalyzeStartDate(idTelemetry); - foreach(var telemetry in telemetries) + while (GetDataSaubsToAnalyze(idTelemetry, analyzeStartDate).Any()) { - var dataSaubDto = telemetry.Adapt(); + var dataSaubsToAnalyze = GetDataSaubsToAnalyze(idTelemetry, (long)analyzeStartDate); - saubDataCache.AddData(dataSaubDto); - - if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1) + foreach (var dataSaub in dataSaubsToAnalyze) { - var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry) - .OrderBy(d => d.Date); + var dataSaubDto = dataSaub.Adapt(); - var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs); + saubDataCache.AddData(dataSaubDto); - if (saubDataCache.CurrentAnalysis is null) - saubDataCache.CurrentAnalysis = telemetryAnalysisDto; - - if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation) + if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1) { - saubDataCache.CurrentAnalysis.DurationSec += - telemetryAnalysisDto.DurationSec; - saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth; - } - else - { - db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt()); - saubDataCache.CurrentAnalysis = telemetryAnalysisDto; - saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth; + var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry) + .OrderBy(d => d.Date); + + var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs); + + if (saubDataCache.CurrentAnalysis is null) + saubDataCache.CurrentAnalysis = telemetryAnalysisDto; + + if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation) + { + saubDataCache.CurrentAnalysis.DurationSec += + telemetryAnalysisDto.DurationSec; + saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth; + } + else + { + db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt()); + saubDataCache.CurrentAnalysis = telemetryAnalysisDto; + saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth; + } } } - } - db.SaveChanges(); + db.SaveChanges(); + } } } @@ -305,6 +312,42 @@ namespace AsbCloudInfrastructure.Services }; } + private long GetAnalyzeStartDate(int idTelemetry) + { + var lastAnalysisInDb = (from analysis in db.TelemetryAnalysis + where analysis.Id == idTelemetry + orderby analysis.UnixDate + select analysis) + .DefaultIfEmpty() + .Last(); + + var analyzeStartDate = lastAnalysisInDb?.UnixDate; + + if (analyzeStartDate is null) + { + var firstDataSaub = (from ds in db.TelemetryDataSaub + where ds.IdTelemetry == idTelemetry + select ds.Date).FirstOrDefault(); + + analyzeStartDate = (long)(firstDataSaub - new DateTime(1970, 1, 1)).TotalSeconds; + } + + return (long)analyzeStartDate; + } + + private IEnumerable GetDataSaubsToAnalyze(int idTelemetry, long analyzeStartDate) + { + return (from ds in db.TelemetryDataSaub + let lowerBorder = DateTimeOffset + .FromUnixTimeSeconds(analyzeStartDate) + let upperBorder = DateTimeOffset + .FromUnixTimeSeconds(analyzeStartDate).AddHours(12) + where ds.Id == idTelemetry + && ds.Date > lowerBorder + && ds.Date < upperBorder + select ds).ToList(); + } + private static IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> DivideOperationsByIntervalLength( IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds) {