From 2e567e7eba738104adefc1dd5dd98bc59266d02f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 6 Dec 2024 14:55:07 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20(=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=87=D0=B0=D0=BD=D0=B8=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Persistence.Database/Entity/ChangeLog.cs | 3 +- Persistence.Database/Entity/IChangeLog.cs | 2 - .../Persistence.Database.csproj | 4 + Persistence.Repository/QueryBuilders.cs | 76 +++++++++++++++++ .../Repositories/ChangeLogRepository.cs | 82 ++++--------------- Persistence/Models/IWithSectionPart.cs | 9 ++ 6 files changed, 109 insertions(+), 67 deletions(-) create mode 100644 Persistence.Repository/QueryBuilders.cs create mode 100644 Persistence/Models/IWithSectionPart.cs diff --git a/Persistence.Database/Entity/ChangeLog.cs b/Persistence.Database/Entity/ChangeLog.cs index 2585ace..9a8001b 100644 --- a/Persistence.Database/Entity/ChangeLog.cs +++ b/Persistence.Database/Entity/ChangeLog.cs @@ -2,13 +2,14 @@ using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using Microsoft.EntityFrameworkCore; +using Persistence.Models; namespace Persistence.Database.Model; /// /// Часть записи, описывающая изменение /// -public class ChangeLog : IChangeLog +public class ChangeLog : IChangeLog, IWithSectionPart { [Key, Comment("Ключ записи")] public Guid Id { get; set; } diff --git a/Persistence.Database/Entity/IChangeLog.cs b/Persistence.Database/Entity/IChangeLog.cs index 04e08a4..c4dc962 100644 --- a/Persistence.Database/Entity/IChangeLog.cs +++ b/Persistence.Database/Entity/IChangeLog.cs @@ -1,6 +1,4 @@  -using System.ComponentModel.DataAnnotations.Schema; - namespace Persistence.Database.Model; /// diff --git a/Persistence.Database/Persistence.Database.csproj b/Persistence.Database/Persistence.Database.csproj index 8154daf..3019e82 100644 --- a/Persistence.Database/Persistence.Database.csproj +++ b/Persistence.Database/Persistence.Database.csproj @@ -14,4 +14,8 @@ + + + + diff --git a/Persistence.Repository/QueryBuilders.cs b/Persistence.Repository/QueryBuilders.cs new file mode 100644 index 0000000..23f5462 --- /dev/null +++ b/Persistence.Repository/QueryBuilders.cs @@ -0,0 +1,76 @@ +using Microsoft.EntityFrameworkCore; +using Persistence.Database.Model; +using Persistence.Models; +using Persistence.Models.Requests; + +namespace Persistence.Repository; + +/// +/// класс с набором методов, необходимых для фильтрации записей +/// +public static class QueryBuilders +{ + public static void Apply(this IQueryable query, SectionPartRequest request) + where TEntity : class, IWithSectionPart + { + if (request.IdSection.HasValue) + { + query = query.Where(e => e.IdSection == request.IdSection); + } + if (request.DepthStart.HasValue) + { + query = query.Where(e => e.DepthStart >= request.DepthStart); + } + if (request.DepthEnd.HasValue) + { + query = query.Where(e => e.DepthEnd <= request.DepthEnd); + } + } + + public static void Apply(this IQueryable query,DateTimeOffset momentUtc) + where TEntity : class, IChangeLog + { + momentUtc = momentUtc.ToUniversalTime(); + + query = query + .Where(e => e.Creation <= momentUtc) + .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); + } + + + public static async Task> ApplyPagination( + this IQueryable query, + PaginationRequest request, + Func Convert, + CancellationToken token) + where TEntity : class, IWithSectionPart + where TDto : class + { + if (String.IsNullOrEmpty(request.SortSettings)) + { + query = query + .OrderBy(e => e.IdSection) + .ThenBy(e => e.DepthStart) + .ThenBy(e => e.DepthEnd); + } + else + { + query = query.SortBy(request.SortSettings); + } + + var entities = await query + .Skip(request.Skip) + .Take(request.Take) + .ToArrayAsync(token); + + var result = new PaginationContainer + { + Skip = request.Skip, + Take = request.Take, + Items = entities.Select(Convert), + Count = await query.CountAsync(token) + }; + + return result; + } +} diff --git a/Persistence.Repository/Repositories/ChangeLogRepository.cs b/Persistence.Repository/Repositories/ChangeLogRepository.cs index 16790a7..7f6d573 100644 --- a/Persistence.Repository/Repositories/ChangeLogRepository.cs +++ b/Persistence.Repository/Repositories/ChangeLogRepository.cs @@ -37,7 +37,7 @@ public class ChangeLogRepository : IChangeLogRepository .Where(s => ids.Contains(s.Id)) .Where(s => s.Obsolete != null); - if(query.Count() != ids.Count()) + if (query.Count() != ids.Count()) { throw new ArgumentException("Count of active items not equal count of ids", nameof(ids)); } @@ -80,13 +80,13 @@ public class ChangeLogRepository : IChangeLogRepository var result = 0; using var transaction = await db.Database.BeginTransactionAsync(token); - + result += await MarkAsDeleted(idAuthor, idDiscriminator, token); result += await AddRange(idAuthor, idDiscriminator, dtos, token); await transaction.CommitAsync(token); - + return result; } @@ -106,7 +106,7 @@ public class ChangeLogRepository : IChangeLogRepository foreach (var dto in dtos) { var updatedEntity = updatedEntities.GetValueOrDefault(dto.Id); - if(updatedEntity is null) + if (updatedEntity is null) { throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto)); } @@ -138,33 +138,18 @@ public class ChangeLogRepository : IChangeLogRepository PaginationRequest paginationRequest, CancellationToken token) { - var query = BuildQuery(idDiscriminator, momentUtc, filterRequest); - //ApplyFilter(query, , filterRequest); - var result = await BuildPaginationContainer(query, paginationRequest, token); + var query = CreateQuery(idDiscriminator); + query.Apply(momentUtc); + query.Apply(filterRequest); + + var result = await query.ApplyPagination(paginationRequest, Convert, token); return result; } - private IQueryable BuildQuery(Guid idDiscriminator, DateTimeOffset momentUtc, SectionPartRequest request) + private IQueryable CreateQuery(Guid idDiscriminator) { - momentUtc = momentUtc.ToUniversalTime(); - var query = db.Set() - .Where(e => e.IdDiscriminator == idDiscriminator) - .Where(e => e.Creation <= momentUtc) - .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); - - if (request.IdSection.HasValue) - { - query = query.Where(e => e.IdSection == request.IdSection); - } - if (request.DepthStart.HasValue) - { - query = query.Where(e => e.DepthStart >= request.DepthStart); - } - if (request.DepthEnd.HasValue) - { - query = query.Where(e => e.DepthEnd <= request.DepthEnd); - } + var query = db.Set().Where(e => e.IdDiscriminator == idDiscriminator); return query; } @@ -173,8 +158,8 @@ public class ChangeLogRepository : IChangeLogRepository { var query = db.Set().Where(s => s.IdDiscriminator == idDiscriminator); - var min = new DateTimeOffset(dateBegin.Year, dateBegin.Month, dateBegin.Day, 0, 0, 0, TimeSpan.Zero); - var max = new DateTimeOffset(dateEnd.Year, dateEnd.Month, dateEnd.Day, 0, 0, 0, TimeSpan.Zero); + var min = new DateTimeOffset(dateBegin.ToUniversalTime().Date, TimeSpan.Zero); + var max = new DateTimeOffset(dateEnd.ToUniversalTime().Date, TimeSpan.Zero); var createdQuery = query.Where(e => e.Creation >= min && e.Creation <= max); var editedQuery = query.Where(e => e.Obsolete != null && e.Obsolete >= min && e.Obsolete <= max); @@ -189,39 +174,6 @@ public class ChangeLogRepository : IChangeLogRepository - private async Task> BuildPaginationContainer(IQueryable query, PaginationRequest request, CancellationToken token) - { - var result = new PaginationContainer - { - Skip = request.Skip, - Take = request.Take, - Items = Enumerable.Empty(), - Count = await query.CountAsync(token) - }; - - if (!String.IsNullOrEmpty(request.SortSettings)) - { - query = query.SortBy(request.SortSettings); - } - else - { - query = query - .OrderBy(e => e.IdSection) - .ThenBy(e => e.DepthStart) - .ThenBy(e => e.DepthEnd); - } - - var entities = await query - .Skip(result.Skip) - .Take(result.Take) - .ToArrayAsync(token); - - var dtos = entities.Select(e => e.Adapt()); - result.Items = dtos; - - return result; - } - public async Task> GetDatesChange(Guid idDiscriminator, CancellationToken token) { var query = db.Set().Where(e => e.IdDiscriminator == idDiscriminator); @@ -276,7 +228,7 @@ public class ChangeLogRepository : IChangeLogRepository var entities = await query.ToArrayAsync(token); - var dtos = entities.Select(e => e.Adapt()); + var dtos = entities.Select(Convert); return dtos; } @@ -289,12 +241,12 @@ public class ChangeLogRepository : IChangeLogRepository .Select(group => new { Min = group.Min(e => e.Creation), - Max = group.Max(e => e.Creation), + Max = group.Max(e => (e.Creation > e.Obsolete ? e.Creation : e.Obsolete!.Value)), }); var values = await query.FirstOrDefaultAsync(token); - if(values is null) + if (values is null) { return null; } @@ -305,4 +257,6 @@ public class ChangeLogRepository : IChangeLogRepository To = values.Max, }; } + + private DataWithWellDepthAndSectionDto Convert(ChangeLog entity) => entity.Adapt(); } diff --git a/Persistence/Models/IWithSectionPart.cs b/Persistence/Models/IWithSectionPart.cs new file mode 100644 index 0000000..adb5fdd --- /dev/null +++ b/Persistence/Models/IWithSectionPart.cs @@ -0,0 +1,9 @@ +namespace Persistence.Models; +public interface IWithSectionPart +{ + public double DepthStart { get; set; } + + public double DepthEnd { get; set; } + + public Guid IdSection { get; set; } +}