From 1c1a33aeeea738c91b1b5ac6d9e3cf75e3a6a3cb Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 11 Sep 2023 13:48:47 +0500 Subject: [PATCH] TelemetryDataBaseService.GetAsync Add cache --- .../Services/SAUB/TelemetryDataBaseService.cs | 4 ++ .../Services/SAUB/TelemetryDataCache.cs | 50 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 634e2cd1..cdb0daf7 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -155,6 +155,10 @@ namespace AsbCloudInfrastructure.Services.SAUB var timezone = telemetryService.GetTimezone(telemetry.Id); + var cache = telemetryDataCache.GetOrDefault(telemetry.Id, request); + if(cache is not null) + return cache; + var dbSet = db.Set(); var query = dbSet diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs index 53089f17..6b468682 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs @@ -11,6 +11,7 @@ using Microsoft.Extensions.DependencyInjection; using AsbCloudInfrastructure.Background; using System.Threading; using AsbCloudApp.Data; +using AsbCloudApp.Requests; namespace AsbCloudInfrastructure.Services.SAUB { @@ -228,5 +229,54 @@ namespace AsbCloudInfrastructure.Services.SAUB }; return item; } + + public IEnumerable? GetOrDefault(int idTelemetry, TelemetryDataRequest request) + { + if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) + return null; + + IEnumerable data = cacheItem.LastData; + + if (!data.Any()) + return null; + + if (request.GeDate.HasValue) + { + if (data.First().DateTime > request.GeDate.Value) + return null; + + data = data.Where(d => d.DateTime >= request.GeDate); + } + else + { + if (request.Order == 0) + return null; + } + + if (request.LeDate.HasValue) + data = data.Where(d => d.DateTime >= request.LeDate); + + if (request.Divider > 1) + data = data.Where((d) => (((d.DateTime.DayOfYear * 24 + d.DateTime.Hour) * 60 + d.DateTime.Minute) * 60 + d.DateTime.Second) % request.Divider == 0); + + switch (request.Order) + { + case 1: // Поздние вперед + data = data + .OrderByDescending(d => d.DateTime) + .Skip(request.Skip) + .Take(request.Take) + .OrderBy(d => d.DateTime); + break; + default: // Ранние вперед + data = data + .OrderBy(d => d.DateTime) + .Skip(request.Skip) + .Take(request.Take); + break; + } + + return data; + } } }