diff --git a/DD.Persistence.Database.Postgres/Migrations/20250116093615_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20250122111321_Init.Designer.cs similarity index 94% rename from DD.Persistence.Database.Postgres/Migrations/20250116093615_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20250122111321_Init.Designer.cs index 0fa9552..a3678d6 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250116093615_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250122111321_Init.Designer.cs @@ -1,5 +1,6 @@ // using System; +using System.Text.Json; using DD.Persistence.Database.Model; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -12,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20250116093615_Init")] + [Migration("20250122111321_Init")] partial class Init { /// @@ -25,6 +26,23 @@ namespace DD.Persistence.Database.Postgres.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + modelBuilder.Entity("DD.Persistence.Database.Entity.DataScheme", b => + { + b.Property("DiscriminatorId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasComment("Идентификатор схемы данных"); + + b.Property("PropNames") + .IsRequired() + .HasColumnType("jsonb") + .HasComment("Наименования полей в порядке индексации"); + + b.HasKey("DiscriminatorId"); + + b.ToTable("DataSchemes"); + }); + modelBuilder.Entity("DD.Persistence.Database.Entity.DataSourceSystem", b => { b.Property("SystemId") @@ -125,23 +143,6 @@ namespace DD.Persistence.Database.Postgres.Migrations b.ToTable("TimestampedValues"); }); - modelBuilder.Entity("DD.Persistence.Database.Entity.ValuesIdentity", b => - { - b.Property("DiscriminatorId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasComment("Дискриминатор системы"); - - b.Property("Identity") - .IsRequired() - .HasColumnType("jsonb") - .HasComment("Идентификаторы"); - - b.HasKey("DiscriminatorId"); - - b.ToTable("ValuesIdentities"); - }); - modelBuilder.Entity("DD.Persistence.Database.Model.ChangeLog", b => { b.Property("Id") @@ -209,8 +210,7 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Id автора последнего изменения"); - b.Property("Value") - .IsRequired() + b.Property("Value") .HasColumnType("jsonb") .HasComment("Значение уставки"); @@ -232,13 +232,13 @@ namespace DD.Persistence.Database.Postgres.Migrations modelBuilder.Entity("DD.Persistence.Database.Entity.TimestampedValues", b => { - b.HasOne("DD.Persistence.Database.Entity.ValuesIdentity", "ValuesIdentity") + b.HasOne("DD.Persistence.Database.Entity.DataScheme", "DataScheme") .WithMany() .HasForeignKey("DiscriminatorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("ValuesIdentity"); + b.Navigation("DataScheme"); }); #pragma warning restore 612, 618 } diff --git a/DD.Persistence.Database.Postgres/Migrations/20250116093615_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250122111321_Init.cs similarity index 92% rename from DD.Persistence.Database.Postgres/Migrations/20250116093615_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20250122111321_Init.cs index 1898472..6f5ecfc 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250116093615_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250122111321_Init.cs @@ -1,4 +1,5 @@ using System; +using System.Text.Json; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable @@ -32,6 +33,18 @@ namespace DD.Persistence.Database.Postgres.Migrations table.PrimaryKey("PK_ChangeLog", x => x.Id); }); + migrationBuilder.CreateTable( + name: "DataSchemes", + columns: table => new + { + DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Идентификатор схемы данных"), + PropNames = table.Column(type: "jsonb", nullable: false, comment: "Наименования полей в порядке индексации") + }, + constraints: table => + { + table.PrimaryKey("PK_DataSchemes", x => x.DiscriminatorId); + }); + migrationBuilder.CreateTable( name: "DataSourceSystem", columns: table => new @@ -65,7 +78,7 @@ namespace DD.Persistence.Database.Postgres.Migrations { Key = table.Column(type: "uuid", nullable: false, comment: "Ключ"), Timestamp = table.Column(type: "timestamp with time zone", nullable: false, comment: "Дата создания уставки"), - Value = table.Column(type: "jsonb", nullable: false, comment: "Значение уставки"), + Value = table.Column(type: "jsonb", nullable: false, comment: "Значение уставки"), IdUser = table.Column(type: "uuid", nullable: false, comment: "Id автора последнего изменения") }, constraints: table => @@ -74,15 +87,22 @@ namespace DD.Persistence.Database.Postgres.Migrations }); migrationBuilder.CreateTable( - name: "ValuesIdentities", + name: "TimestampedValues", columns: table => new { + Timestamp = table.Column(type: "timestamp with time zone", nullable: false, comment: "Временная отметка"), DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор системы"), - Identity = table.Column(type: "jsonb", nullable: false, comment: "Идентификаторы") + Values = table.Column(type: "jsonb", nullable: false, comment: "Данные") }, constraints: table => { - table.PrimaryKey("PK_ValuesIdentities", x => x.DiscriminatorId); + table.PrimaryKey("PK_TimestampedValues", x => new { x.DiscriminatorId, x.Timestamp }); + table.ForeignKey( + name: "FK_TimestampedValues_DataSchemes_DiscriminatorId", + column: x => x.DiscriminatorId, + principalTable: "DataSchemes", + principalColumn: "DiscriminatorId", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -107,25 +127,6 @@ namespace DD.Persistence.Database.Postgres.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "TimestampedValues", - columns: table => new - { - Timestamp = table.Column(type: "timestamp with time zone", nullable: false, comment: "Временная отметка"), - DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор системы"), - Values = table.Column(type: "jsonb", nullable: false, comment: "Данные") - }, - constraints: table => - { - table.PrimaryKey("PK_TimestampedValues", x => new { x.DiscriminatorId, x.Timestamp }); - table.ForeignKey( - name: "FK_TimestampedValues_ValuesIdentities_DiscriminatorId", - column: x => x.DiscriminatorId, - principalTable: "ValuesIdentities", - principalColumn: "DiscriminatorId", - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateIndex( name: "IX_TechMessage_SystemId", table: "TechMessage", @@ -154,7 +155,7 @@ namespace DD.Persistence.Database.Postgres.Migrations name: "DataSourceSystem"); migrationBuilder.DropTable( - name: "ValuesIdentities"); + name: "DataSchemes"); } } } diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index 72e5d62..7171bb8 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -1,5 +1,6 @@ // using System; +using System.Text.Json; using DD.Persistence.Database.Model; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -22,6 +23,23 @@ namespace DD.Persistence.Database.Postgres.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + modelBuilder.Entity("DD.Persistence.Database.Entity.DataScheme", b => + { + b.Property("DiscriminatorId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasComment("Идентификатор схемы данных"); + + b.Property("PropNames") + .IsRequired() + .HasColumnType("jsonb") + .HasComment("Наименования полей в порядке индексации"); + + b.HasKey("DiscriminatorId"); + + b.ToTable("DataSchemes"); + }); + modelBuilder.Entity("DD.Persistence.Database.Entity.DataSourceSystem", b => { b.Property("SystemId") @@ -122,23 +140,6 @@ namespace DD.Persistence.Database.Postgres.Migrations b.ToTable("TimestampedValues"); }); - modelBuilder.Entity("DD.Persistence.Database.Entity.ValuesIdentity", b => - { - b.Property("DiscriminatorId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasComment("Дискриминатор системы"); - - b.Property("Identity") - .IsRequired() - .HasColumnType("jsonb") - .HasComment("Идентификаторы"); - - b.HasKey("DiscriminatorId"); - - b.ToTable("ValuesIdentities"); - }); - modelBuilder.Entity("DD.Persistence.Database.Model.ChangeLog", b => { b.Property("Id") @@ -206,8 +207,7 @@ namespace DD.Persistence.Database.Postgres.Migrations .HasColumnType("uuid") .HasComment("Id автора последнего изменения"); - b.Property("Value") - .IsRequired() + b.Property("Value") .HasColumnType("jsonb") .HasComment("Значение уставки"); @@ -229,13 +229,13 @@ namespace DD.Persistence.Database.Postgres.Migrations modelBuilder.Entity("DD.Persistence.Database.Entity.TimestampedValues", b => { - b.HasOne("DD.Persistence.Database.Entity.ValuesIdentity", "ValuesIdentity") + b.HasOne("DD.Persistence.Database.Entity.DataScheme", "DataScheme") .WithMany() .HasForeignKey("DiscriminatorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("ValuesIdentity"); + b.Navigation("DataScheme"); }); #pragma warning restore 612, 618 } diff --git a/DD.Persistence.Database/Entity/DataScheme.cs b/DD.Persistence.Database/Entity/DataScheme.cs index 7936d0c..7fa3394 100644 --- a/DD.Persistence.Database/Entity/DataScheme.cs +++ b/DD.Persistence.Database/Entity/DataScheme.cs @@ -6,7 +6,7 @@ namespace DD.Persistence.Database.Entity; public class DataScheme { - [Key, Comment("Дискриминатор системы"),] + [Key, Comment("Идентификатор схемы данных"),] public Guid DiscriminatorId { get; set; } [Comment("Наименования полей в порядке индексации"), Column(TypeName = "jsonb")] diff --git a/DD.Persistence.Repository/Repositories/DataSchemeRepository.cs b/DD.Persistence.Repository/Repositories/DataSchemeRepository.cs index 3fe99d2..c30c8da 100644 --- a/DD.Persistence.Repository/Repositories/DataSchemeRepository.cs +++ b/DD.Persistence.Repository/Repositories/DataSchemeRepository.cs @@ -22,10 +22,10 @@ public class DataSchemeRepository : IDataSchemeRepository await db.SaveChangesAsync(token); } - public virtual async Task GetByDiscriminator(Guid discriminatorId, CancellationToken token) + public virtual async Task Get(Guid dataSchemeId, CancellationToken token) { var query = GetQueryReadOnly() - .Where(e => e.DiscriminatorId == discriminatorId); + .Where(e => e.DiscriminatorId == dataSchemeId); var entity = await query.ToArrayAsync(); var dto = entity.Select(e => e.Adapt()).FirstOrDefault(); diff --git a/DD.Persistence.Repository/RepositoriesCached/DataSchemeCachedRepository.cs b/DD.Persistence.Repository/RepositoriesCached/DataSchemeCachedRepository.cs index aeb144a..ea22196 100644 --- a/DD.Persistence.Repository/RepositoriesCached/DataSchemeCachedRepository.cs +++ b/DD.Persistence.Repository/RepositoriesCached/DataSchemeCachedRepository.cs @@ -20,10 +20,10 @@ public class DataSchemeCachedRepository : DataSchemeRepository memoryCache.Set(dataSourceSystemDto.DiscriminatorId, dataSourceSystemDto); } - public override async Task GetByDiscriminator(Guid discriminatorId, CancellationToken token) + public override async Task Get(Guid discriminatorId, CancellationToken token) { var result = memoryCache.Get(discriminatorId) - ?? await base.GetByDiscriminator(discriminatorId, token); + ?? await base.Get(discriminatorId, token); return result; } diff --git a/DD.Persistence/Repositories/IDataSchemeRepository.cs b/DD.Persistence/Repositories/IDataSchemeRepository.cs index ff6ef4b..c14a9cf 100644 --- a/DD.Persistence/Repositories/IDataSchemeRepository.cs +++ b/DD.Persistence/Repositories/IDataSchemeRepository.cs @@ -18,8 +18,8 @@ public interface IDataSchemeRepository /// /// Вычитать схему /// - /// Дискриминатор системы + /// Идентификатор схемы /// /// - Task GetByDiscriminator(Guid discriminatorId, CancellationToken token); + Task Get(Guid dataSchemeId, CancellationToken token); } \ No newline at end of file diff --git a/DD.Persistence/Services/TimestampedValuesService.cs b/DD.Persistence/Services/TimestampedValuesService.cs index d6d6bf4..81a8fd3 100644 --- a/DD.Persistence/Services/TimestampedValuesService.cs +++ b/DD.Persistence/Services/TimestampedValuesService.cs @@ -113,14 +113,14 @@ public class TimestampedValuesService : ITimestampedValuesService /// /// Преобразовать результат запроса в набор dto /// - /// + /// /// /// /// - private async Task> Materialize(Guid discriminatorId, IEnumerable> queryResult, CancellationToken token) + private async Task> Materialize(Guid dataSchemeId, IEnumerable> queryResult, CancellationToken token) { - var systemSpecification = await dataSchemeRepository.GetByDiscriminator(discriminatorId, token); - if (systemSpecification is null) + var dataScheme = await dataSchemeRepository.Get(dataSchemeId, token); + if (dataScheme is null) { return []; } @@ -132,7 +132,7 @@ public class TimestampedValuesService : ITimestampedValuesService Timestamp = entity.Item1.ToUniversalTime() }; - var identity = systemSpecification!.PropNames; + var identity = dataScheme!.PropNames; var indexedIdentity = identity .Select((value, index) => new { index, value }); dto.Values = indexedIdentity @@ -154,7 +154,7 @@ public class TimestampedValuesService : ITimestampedValuesService /// Некорректный набор наименований полей private async Task CreateSystemSpecificationIfNotExist(Guid discriminatorId, string[] fieldNames, CancellationToken token) { - var systemSpecification = await dataSchemeRepository.GetByDiscriminator(discriminatorId, token); + var systemSpecification = await dataSchemeRepository.Get(discriminatorId, token); if (systemSpecification is null) { systemSpecification = new DataSchemeDto()