From 2c9814292aea604411fa8726610b19c23ba1e990 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 11 Sep 2020 00:42:24 +0100 Subject: [PATCH] Cache statistics and move its generation to importers. --- RomRepoMgr.Core/Workers/DatImporter.cs | 92 ++-- RomRepoMgr.Core/Workers/FileImporter.cs | 37 +- RomRepoMgr.Database/Context.cs | 6 + .../20200910111423_AddStatsTable.Designer.cs | 461 ++++++++++++++++++ .../20200910111423_AddStatsTable.cs | 32 ++ .../Migrations/ContextModelSnapshot.cs | 28 ++ RomRepoMgr.Database/Models/RomSet.cs | 5 +- RomRepoMgr.Database/Models/RomSetStat.cs | 17 + .../ViewModels/SplashWindowViewModel.cs | 54 +- 9 files changed, 653 insertions(+), 79 deletions(-) create mode 100644 RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.Designer.cs create mode 100644 RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.cs create mode 100644 RomRepoMgr.Database/Models/RomSetStat.cs diff --git a/RomRepoMgr.Core/Workers/DatImporter.cs b/RomRepoMgr.Core/Workers/DatImporter.cs index f3d8166..6dc04c9 100644 --- a/RomRepoMgr.Core/Workers/DatImporter.cs +++ b/RomRepoMgr.Core/Workers/DatImporter.cs @@ -1045,51 +1045,65 @@ namespace RomRepoMgr.Core.Workers newMedias.Clear(); newMediasByMachine.Clear(); - WorkFinished?.Invoke(this, System.EventArgs.Empty); + RomSetStat stats = ctx.RomSets.Where(r => r.Id == romSet.Id).Select(r => new RomSetStat + { + RomSetId = r.Id, + TotalMachines = r.Machines.Count, + CompleteMachines = + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count == 0 && + m.Files.All(f => f.File.IsInRepo)) + + r.Machines.Count(m => m.Disks.Count > 0 && m.Files.Count == 0 && + m.Disks.All(f => f.Disk.IsInRepo)) + + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count > 0 && + m.Files.All(f => f.File.IsInRepo) && m.Disks.All(f => f.Disk.IsInRepo)), + IncompleteMachines = + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count == 0 && + m.Files.Any(f => !f.File.IsInRepo)) + + r.Machines.Count(m => m.Disks.Count > 0 && m.Files.Count == 0 && + m.Disks.Any(f => !f.Disk.IsInRepo)) + + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count > 0 && + (m.Files.Any(f => !f.File.IsInRepo) || + m.Disks.Any(f => !f.Disk.IsInRepo))), + TotalRoms = r.Machines.Sum(m => m.Files.Count) + r.Machines.Sum(m => m.Disks.Count) + + r.Machines.Sum(m => m.Medias.Count), + HaveRoms = r.Machines.Sum(m => m.Files.Count(f => f.File.IsInRepo)) + + r.Machines.Sum(m => m.Disks.Count(f => f.Disk.IsInRepo)) + + r.Machines.Sum(m => m.Medias.Count(f => f.Media.IsInRepo)), + MissRoms = r.Machines.Sum(m => m.Files.Count(f => !f.File.IsInRepo)) + + r.Machines.Sum(m => m.Disks.Count(f => !f.Disk.IsInRepo)) + + r.Machines.Sum(m => m.Medias.Count(f => !f.Media.IsInRepo)) + }).FirstOrDefault(); - romSet = ctx.RomSets.Find(romSet.Id); + RomSetStat oldStats = ctx.RomSetStats.Find(stats.RomSetId); + + if(oldStats != null) + ctx.Remove(oldStats); + + ctx.RomSetStats.Add(stats); + + WorkFinished?.Invoke(this, System.EventArgs.Empty); RomSetAdded?.Invoke(this, new RomSetEventArgs { RomSet = new RomSetModel { - Id = romSet.Id, - Author = romSet.Author, - Comment = romSet.Comment, - Date = romSet.Date, - Description = romSet.Description, - Filename = romSet.Filename, - Homepage = romSet.Homepage, - Name = romSet.Name, - Sha384 = romSet.Sha384, - Version = romSet.Version, - TotalMachines = romSet.Machines?.Count ?? 0, - CompleteMachines = - romSet.Machines?.Count(m => m.Files?.Count > 0 && m.Disks == null && - m.Files.All(f => f.File.IsInRepo)) ?? - 0 + romSet.Machines?.Count(m => m.Disks?.Count > 0 && m.Files == null && - m.Disks.All(f => f.Disk.IsInRepo)) ?? 0 + - romSet.Machines?.Count(m => m.Files?.Count > 0 && m.Disks?.Count > 0 && - m.Files.All(f => f.File.IsInRepo) && - m.Disks.All(f => f.Disk.IsInRepo)) ?? 0, - IncompleteMachines = - romSet.Machines?.Count(m => m.Files?.Count > 0 && m.Disks == null && - m.Files.Any(f => !f.File.IsInRepo)) ?? - 0 + romSet.Machines?.Count(m => m.Disks?.Count > 0 && m.Files == null && - m.Disks.Any(f => !f.Disk.IsInRepo)) ?? 0 + - romSet.Machines?.Count(m => m.Files?.Count > 0 && m.Disks?.Count > 0 && - (m.Files.Any(f => !f.File.IsInRepo) || - m.Disks.Any(f => !f.Disk.IsInRepo))) ?? 0, - TotalRoms = romSet.Machines?.Sum(m => m.Files?.Count ?? 0) ?? - 0 + romSet.Machines?.Sum(m => m.Disks?.Count ?? 0) ?? - 0 + romSet.Machines?.Sum(m => m.Medias?.Count ?? 0) ?? 0, - HaveRoms = romSet.Machines?.Sum(m => m.Files?.Count(f => f.File.IsInRepo) ?? 0) ?? - 0 + romSet.Machines?.Sum(m => m.Disks?.Count(f => f.Disk.IsInRepo) ?? 0) ?? - 0 + romSet.Machines?.Sum(m => m.Medias?.Count(f => f.Media.IsInRepo) ?? 0) ?? 0, - MissRoms = romSet.Machines?.Sum(m => m.Files?.Count(f => !f.File.IsInRepo) ?? 0) ?? - 0 + romSet.Machines?.Sum(m => m.Disks?.Count(f => !f.Disk.IsInRepo) ?? 0) ?? - 0 + romSet.Machines?.Sum(m => m.Medias?.Count(f => !f.Media.IsInRepo) ?? 0) ?? 0, - Category = _category + Id = romSet.Id, + Author = romSet.Author, + Comment = romSet.Comment, + Date = romSet.Date, + Description = romSet.Description, + Filename = romSet.Filename, + Homepage = romSet.Homepage, + Name = romSet.Name, + Sha384 = romSet.Sha384, + Version = romSet.Version, + TotalMachines = stats.TotalMachines, + CompleteMachines = stats.CompleteMachines, + IncompleteMachines = stats.IncompleteMachines, + TotalRoms = stats.TotalRoms, + HaveRoms = stats.HaveRoms, + MissRoms = stats.MissRoms, + Category = romSet.Category } }); } diff --git a/RomRepoMgr.Core/Workers/FileImporter.cs b/RomRepoMgr.Core/Workers/FileImporter.cs index db9a187..f9a4ed6 100644 --- a/RomRepoMgr.Core/Workers/FileImporter.cs +++ b/RomRepoMgr.Core/Workers/FileImporter.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; +using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using RomRepoMgr.Core.Aaru; using RomRepoMgr.Core.EventArgs; @@ -929,7 +930,7 @@ namespace RomRepoMgr.Core.Workers bool knownMediaWasBigger = false; if(sha256 != null) - knownMedia = _pendingMediasBySha1.TryGetValue(sha256, out dbMedia); + knownMedia = _pendingMediasBySha256.TryGetValue(sha256, out dbMedia); if(!knownMedia && sha1 != null) @@ -1183,10 +1184,44 @@ namespace RomRepoMgr.Core.Workers _ctx.Files.AddRange(_newFiles); _ctx.Disks.AddRange(_newDisks); + _ctx.Medias.AddRange(_newMedias); + _ctx.Database.ExecuteSqlRaw("DELETE FROM \"RomSetStats\""); + + _ctx.RomSetStats.AddRange(_ctx.RomSets.OrderBy(r => r.Id).Select(r => new RomSetStat + { + RomSetId = r.Id, + TotalMachines = r.Machines.Count, + CompleteMachines = + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count == 0 && + m.Files.All(f => f.File.IsInRepo)) + + r.Machines.Count(m => m.Disks.Count > 0 && m.Files.Count == 0 && + m.Disks.All(f => f.Disk.IsInRepo)) + + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count > 0 && m.Files.All(f => f.File.IsInRepo) && + m.Disks.All(f => f.Disk.IsInRepo)), + IncompleteMachines = + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count == 0 && + m.Files.Any(f => !f.File.IsInRepo)) + + r.Machines.Count(m => m.Disks.Count > 0 && m.Files.Count == 0 && + m.Disks.Any(f => !f.Disk.IsInRepo)) + + r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count > 0 && + (m.Files.Any(f => !f.File.IsInRepo) || m.Disks.Any(f => !f.Disk.IsInRepo))), + TotalRoms = r.Machines.Sum(m => m.Files.Count) + r.Machines.Sum(m => m.Disks.Count) + + r.Machines.Sum(m => m.Medias.Count), + HaveRoms = r.Machines.Sum(m => m.Files.Count(f => f.File.IsInRepo)) + + r.Machines.Sum(m => m.Disks.Count(f => f.Disk.IsInRepo)) + + r.Machines.Sum(m => m.Medias.Count(f => f.Media.IsInRepo)), + MissRoms = r.Machines.Sum(m => m.Files.Count(f => !f.File.IsInRepo)) + + r.Machines.Sum(m => m.Disks.Count(f => !f.Disk.IsInRepo)) + + r.Machines.Sum(m => m.Medias.Count(f => !f.Media.IsInRepo)) + })); + + // TODO: Refresh main view + _ctx.SaveChanges(); _newFiles.Clear(); _newDisks.Clear(); + _newMedias.Clear(); } string GetArchiveFormat(string path, out long counter) diff --git a/RomRepoMgr.Database/Context.cs b/RomRepoMgr.Database/Context.cs index f1b5c3b..eb8d055 100644 --- a/RomRepoMgr.Database/Context.cs +++ b/RomRepoMgr.Database/Context.cs @@ -41,6 +41,7 @@ namespace RomRepoMgr.Database public DbSet DisksByMachines { get; set; } public DbSet Medias { get; set; } public DbSet MediasByMachines { get; set; } + public DbSet RomSetStats { get; set; } public static Context Create(string dbPath) { @@ -160,6 +161,11 @@ namespace RomRepoMgr.Database entity.HasOne(e => e.Media).WithMany(e => e.Machines).OnDelete(DeleteBehavior.Cascade); }); + + modelBuilder.Entity(entity => + { + entity.HasOne(e => e.RomSet).WithOne(e => e.Statistics); + }); } } } \ No newline at end of file diff --git a/RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.Designer.cs b/RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.Designer.cs new file mode 100644 index 0000000..146f0aa --- /dev/null +++ b/RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.Designer.cs @@ -0,0 +1,461 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using RomRepoMgr.Database; + +namespace RomRepoMgr.Database.Migrations +{ + [DbContext(typeof(Context))] + [Migration("20200910111423_AddStatsTable")] + partial class AddStatsTable + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.7"); + + modelBuilder.Entity("RomRepoMgr.Database.Models.DbDisk", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedOn") + .HasColumnType("TEXT"); + + b.Property("IsInRepo") + .HasColumnType("INTEGER"); + + b.Property("Md5") + .HasColumnType("TEXT") + .HasMaxLength(32); + + b.Property("OriginalFileName") + .HasColumnType("TEXT"); + + b.Property("Sha1") + .HasColumnType("TEXT") + .HasMaxLength(40); + + b.Property("Size") + .HasColumnType("INTEGER"); + + b.Property("UpdatedOn") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("IsInRepo"); + + b.HasIndex("Md5"); + + b.HasIndex("Sha1"); + + b.HasIndex("Size"); + + b.ToTable("Disks"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.DbFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Crc32") + .HasColumnType("TEXT") + .HasMaxLength(8); + + b.Property("CreatedOn") + .HasColumnType("TEXT"); + + b.Property("IsInRepo") + .HasColumnType("INTEGER"); + + b.Property("Md5") + .HasColumnType("TEXT") + .HasMaxLength(32); + + b.Property("OriginalFileName") + .HasColumnType("TEXT"); + + b.Property("Sha1") + .HasColumnType("TEXT") + .HasMaxLength(40); + + b.Property("Sha256") + .HasColumnType("TEXT") + .HasMaxLength(64); + + b.Property("Sha384") + .HasColumnType("TEXT") + .HasMaxLength(96); + + b.Property("Sha512") + .HasColumnType("TEXT") + .HasMaxLength(128); + + b.Property("Size") + .HasColumnType("INTEGER"); + + b.Property("UpdatedOn") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Crc32"); + + b.HasIndex("IsInRepo"); + + b.HasIndex("Md5"); + + b.HasIndex("Sha1"); + + b.HasIndex("Sha256"); + + b.HasIndex("Sha384"); + + b.HasIndex("Sha512"); + + b.HasIndex("Size"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.DbMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedOn") + .HasColumnType("TEXT"); + + b.Property("IsInRepo") + .HasColumnType("INTEGER"); + + b.Property("Md5") + .HasColumnType("TEXT") + .HasMaxLength(32); + + b.Property("OriginalFileName") + .HasColumnType("TEXT"); + + b.Property("Sha1") + .HasColumnType("TEXT") + .HasMaxLength(40); + + b.Property("Sha256") + .HasColumnType("TEXT") + .HasMaxLength(64); + + b.Property("Size") + .HasColumnType("INTEGER"); + + b.Property("SpamSum") + .HasColumnType("TEXT"); + + b.Property("UpdatedOn") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("IsInRepo"); + + b.HasIndex("Md5"); + + b.HasIndex("Sha1"); + + b.HasIndex("Sha256"); + + b.HasIndex("Size"); + + b.HasIndex("SpamSum"); + + b.ToTable("Medias"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.DiskByMachine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DiskId") + .HasColumnType("INTEGER"); + + b.Property("MachineId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("DiskId"); + + b.HasIndex("MachineId"); + + b.HasIndex("Name"); + + b.ToTable("DisksByMachines"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.FileByMachine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("FileId") + .HasColumnType("INTEGER"); + + b.Property("FileLastModification") + .HasColumnType("TEXT"); + + b.Property("MachineId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Path") + .HasColumnType("TEXT") + .HasMaxLength(4096); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.HasIndex("MachineId"); + + b.HasIndex("Name"); + + b.ToTable("FilesByMachines"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.Machine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedOn") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RomSetId") + .HasColumnType("INTEGER"); + + b.Property("UpdatedOn") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("RomSetId"); + + b.ToTable("Machines"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.MediaByMachine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("MachineId") + .HasColumnType("INTEGER"); + + b.Property("MediaId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("MachineId"); + + b.HasIndex("MediaId"); + + b.HasIndex("Name"); + + b.ToTable("MediasByMachines"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.RomSet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Author") + .HasColumnType("TEXT"); + + b.Property("Category") + .HasColumnType("TEXT"); + + b.Property("Comment") + .HasColumnType("TEXT"); + + b.Property("CreatedOn") + .HasColumnType("TEXT"); + + b.Property("Date") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Filename") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Homepage") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Sha384") + .IsRequired() + .HasColumnType("TEXT") + .HasMaxLength(96); + + b.Property("UpdatedOn") + .HasColumnType("TEXT"); + + b.Property("Version") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Author"); + + b.HasIndex("Category"); + + b.HasIndex("Comment"); + + b.HasIndex("Date"); + + b.HasIndex("Description"); + + b.HasIndex("Filename"); + + b.HasIndex("Homepage"); + + b.HasIndex("Name"); + + b.HasIndex("Sha384"); + + b.HasIndex("Version"); + + b.ToTable("RomSets"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.RomSetStat", b => + { + b.Property("RomSetId") + .HasColumnType("INTEGER"); + + b.Property("CompleteMachines") + .HasColumnType("INTEGER"); + + b.Property("HaveRoms") + .HasColumnType("INTEGER"); + + b.Property("IncompleteMachines") + .HasColumnType("INTEGER"); + + b.Property("MissRoms") + .HasColumnType("INTEGER"); + + b.Property("TotalMachines") + .HasColumnType("INTEGER"); + + b.Property("TotalRoms") + .HasColumnType("INTEGER"); + + b.HasKey("RomSetId"); + + b.ToTable("RomSetStats"); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.DiskByMachine", b => + { + b.HasOne("RomRepoMgr.Database.Models.DbDisk", "Disk") + .WithMany("Machines") + .HasForeignKey("DiskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("RomRepoMgr.Database.Models.Machine", "Machine") + .WithMany("Disks") + .HasForeignKey("MachineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.FileByMachine", b => + { + b.HasOne("RomRepoMgr.Database.Models.DbFile", "File") + .WithMany("Machines") + .HasForeignKey("FileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("RomRepoMgr.Database.Models.Machine", "Machine") + .WithMany("Files") + .HasForeignKey("MachineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.Machine", b => + { + b.HasOne("RomRepoMgr.Database.Models.RomSet", "RomSet") + .WithMany("Machines") + .HasForeignKey("RomSetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.MediaByMachine", b => + { + b.HasOne("RomRepoMgr.Database.Models.Machine", "Machine") + .WithMany("Medias") + .HasForeignKey("MachineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("RomRepoMgr.Database.Models.DbMedia", "Media") + .WithMany("Machines") + .HasForeignKey("MediaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.RomSetStat", b => + { + b.HasOne("RomRepoMgr.Database.Models.RomSet", "RomSet") + .WithOne("Statistics") + .HasForeignKey("RomRepoMgr.Database.Models.RomSetStat", "RomSetId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.cs b/RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.cs new file mode 100644 index 0000000..2459633 --- /dev/null +++ b/RomRepoMgr.Database/Migrations/20200910111423_AddStatsTable.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace RomRepoMgr.Database.Migrations +{ + public partial class AddStatsTable : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable("RomSetStats", table => new + { + RomSetId = table.Column(nullable: false), + TotalMachines = table.Column(nullable: false), + CompleteMachines = table.Column(nullable: false), + IncompleteMachines = table.Column(nullable: false), + TotalRoms = table.Column(nullable: false), + HaveRoms = table.Column(nullable: false), + MissRoms = table.Column(nullable: false) + }, constraints: table => + { + table.PrimaryKey("PK_RomSetStats", x => x.RomSetId); + + table.ForeignKey("FK_RomSetStats_RomSets_RomSetId", x => x.RomSetId, "RomSets", "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.Sql( + "INSERT INTO \"RomSetStats\" SELECT \"r\".\"Id\" AS \"RomSetId\", CAST((\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m\"\n WHERE \"r\".\"Id\" = \"m\".\"RomSetId\") AS INTEGER) AS \"TotalMachines\", CAST((((\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m0\"\n WHERE (\"r\".\"Id\" = \"m0\".\"RomSetId\") AND ((((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f\"\n WHERE \"m0\".\"Id\" = \"f\".\"MachineId\") > 0) AND ((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d\"\n WHERE \"m0\".\"Id\" = \"d\".\"MachineId\") = 0)) AND NOT EXISTS (\n SELECT 1\n FROM \"FilesByMachines\" AS \"f0\"\n INNER JOIN \"Files\" AS \"f1\" ON \"f0\".\"FileId\" = \"f1\".\"Id\"\n WHERE (\"m0\".\"Id\" = \"f0\".\"MachineId\") AND NOT (\"f1\".\"IsInRepo\")))) + (\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m1\"\n WHERE (\"r\".\"Id\" = \"m1\".\"RomSetId\") AND ((((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d0\"\n WHERE \"m1\".\"Id\" = \"d0\".\"MachineId\") > 0) AND ((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f2\"\n WHERE \"m1\".\"Id\" = \"f2\".\"MachineId\") = 0)) AND NOT EXISTS (\n SELECT 1\n FROM \"DisksByMachines\" AS \"d1\"\n INNER JOIN \"Disks\" AS \"d2\" ON \"d1\".\"DiskId\" = \"d2\".\"Id\"\n WHERE (\"m1\".\"Id\" = \"d1\".\"MachineId\") AND NOT (\"d2\".\"IsInRepo\"))))) + (\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m2\"\n WHERE (\"r\".\"Id\" = \"m2\".\"RomSetId\") AND (((((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f3\"\n WHERE \"m2\".\"Id\" = \"f3\".\"MachineId\") > 0) AND ((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d3\"\n WHERE \"m2\".\"Id\" = \"d3\".\"MachineId\") > 0)) AND NOT EXISTS (\n SELECT 1\n FROM \"FilesByMachines\" AS \"f4\"\n INNER JOIN \"Files\" AS \"f5\" ON \"f4\".\"FileId\" = \"f5\".\"Id\"\n WHERE (\"m2\".\"Id\" = \"f4\".\"MachineId\") AND NOT (\"f5\".\"IsInRepo\"))) AND NOT EXISTS (\n SELECT 1\n FROM \"DisksByMachines\" AS \"d4\"\n INNER JOIN \"Disks\" AS \"d5\" ON \"d4\".\"DiskId\" = \"d5\".\"Id\"\n WHERE (\"m2\".\"Id\" = \"d4\".\"MachineId\") AND NOT (\"d5\".\"IsInRepo\"))))) AS INTEGER) AS \"CompleteMachines\", CAST((((\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m3\"\n WHERE (\"r\".\"Id\" = \"m3\".\"RomSetId\") AND ((((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f6\"\n WHERE \"m3\".\"Id\" = \"f6\".\"MachineId\") > 0) AND ((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d6\"\n WHERE \"m3\".\"Id\" = \"d6\".\"MachineId\") = 0)) AND EXISTS (\n SELECT 1\n FROM \"FilesByMachines\" AS \"f7\"\n INNER JOIN \"Files\" AS \"f8\" ON \"f7\".\"FileId\" = \"f8\".\"Id\"\n WHERE (\"m3\".\"Id\" = \"f7\".\"MachineId\") AND NOT (\"f8\".\"IsInRepo\")))) + (\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m4\"\n WHERE (\"r\".\"Id\" = \"m4\".\"RomSetId\") AND ((((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d7\"\n WHERE \"m4\".\"Id\" = \"d7\".\"MachineId\") > 0) AND ((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f9\"\n WHERE \"m4\".\"Id\" = \"f9\".\"MachineId\") = 0)) AND EXISTS (\n SELECT 1\n FROM \"DisksByMachines\" AS \"d8\"\n INNER JOIN \"Disks\" AS \"d9\" ON \"d8\".\"DiskId\" = \"d9\".\"Id\"\n WHERE (\"m4\".\"Id\" = \"d8\".\"MachineId\") AND NOT (\"d9\".\"IsInRepo\"))))) + (\n SELECT COUNT(*)\n FROM \"Machines\" AS \"m5\"\n WHERE (\"r\".\"Id\" = \"m5\".\"RomSetId\") AND ((((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f10\"\n WHERE \"m5\".\"Id\" = \"f10\".\"MachineId\") > 0) AND ((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d10\"\n WHERE \"m5\".\"Id\" = \"d10\".\"MachineId\") > 0)) AND (EXISTS (\n SELECT 1\n FROM \"FilesByMachines\" AS \"f11\"\n INNER JOIN \"Files\" AS \"f12\" ON \"f11\".\"FileId\" = \"f12\".\"Id\"\n WHERE (\"m5\".\"Id\" = \"f11\".\"MachineId\") AND NOT (\"f12\".\"IsInRepo\")) OR EXISTS (\n SELECT 1\n FROM \"DisksByMachines\" AS \"d11\"\n INNER JOIN \"Disks\" AS \"d12\" ON \"d11\".\"DiskId\" = \"d12\".\"Id\"\n WHERE (\"m5\".\"Id\" = \"d11\".\"MachineId\") AND NOT (\"d12\".\"IsInRepo\")))))) AS INTEGER) AS \"IncompleteMachines\", CAST((((\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f13\"\n WHERE \"m6\".\"Id\" = \"f13\".\"MachineId\"))\n FROM \"Machines\" AS \"m6\"\n WHERE \"r\".\"Id\" = \"m6\".\"RomSetId\") + (\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d13\"\n WHERE \"m7\".\"Id\" = \"d13\".\"MachineId\"))\n FROM \"Machines\" AS \"m7\"\n WHERE \"r\".\"Id\" = \"m7\".\"RomSetId\")) + (\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"MediasByMachines\" AS \"m8\"\n WHERE \"m9\".\"Id\" = \"m8\".\"MachineId\"))\n FROM \"Machines\" AS \"m9\"\n WHERE \"r\".\"Id\" = \"m9\".\"RomSetId\")) AS INTEGER) AS \"TotalRoms\", CAST((((\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f14\"\n INNER JOIN \"Files\" AS \"f15\" ON \"f14\".\"FileId\" = \"f15\".\"Id\"\n WHERE (\"m10\".\"Id\" = \"f14\".\"MachineId\") AND \"f15\".\"IsInRepo\"))\n FROM \"Machines\" AS \"m10\"\n WHERE \"r\".\"Id\" = \"m10\".\"RomSetId\") + (\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d14\"\n INNER JOIN \"Disks\" AS \"d15\" ON \"d14\".\"DiskId\" = \"d15\".\"Id\"\n WHERE (\"m11\".\"Id\" = \"d14\".\"MachineId\") AND \"d15\".\"IsInRepo\"))\n FROM \"Machines\" AS \"m11\"\n WHERE \"r\".\"Id\" = \"m11\".\"RomSetId\")) + (\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"MediasByMachines\" AS \"m12\"\n INNER JOIN \"Medias\" AS \"m13\" ON \"m12\".\"MediaId\" = \"m13\".\"Id\"\n WHERE (\"m14\".\"Id\" = \"m12\".\"MachineId\") AND \"m13\".\"IsInRepo\"))\n FROM \"Machines\" AS \"m14\"\n WHERE \"r\".\"Id\" = \"m14\".\"RomSetId\")) AS INTEGER) AS \"HaveRoms\", CAST((((\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"FilesByMachines\" AS \"f16\"\n INNER JOIN \"Files\" AS \"f17\" ON \"f16\".\"FileId\" = \"f17\".\"Id\"\n WHERE (\"m15\".\"Id\" = \"f16\".\"MachineId\") AND NOT (\"f17\".\"IsInRepo\")))\n FROM \"Machines\" AS \"m15\"\n WHERE \"r\".\"Id\" = \"m15\".\"RomSetId\") + (\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"DisksByMachines\" AS \"d16\"\n INNER JOIN \"Disks\" AS \"d17\" ON \"d16\".\"DiskId\" = \"d17\".\"Id\"\n WHERE (\"m16\".\"Id\" = \"d16\".\"MachineId\") AND NOT (\"d17\".\"IsInRepo\")))\n FROM \"Machines\" AS \"m16\"\n WHERE \"r\".\"Id\" = \"m16\".\"RomSetId\")) + (\n SELECT SUM((\n SELECT COUNT(*)\n FROM \"MediasByMachines\" AS \"m17\"\n INNER JOIN \"Medias\" AS \"m18\" ON \"m17\".\"MediaId\" = \"m18\".\"Id\"\n WHERE (\"m19\".\"Id\" = \"m17\".\"MachineId\") AND NOT (\"m18\".\"IsInRepo\")))\n FROM \"Machines\" AS \"m19\"\n WHERE \"r\".\"Id\" = \"m19\".\"RomSetId\")) AS INTEGER) AS \"MissRoms\"\n FROM \"RomSets\" AS \"r\" WHERE \"TotalMachines\" > 0\n ORDER BY \"r\".\"Id\""); + } + + protected override void Down(MigrationBuilder migrationBuilder) => migrationBuilder.DropTable("RomSetStats"); + } +} \ No newline at end of file diff --git a/RomRepoMgr.Database/Migrations/ContextModelSnapshot.cs b/RomRepoMgr.Database/Migrations/ContextModelSnapshot.cs index 61f974f..474f8c1 100644 --- a/RomRepoMgr.Database/Migrations/ContextModelSnapshot.cs +++ b/RomRepoMgr.Database/Migrations/ContextModelSnapshot.cs @@ -272,6 +272,27 @@ namespace RomRepoMgr.Database.Migrations b.ToTable("RomSets"); }); + modelBuilder.Entity("RomRepoMgr.Database.Models.RomSetStat", b => + { + b.Property("RomSetId").HasColumnType("INTEGER"); + + b.Property("CompleteMachines").HasColumnType("INTEGER"); + + b.Property("HaveRoms").HasColumnType("INTEGER"); + + b.Property("IncompleteMachines").HasColumnType("INTEGER"); + + b.Property("MissRoms").HasColumnType("INTEGER"); + + b.Property("TotalMachines").HasColumnType("INTEGER"); + + b.Property("TotalRoms").HasColumnType("INTEGER"); + + b.HasKey("RomSetId"); + + b.ToTable("RomSetStats"); + }); + modelBuilder.Entity("RomRepoMgr.Database.Models.DiskByMachine", b => { b.HasOne("RomRepoMgr.Database.Models.DbDisk", "Disk").WithMany("Machines").HasForeignKey("DiskId"). @@ -304,6 +325,13 @@ namespace RomRepoMgr.Database.Migrations b.HasOne("RomRepoMgr.Database.Models.DbMedia", "Media").WithMany("Machines").HasForeignKey("MediaId"). OnDelete(DeleteBehavior.Cascade).IsRequired(); }); + + modelBuilder.Entity("RomRepoMgr.Database.Models.RomSetStat", b => + { + b.HasOne("RomRepoMgr.Database.Models.RomSet", "RomSet").WithOne("Statistics"). + HasForeignKey("RomRepoMgr.Database.Models.RomSetStat", "RomSetId").OnDelete(DeleteBehavior.Cascade). + IsRequired(); + }); #pragma warning restore 612, 618 } } diff --git a/RomRepoMgr.Database/Models/RomSet.cs b/RomRepoMgr.Database/Models/RomSet.cs index c58cae8..dbb26c8 100644 --- a/RomRepoMgr.Database/Models/RomSet.cs +++ b/RomRepoMgr.Database/Models/RomSet.cs @@ -40,8 +40,9 @@ namespace RomRepoMgr.Database.Models [Required] public string Filename { get; set; } [Required, StringLength(96, MinimumLength = 96)] - public string Sha384 { get; set; } - public string Category { get; set; } + public string Sha384 { get; set; } + public string Category { get; set; } + public virtual RomSetStat Statistics { get; set; } public virtual ICollection Machines { get; set; } } diff --git a/RomRepoMgr.Database/Models/RomSetStat.cs b/RomRepoMgr.Database/Models/RomSetStat.cs new file mode 100644 index 0000000..2b0bd82 --- /dev/null +++ b/RomRepoMgr.Database/Models/RomSetStat.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace RomRepoMgr.Database.Models +{ + public class RomSetStat + { + public long TotalMachines { get; set; } + public long CompleteMachines { get; set; } + public long IncompleteMachines { get; set; } + public long TotalRoms { get; set; } + public long HaveRoms { get; set; } + public long MissRoms { get; set; } + public virtual RomSet RomSet { get; set; } + [Key] + public long RomSetId { get; set; } + } +} \ No newline at end of file diff --git a/RomRepoMgr/ViewModels/SplashWindowViewModel.cs b/RomRepoMgr/ViewModels/SplashWindowViewModel.cs index e5cb4b4..4bc7e88 100644 --- a/RomRepoMgr/ViewModels/SplashWindowViewModel.cs +++ b/RomRepoMgr/ViewModels/SplashWindowViewModel.cs @@ -321,43 +321,23 @@ namespace RomRepoMgr.ViewModels ThenBy(r => r.Description).ThenBy(r => r.Comment).ThenBy(r => r.Filename). Select(r => new RomSetModel { - Id = r.Id, - Author = r.Author, - Comment = r.Comment, - Date = r.Date, - Description = r.Description, - Filename = r.Filename, - Homepage = r.Homepage, - Name = r.Name, - Sha384 = r.Sha384, - Version = r.Version, - TotalMachines = r.Machines.Count, - CompleteMachines = - r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count == 0 && - m.Files.All(f => f.File.IsInRepo)) + - r.Machines.Count(m => m.Disks.Count > 0 && m.Files.Count == 0 && - m.Disks.All(f => f.Disk.IsInRepo)) + - r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count > 0 && - m.Files.All(f => f.File.IsInRepo) && - m.Disks.All(f => f.Disk.IsInRepo)), - IncompleteMachines = - r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count == 0 && - m.Files.Any(f => !f.File.IsInRepo)) + - r.Machines.Count(m => m.Disks.Count > 0 && m.Files.Count == 0 && - m.Disks.Any(f => !f.Disk.IsInRepo)) + - r.Machines.Count(m => m.Files.Count > 0 && m.Disks.Count > 0 && - (m.Files.Any(f => !f.File.IsInRepo) || - m.Disks.Any(f => !f.Disk.IsInRepo))), - TotalRoms = r.Machines.Sum(m => m.Files.Count) + - r.Machines.Sum(m => m.Disks.Count) + - r.Machines.Sum(m => m.Medias.Count), - HaveRoms = r.Machines.Sum(m => m.Files.Count(f => f.File.IsInRepo)) + - r.Machines.Sum(m => m.Disks.Count(f => f.Disk.IsInRepo)) + - r.Machines.Sum(m => m.Medias.Count(f => f.Media.IsInRepo)), - MissRoms = r.Machines.Sum(m => m.Files.Count(f => !f.File.IsInRepo)) + - r.Machines.Sum(m => m.Disks.Count(f => !f.Disk.IsInRepo)) + - r.Machines.Sum(m => m.Medias.Count(f => !f.Media.IsInRepo)), - Category = r.Category + Id = r.Id, + Author = r.Author, + Comment = r.Comment, + Date = r.Date, + Description = r.Description, + Filename = r.Filename, + Homepage = r.Homepage, + Name = r.Name, + Sha384 = r.Sha384, + Version = r.Version, + TotalMachines = r.Statistics.TotalMachines, + CompleteMachines = r.Statistics.CompleteMachines, + IncompleteMachines = r.Statistics.IncompleteMachines, + TotalRoms = r.Statistics.TotalRoms, + HaveRoms = r.Statistics.HaveRoms, + MissRoms = r.Statistics.MissRoms, + Category = r.Category }).ToList() });