using AsbCloudDb.Model; using System; using System.Collections.Generic; using System.Linq; namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { class OperationDetectorResult { public int TelemetryBegin { get; set; } public int TelemetryEnd { get; set; } public DetectedOperation Operation { get; set; } } internal class OperationDetector : IOperationDetector { private readonly int idOperation; protected Func isValid = (_,_,_) => true; protected Func calcValue = (_, _, _) => 0d; public OperationDetector(int idOperation) { this.idOperation = idOperation; } public bool TryDetect(int idTelemetry, DetectableTelemetry[] telemetryFragment, int begin, int end, out IEnumerable operations) { if(!telemetryFragment.Any() || !isValid(telemetryFragment, begin, end)) { operations = Enumerable.Empty(); return false; } var operation = MakeOperation(idTelemetry, telemetryFragment, begin, end); operations = new List { operation }; return true; } private OperationDetectorResult MakeOperation(int idTelemetry, DetectableTelemetry[] telemetryFragment, int begin, int end) { var pBegin = telemetryFragment[begin]; var pEnd = telemetryFragment[end]; var result = new OperationDetectorResult { TelemetryBegin = begin, TelemetryEnd = end, Operation = new DetectedOperation { IdTelemetry = idTelemetry, IdCategory = idOperation, IdUsersAtStart = pBegin.IdUser ?? -1, DateStart = pBegin.DateTime, DateEnd = pEnd.DateTime, DepthStart = (double)pBegin.WellDepth, DepthEnd = (double)pEnd.WellDepth, Value = calcValue(telemetryFragment, begin, end), }, }; return result; } } }