Implement phase 5 critical branch extraction
This commit is contained in:
@@ -14,6 +14,7 @@ public sealed class RolemasterDbContext(DbContextOptions<RolemasterDbContext> op
|
||||
public DbSet<CriticalColumn> CriticalColumns => Set<CriticalColumn>();
|
||||
public DbSet<CriticalRollBand> CriticalRollBands => Set<CriticalRollBand>();
|
||||
public DbSet<CriticalResult> CriticalResults => Set<CriticalResult>();
|
||||
public DbSet<CriticalBranch> CriticalBranches => Set<CriticalBranch>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
@@ -78,5 +79,13 @@ public sealed class RolemasterDbContext(DbContextOptions<RolemasterDbContext> op
|
||||
entity.HasIndex(item => new { item.CriticalTableId, item.CriticalGroupId, item.CriticalColumnId, item.CriticalRollBandId }).IsUnique();
|
||||
entity.Property(item => item.ParseStatus).HasMaxLength(32);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<CriticalBranch>(entity =>
|
||||
{
|
||||
entity.HasIndex(item => item.CriticalResultId);
|
||||
entity.HasIndex(item => new { item.CriticalResultId, item.SortOrder });
|
||||
entity.Property(item => item.BranchKind).HasMaxLength(32);
|
||||
entity.Property(item => item.ConditionKey).HasMaxLength(128);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ public static class RolemasterDbInitializer
|
||||
await using var dbContext = await dbFactory.CreateDbContextAsync(cancellationToken);
|
||||
|
||||
await dbContext.Database.EnsureCreatedAsync(cancellationToken);
|
||||
await RolemasterDbSchemaUpgrader.EnsureLatestAsync(dbContext, cancellationToken);
|
||||
|
||||
if (await dbContext.AttackTables.AnyAsync(cancellationToken))
|
||||
{
|
||||
|
||||
43
src/RolemasterDb.App/Data/RolemasterDbSchemaUpgrader.cs
Normal file
43
src/RolemasterDb.App/Data/RolemasterDbSchemaUpgrader.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace RolemasterDb.App.Data;
|
||||
|
||||
public static class RolemasterDbSchemaUpgrader
|
||||
{
|
||||
public static async Task EnsureLatestAsync(RolemasterDbContext dbContext, CancellationToken cancellationToken = default)
|
||||
{
|
||||
await dbContext.Database.ExecuteSqlRawAsync(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS "CriticalBranches" (
|
||||
"Id" INTEGER NOT NULL CONSTRAINT "PK_CriticalBranches" PRIMARY KEY AUTOINCREMENT,
|
||||
"CriticalResultId" INTEGER NOT NULL,
|
||||
"BranchKind" TEXT NOT NULL,
|
||||
"ConditionKey" TEXT NULL,
|
||||
"ConditionText" TEXT NOT NULL,
|
||||
"ConditionJson" TEXT NOT NULL,
|
||||
"RawText" TEXT NOT NULL,
|
||||
"DescriptionText" TEXT NOT NULL,
|
||||
"RawAffixText" TEXT NULL,
|
||||
"ParsedJson" TEXT NOT NULL,
|
||||
"SortOrder" INTEGER NOT NULL,
|
||||
CONSTRAINT "FK_CriticalBranches_CriticalResults_CriticalResultId"
|
||||
FOREIGN KEY ("CriticalResultId") REFERENCES "CriticalResults" ("Id") ON DELETE CASCADE
|
||||
);
|
||||
""",
|
||||
cancellationToken);
|
||||
|
||||
await dbContext.Database.ExecuteSqlRawAsync(
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS "IX_CriticalBranches_CriticalResultId"
|
||||
ON "CriticalBranches" ("CriticalResultId");
|
||||
""",
|
||||
cancellationToken);
|
||||
|
||||
await dbContext.Database.ExecuteSqlRawAsync(
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS "IX_CriticalBranches_CriticalResultId_SortOrder"
|
||||
ON "CriticalBranches" ("CriticalResultId", "SortOrder");
|
||||
""",
|
||||
cancellationToken);
|
||||
}
|
||||
}
|
||||
17
src/RolemasterDb.App/Domain/CriticalBranch.cs
Normal file
17
src/RolemasterDb.App/Domain/CriticalBranch.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
namespace RolemasterDb.App.Domain;
|
||||
|
||||
public sealed class CriticalBranch
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int CriticalResultId { get; set; }
|
||||
public string BranchKind { get; set; } = "conditional";
|
||||
public string? ConditionKey { get; set; }
|
||||
public string ConditionText { get; set; } = string.Empty;
|
||||
public string ConditionJson { get; set; } = "{}";
|
||||
public string RawText { get; set; } = string.Empty;
|
||||
public string DescriptionText { get; set; } = string.Empty;
|
||||
public string? RawAffixText { get; set; }
|
||||
public string ParsedJson { get; set; } = "{}";
|
||||
public int SortOrder { get; set; }
|
||||
public CriticalResult CriticalResult { get; set; } = null!;
|
||||
}
|
||||
@@ -16,4 +16,5 @@ public sealed class CriticalResult
|
||||
public CriticalGroup? CriticalGroup { get; set; }
|
||||
public CriticalColumn CriticalColumn { get; set; } = null!;
|
||||
public CriticalRollBand CriticalRollBand { get; set; } = null!;
|
||||
public List<CriticalBranch> Branches { get; set; } = [];
|
||||
}
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user