diff --git a/src/MysqlMigrations/Migrations/20240721150411_ArcadeReplayDsPlayers.cs b/src/MysqlMigrations/Migrations/20240721150411_ArcadeReplayDsPlayers.cs index afc942d8..30791ad4 100644 --- a/src/MysqlMigrations/Migrations/20240721150411_ArcadeReplayDsPlayers.cs +++ b/src/MysqlMigrations/Migrations/20240721150411_ArcadeReplayDsPlayers.cs @@ -11,9 +11,9 @@ public partial class ArcadeReplayDsPlayers : Migration /// protected override void Up(MigrationBuilder migrationBuilder) { - //migrationBuilder.DropForeignKey( - // name: "FK_ArcadePlayerRatings_ArcadePlayers_ArcadePlayerId", - // table: "ArcadePlayerRatings"); + migrationBuilder.DropForeignKey( + name: "FK_ArcadePlayerRatings_ArcadePlayers_ArcadePlayerId", + table: "ArcadePlayerRatings"); migrationBuilder.DropTable( name: "ArcadeReplayPlayerRatings"); diff --git a/src/MysqlMigrations/Migrations/20240722064121_RemoveArcadePlayers.Designer.cs b/src/MysqlMigrations/Migrations/20240722064121_RemoveArcadePlayers.Designer.cs new file mode 100644 index 00000000..62ba31cd --- /dev/null +++ b/src/MysqlMigrations/Migrations/20240722064121_RemoveArcadePlayers.Designer.cs @@ -0,0 +1,2365 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using dsstats.db8; + +#nullable disable + +namespace MysqlMigrations.Migrations +{ + [DbContext(typeof(ReplayContext))] + [Migration("20240722064121_RemoveArcadePlayers")] + partial class RemoveArcadePlayers + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("DsAbilityDsUnit", b => + { + b.Property("AbilitiesDsAbilityId") + .HasColumnType("int"); + + b.Property("DsUnitsDsUnitId") + .HasColumnType("int"); + + b.HasKey("AbilitiesDsAbilityId", "DsUnitsDsUnitId"); + + b.HasIndex("DsUnitsDsUnitId"); + + b.ToTable("DsAbilityDsUnit"); + }); + + modelBuilder.Entity("ReplayUploader", b => + { + b.Property("ReplaysReplayId") + .HasColumnType("int"); + + b.Property("UploadersUploaderId") + .HasColumnType("int"); + + b.HasKey("ReplaysReplayId", "UploadersUploaderId"); + + b.HasIndex("UploadersUploaderId"); + + b.ToTable("UploaderReplays", (string)null); + }); + + modelBuilder.Entity("dsstats.db8.ArcadePlayerRating", b => + { + b.Property("ArcadePlayerRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadePlayerRatingId")); + + b.Property("Confidence") + .HasColumnType("double"); + + b.Property("Consistency") + .HasColumnType("double"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("IsUploader") + .HasColumnType("tinyint(1)"); + + b.Property("Main") + .HasColumnType("int"); + + b.Property("MainCount") + .HasColumnType("int"); + + b.Property("Mvp") + .HasColumnType("int"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("Pos") + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("double"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.Property("TeamGames") + .HasColumnType("int"); + + b.Property("Wins") + .HasColumnType("int"); + + b.HasKey("ArcadePlayerRatingId"); + + b.HasIndex("PlayerId"); + + b.HasIndex("RatingType"); + + b.ToTable("ArcadePlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadePlayerRatingChange", b => + { + b.Property("ArcadePlayerRatingChangeId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadePlayerRatingChangeId")); + + b.Property("ArcadePlayerRatingId") + .HasColumnType("int"); + + b.Property("Change10d") + .HasColumnType("float"); + + b.Property("Change24h") + .HasColumnType("float"); + + b.Property("Change30d") + .HasColumnType("float"); + + b.HasKey("ArcadePlayerRatingChangeId"); + + b.HasIndex("ArcadePlayerRatingId") + .IsUnique(); + + b.ToTable("ArcadePlayerRatingChanges"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplay", b => + { + b.Property("ArcadeReplayId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayId")); + + b.Property("BnetBucketId") + .HasColumnType("bigint"); + + b.Property("BnetRecordId") + .HasColumnType("bigint"); + + b.Property("CreatedAt") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("GameMode") + .HasColumnType("int"); + + b.Property("Imported") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("PlayerCount") + .HasColumnType("int"); + + b.Property("RegionId") + .HasColumnType("int"); + + b.Property("ReplayHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("TournamentEdition") + .HasColumnType("tinyint(1)"); + + b.Property("WinnerTeam") + .HasColumnType("int"); + + b.HasKey("ArcadeReplayId"); + + b.HasIndex("ReplayHash"); + + b.HasIndex("GameMode", "CreatedAt"); + + b.HasIndex("RegionId", "BnetBucketId", "BnetRecordId") + .IsUnique(); + + b.HasIndex("RegionId", "GameMode", "CreatedAt"); + + b.ToTable("ArcadeReplays"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayer", b => + { + b.Property("ArcadeReplayDsPlayerId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayDsPlayerId")); + + b.Property("ArcadeReplayId") + .HasColumnType("int"); + + b.Property("Discriminator") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("PlayerResult") + .HasColumnType("int"); + + b.Property("SlotNumber") + .HasColumnType("int"); + + b.Property("Team") + .HasColumnType("int"); + + b.HasKey("ArcadeReplayDsPlayerId"); + + b.HasIndex("ArcadeReplayId"); + + b.HasIndex("PlayerId"); + + b.ToTable("ArcadeReplayDsPlayers"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayerRating", b => + { + b.Property("ArcadeReplayDsPlayerRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayDsPlayerRatingId")); + + b.Property("ArcadeReplayDsPlayerId") + .HasColumnType("int"); + + b.Property("ArcadeReplayRatingId") + .HasColumnType("int"); + + b.Property("Confidence") + .HasColumnType("float"); + + b.Property("Consistency") + .HasColumnType("float"); + + b.Property("GamePos") + .HasColumnType("int"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("float"); + + b.Property("RatingChange") + .HasColumnType("float"); + + b.HasKey("ArcadeReplayDsPlayerRatingId"); + + b.HasIndex("ArcadeReplayDsPlayerId") + .IsUnique(); + + b.HasIndex("ArcadeReplayRatingId"); + + b.ToTable("ArcadeReplayDsPlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayRating", b => + { + b.Property("ArcadeReplayRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayRatingId")); + + b.Property("ArcadeReplayId") + .HasColumnType("int"); + + b.Property("AvgRating") + .HasColumnType("int"); + + b.Property("ExpectationToWin") + .HasColumnType("float"); + + b.Property("LeaverType") + .HasColumnType("int"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.HasKey("ArcadeReplayRatingId"); + + b.HasIndex("ArcadeReplayId") + .IsUnique(); + + b.ToTable("ArcadeReplayRatings"); + }); + + modelBuilder.Entity("dsstats.db8.BattleNetInfo", b => + { + b.Property("BattleNetInfoId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("BattleNetInfoId")); + + b.Property("BattleNetId") + .HasColumnType("int"); + + b.Property("UploaderId") + .HasColumnType("int"); + + b.HasKey("BattleNetInfoId"); + + b.HasIndex("UploaderId"); + + b.ToTable("BattleNetInfos"); + }); + + modelBuilder.Entity("dsstats.db8.BonusDamage", b => + { + b.Property("BonusDamageId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("BonusDamageId")); + + b.Property("Damage") + .HasColumnType("int"); + + b.Property("DsWeaponId") + .HasColumnType("int"); + + b.Property("PerUpgrade") + .HasColumnType("int"); + + b.Property("UnitType") + .HasColumnType("int"); + + b.HasKey("BonusDamageId"); + + b.HasIndex("DsWeaponId"); + + b.HasIndex("UnitType"); + + b.ToTable("BonusDamages"); + }); + + modelBuilder.Entity("dsstats.db8.ComboPlayerRating", b => + { + b.Property("ComboPlayerRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ComboPlayerRatingId")); + + b.Property("Confidence") + .HasColumnType("double"); + + b.Property("Consistency") + .HasColumnType("double"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("Pos") + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("double"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.Property("Wins") + .HasColumnType("int"); + + b.HasKey("ComboPlayerRatingId"); + + b.HasIndex("PlayerId"); + + b.HasIndex("RatingType"); + + b.ToTable("ComboPlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.ComboReplayPlayerRating", b => + { + b.Property("ComboReplayPlayerRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ComboReplayPlayerRatingId")); + + b.Property("Change") + .HasPrecision(5, 2) + .HasColumnType("double"); + + b.Property("Confidence") + .HasPrecision(5, 2) + .HasColumnType("double"); + + b.Property("Consistency") + .HasPrecision(5, 2) + .HasColumnType("double"); + + b.Property("GamePos") + .HasColumnType("int"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("int"); + + b.Property("ReplayPlayerId") + .HasColumnType("int"); + + b.HasKey("ComboReplayPlayerRatingId"); + + b.HasIndex("ReplayPlayerId") + .IsUnique(); + + b.ToTable("ComboReplayPlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.ComboReplayRating", b => + { + b.Property("ComboReplayRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ComboReplayRatingId")); + + b.Property("AvgRating") + .HasColumnType("int"); + + b.Property("ExpectationToWin") + .HasPrecision(5, 2) + .HasColumnType("double"); + + b.Property("IsPreRating") + .HasColumnType("tinyint(1)"); + + b.Property("LeaverType") + .HasColumnType("int"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.Property("ReplayId") + .HasColumnType("int"); + + b.HasKey("ComboReplayRatingId"); + + b.HasIndex("RatingType"); + + b.HasIndex("ReplayId") + .IsUnique(); + + b.ToTable("ComboReplayRatings"); + }); + + modelBuilder.Entity("dsstats.db8.CommanderMmr", b => + { + b.Property("CommanderMmrId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("CommanderMmrId")); + + b.Property("AntiSynergyMmr") + .HasColumnType("double"); + + b.Property("OppRace") + .HasColumnType("int"); + + b.Property("Race") + .HasColumnType("int"); + + b.Property("SynergyMmr") + .HasColumnType("double"); + + b.HasKey("CommanderMmrId"); + + b.HasIndex("Race", "OppRace"); + + b.ToTable("CommanderMmrs"); + }); + + modelBuilder.Entity("dsstats.db8.DsAbility", b => + { + b.Property("DsAbilityId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsAbilityId")); + + b.Property("AbilityTarget") + .HasColumnType("int"); + + b.Property("AoeRadius") + .HasColumnType("float"); + + b.Property("CastRange") + .HasColumnType("int"); + + b.Property("Commander") + .HasColumnType("int"); + + b.Property("Cooldown") + .HasColumnType("int"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(310) + .HasColumnType("varchar(310)"); + + b.Property("EnergyCost") + .HasColumnType("float"); + + b.Property("GlobalTimer") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Requirements") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("DsAbilityId"); + + b.HasIndex("Name"); + + b.ToTable("DsAbilities"); + }); + + modelBuilder.Entity("dsstats.db8.DsPickBan", b => + { + b.Property("DsPickBanId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsPickBanId")); + + b.Property("Bans") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PickBanMode") + .HasColumnType("int"); + + b.Property("Picks") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Time") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.HasKey("DsPickBanId"); + + b.ToTable("DsPickBans"); + }); + + modelBuilder.Entity("dsstats.db8.DsUnit", b => + { + b.Property("DsUnitId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsUnitId")); + + b.Property("Armor") + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("Commander") + .HasColumnType("int"); + + b.Property("Cost") + .HasColumnType("int"); + + b.Property("EnergyRegen") + .HasColumnType("float"); + + b.Property("HealthRegen") + .HasColumnType("float"); + + b.Property("Life") + .HasColumnType("int"); + + b.Property("MaxEnergy") + .HasColumnType("int"); + + b.Property("MovementType") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ShieldArmor") + .HasColumnType("int"); + + b.Property("Shields") + .HasColumnType("int"); + + b.Property("Size") + .HasColumnType("int"); + + b.Property("Speed") + .HasColumnType("float"); + + b.Property("StartingEnergy") + .HasColumnType("int"); + + b.Property("Tier") + .HasColumnType("int"); + + b.Property("UnitId") + .HasColumnType("int"); + + b.Property("UnitType") + .HasColumnType("int"); + + b.HasKey("DsUnitId"); + + b.HasIndex("Commander"); + + b.HasIndex("Name"); + + b.HasIndex("Name", "Commander"); + + b.ToTable("DsUnits"); + }); + + modelBuilder.Entity("dsstats.db8.DsUpdate", b => + { + b.Property("DsUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsUpdateId")); + + b.Property("Change") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Commander") + .HasColumnType("int"); + + b.Property("DiscordId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Time") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.HasKey("DsUpdateId"); + + b.HasIndex("Time"); + + b.ToTable("DsUpdates"); + }); + + modelBuilder.Entity("dsstats.db8.DsUpgrade", b => + { + b.Property("DsUpgradeId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsUpgradeId")); + + b.Property("Commander") + .HasColumnType("int"); + + b.Property("Cost") + .HasColumnType("int"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.Property("DsUnitId") + .HasColumnType("int"); + + b.Property("RequiredTier") + .HasColumnType("int"); + + b.Property("Upgrade") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("DsUpgradeId"); + + b.HasIndex("DsUnitId"); + + b.HasIndex("Upgrade"); + + b.ToTable("DsUpgrades"); + }); + + modelBuilder.Entity("dsstats.db8.DsWeapon", b => + { + b.Property("DsWeaponId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsWeaponId")); + + b.Property("AttackSpeed") + .HasColumnType("float"); + + b.Property("Attacks") + .HasColumnType("int"); + + b.Property("CanTarget") + .HasColumnType("int"); + + b.Property("Damage") + .HasColumnType("int"); + + b.Property("DamagePerUpgrade") + .HasColumnType("int"); + + b.Property("DsUnitId") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Range") + .HasColumnType("float"); + + b.HasKey("DsWeaponId"); + + b.HasIndex("DsUnitId"); + + b.ToTable("DsWeapons"); + }); + + modelBuilder.Entity("dsstats.db8.Event", b => + { + b.Property("EventId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("EventId")); + + b.Property("EventGuid") + .HasColumnType("char(36)"); + + b.Property("EventStart") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("GameMode") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("WinnerTeam") + .HasColumnType("longtext"); + + b.HasKey("EventId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("dsstats.db8.Faq", b => + { + b.Property("FaqId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("FaqId")); + + b.Property("Answer") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("CreatedAt") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("CreatedBy") + .HasMaxLength(20) + .HasColumnType("varchar(20)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Question") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("UpdatedAt") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Upvotes") + .HasColumnType("int"); + + b.HasKey("FaqId"); + + b.HasIndex("Question"); + + b.ToTable("Faqs"); + }); + + modelBuilder.Entity("dsstats.db8.FaqVote", b => + { + b.Property("FaqVoteId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("FaqVoteId")); + + b.Property("FaqId") + .HasColumnType("int"); + + b.HasKey("FaqVoteId"); + + b.ToTable("FaqVotes"); + }); + + modelBuilder.Entity("dsstats.db8.FunStatsMemory", b => + { + b.Property("FunStatsMemoryId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("FunStatsMemoryId")); + + b.Property("AvgGameDuration") + .HasColumnType("int"); + + b.Property("Created") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("FirstReplay") + .HasColumnType("longtext"); + + b.Property("GreatestArmyReplay") + .HasColumnType("longtext"); + + b.Property("GreatestComebackReplay") + .HasColumnType("longtext"); + + b.Property("MostCompetitiveReplay") + .HasColumnType("longtext"); + + b.Property("MostUpgradesReplay") + .HasColumnType("longtext"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.Property("TimePeriod") + .HasColumnType("int"); + + b.Property("TotalTimePlayed") + .HasColumnType("bigint"); + + b.Property("UnitCountLeast") + .HasColumnType("int"); + + b.Property("UnitCountMost") + .HasColumnType("int"); + + b.Property("UnitNameLeast") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UnitNameMost") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("FunStatsMemoryId"); + + b.ToTable("FunStatMemories"); + }); + + modelBuilder.Entity("dsstats.db8.GroupByHelper", b => + { + b.Property("Count") + .HasColumnType("int"); + + b.Property("Group") + .HasColumnType("tinyint(1)") + .HasColumnName("Name"); + + b.ToTable((string)null); + + b.ToView("GroupByHelper", (string)null); + }); + + modelBuilder.Entity("dsstats.db8.IhSession", b => + { + b.Property("IhSessionId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("IhSessionId")); + + b.Property("Closed") + .HasColumnType("tinyint(1)"); + + b.Property("Created") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("GroupId") + .HasColumnType("char(36)"); + + b.Property("GroupState") + .HasColumnType("longtext"); + + b.Property("GroupStateV2") + .HasColumnType("longtext"); + + b.Property("Players") + .HasColumnType("int"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.HasKey("IhSessionId"); + + b.HasIndex("GroupId") + .IsUnique(); + + b.ToTable("IhSessions"); + }); + + modelBuilder.Entity("dsstats.db8.IhSessionPlayer", b => + { + b.Property("IhSessionPlayerId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("IhSessionPlayerId")); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("IhSessionId") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Obs") + .HasColumnType("int"); + + b.Property("Performance") + .HasColumnType("int"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("RatingEnd") + .HasColumnType("int"); + + b.Property("RatingStart") + .HasColumnType("int"); + + b.Property("Wins") + .HasColumnType("int"); + + b.HasKey("IhSessionPlayerId"); + + b.HasIndex("IhSessionId"); + + b.HasIndex("PlayerId"); + + b.ToTable("IhSessionPlayers"); + }); + + modelBuilder.Entity("dsstats.db8.MaterializedArcadeReplay", b => + { + b.Property("MaterializedArcadeReplayId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("MaterializedArcadeReplayId")); + + b.Property("ArcadeReplayId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("GameMode") + .HasColumnType("int"); + + b.Property("WinnerTeam") + .HasColumnType("int"); + + b.HasKey("MaterializedArcadeReplayId"); + + b.HasIndex("CreatedAt"); + + b.ToTable("MaterializedArcadeReplays"); + }); + + modelBuilder.Entity("dsstats.db8.NoUploadResult", b => + { + b.Property("NoUploadResultId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("NoUploadResultId")); + + b.Property("Created") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("LatestNoUpload") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("LatestReplay") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("LatestUpload") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("NoUploadDefeats") + .HasColumnType("int"); + + b.Property("NoUploadTotal") + .HasColumnType("int"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("TotalReplays") + .HasColumnType("int"); + + b.HasKey("NoUploadResultId"); + + b.HasIndex("PlayerId"); + + b.ToTable("NoUploadResults"); + }); + + modelBuilder.Entity("dsstats.db8.Player", b => + { + b.Property("PlayerId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PlayerId")); + + b.Property("ArcadeDefeatsSinceLastUpload") + .HasColumnType("int"); + + b.Property("DisconnectCount") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("NotUploadCount") + .HasColumnType("int"); + + b.Property("RageQuitCount") + .HasColumnType("int"); + + b.Property("RealmId") + .HasColumnType("int"); + + b.Property("RegionId") + .HasColumnType("int"); + + b.Property("ToonId") + .HasColumnType("int"); + + b.Property("UploaderId") + .HasColumnType("int"); + + b.HasKey("PlayerId"); + + b.HasIndex("UploaderId"); + + b.HasIndex("RegionId", "RealmId", "ToonId") + .IsUnique(); + + b.ToTable("Players"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerRating", b => + { + b.Property("PlayerRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PlayerRatingId")); + + b.Property("ArcadeDefeatsSinceLastUpload") + .HasColumnType("int"); + + b.Property("Confidence") + .HasColumnType("double"); + + b.Property("Consistency") + .HasColumnType("double"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("IsUploader") + .HasColumnType("tinyint(1)"); + + b.Property("Main") + .HasColumnType("int"); + + b.Property("MainCount") + .HasColumnType("int"); + + b.Property("Mvp") + .HasColumnType("int"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("Pos") + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("double"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.Property("TeamGames") + .HasColumnType("int"); + + b.Property("Wins") + .HasColumnType("int"); + + b.HasKey("PlayerRatingId"); + + b.HasIndex("PlayerId"); + + b.HasIndex("RatingType"); + + b.ToTable("PlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerRatingChange", b => + { + b.Property("PlayerRatingChangeId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PlayerRatingChangeId")); + + b.Property("Change10d") + .HasColumnType("float"); + + b.Property("Change24h") + .HasColumnType("float"); + + b.Property("Change30d") + .HasColumnType("float"); + + b.Property("PlayerRatingId") + .HasColumnType("int"); + + b.HasKey("PlayerRatingChangeId"); + + b.HasIndex("PlayerRatingId") + .IsUnique(); + + b.ToTable("PlayerRatingChanges"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerUpgrade", b => + { + b.Property("PlayerUpgradeId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PlayerUpgradeId")); + + b.Property("Gameloop") + .HasColumnType("int"); + + b.Property("ReplayPlayerId") + .HasColumnType("int"); + + b.Property("UpgradeId") + .HasColumnType("int"); + + b.HasKey("PlayerUpgradeId"); + + b.HasIndex("ReplayPlayerId"); + + b.HasIndex("UpgradeId"); + + b.ToTable("PlayerUpgrades"); + }); + + modelBuilder.Entity("dsstats.db8.RepPlayerRating", b => + { + b.Property("RepPlayerRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("RepPlayerRatingId")); + + b.Property("Confidence") + .HasColumnType("float"); + + b.Property("Consistency") + .HasColumnType("float"); + + b.Property("GamePos") + .HasColumnType("int"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("float"); + + b.Property("RatingChange") + .HasColumnType("float"); + + b.Property("ReplayPlayerId") + .HasColumnType("int"); + + b.Property("ReplayRatingInfoId") + .HasColumnType("int"); + + b.HasKey("RepPlayerRatingId"); + + b.HasIndex("ReplayPlayerId") + .IsUnique(); + + b.HasIndex("ReplayRatingInfoId"); + + b.ToTable("RepPlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.Replay", b => + { + b.Property("ReplayId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayId")); + + b.Property("Bunker") + .HasColumnType("int"); + + b.Property("Cannon") + .HasColumnType("int"); + + b.Property("CommandersTeam1") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommandersTeam2") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DefaultFilter") + .HasColumnType("tinyint(1)"); + + b.Property("Downloads") + .HasColumnType("int"); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("varchar(500)"); + + b.Property("GameMode") + .HasColumnType("int"); + + b.Property("GameTime") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Imported") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Maxkillsum") + .HasColumnType("int"); + + b.Property("Maxleaver") + .HasColumnType("int"); + + b.Property("Middle") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("varchar(4000)"); + + b.Property("Minarmy") + .HasColumnType("int"); + + b.Property("Minincome") + .HasColumnType("int"); + + b.Property("Minkillsum") + .HasColumnType("int"); + + b.Property("Objective") + .HasColumnType("int"); + + b.Property("PlayerPos") + .HasColumnType("int"); + + b.Property("PlayerResult") + .HasColumnType("int"); + + b.Property("Playercount") + .HasColumnType("tinyint unsigned"); + + b.Property("ReplayEventId") + .HasColumnType("int"); + + b.Property("ReplayHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("char(64)") + .IsFixedLength(); + + b.Property("ResultCorrected") + .HasColumnType("tinyint(1)"); + + b.Property("TournamentEdition") + .HasColumnType("tinyint(1)"); + + b.Property("Uploaded") + .HasColumnType("tinyint(1)"); + + b.Property("Views") + .HasColumnType("int"); + + b.Property("WinnerTeam") + .HasColumnType("int"); + + b.HasKey("ReplayId"); + + b.HasIndex("FileName"); + + b.HasIndex("GameTime"); + + b.HasIndex("Imported"); + + b.HasIndex("Maxkillsum"); + + b.HasIndex("ReplayEventId"); + + b.HasIndex("ReplayHash") + .IsUnique(); + + b.HasIndex("GameTime", "GameMode"); + + b.HasIndex("GameTime", "GameMode", "DefaultFilter"); + + b.HasIndex("GameTime", "GameMode", "Maxleaver"); + + b.HasIndex("GameTime", "GameMode", "WinnerTeam"); + + b.ToTable("Replays"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayArcadeMatch", b => + { + b.Property("ReplayArcadeMatchId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayArcadeMatchId")); + + b.Property("ArcadeReplayId") + .HasColumnType("int"); + + b.Property("MatchTime") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("ReplayId") + .HasColumnType("int"); + + b.HasKey("ReplayArcadeMatchId"); + + b.HasIndex("ArcadeReplayId") + .IsUnique(); + + b.HasIndex("MatchTime"); + + b.HasIndex("ReplayId") + .IsUnique(); + + b.ToTable("ReplayArcadeMatches"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayDownloadCount", b => + { + b.Property("ReplayDownloadCountId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayDownloadCountId")); + + b.Property("ReplayHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.HasKey("ReplayDownloadCountId"); + + b.ToTable("ReplayDownloadCounts"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayEvent", b => + { + b.Property("ReplayEventId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayEventId")); + + b.Property("Ban1") + .HasColumnType("int"); + + b.Property("Ban2") + .HasColumnType("int"); + + b.Property("Ban3") + .HasColumnType("int"); + + b.Property("Ban4") + .HasColumnType("int"); + + b.Property("Ban5") + .HasColumnType("int"); + + b.Property("EventId") + .HasColumnType("int"); + + b.Property("Round") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("RunnerTeam") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("WinnerTeam") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("ReplayEventId"); + + b.HasIndex("EventId"); + + b.ToTable("ReplayEvents"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayPlayer", b => + { + b.Property("ReplayPlayerId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayPlayerId")); + + b.Property("APM") + .HasColumnType("int"); + + b.Property("Army") + .HasColumnType("int"); + + b.Property("Clan") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("DidNotUpload") + .HasColumnType("tinyint(1)"); + + b.Property("Downloads") + .HasColumnType("int"); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("GamePos") + .HasColumnType("int"); + + b.Property("Income") + .HasColumnType("int"); + + b.Property("IsLeaver") + .HasColumnType("tinyint(1)"); + + b.Property("IsUploader") + .HasColumnType("tinyint(1)"); + + b.Property("Kills") + .HasColumnType("int"); + + b.Property("LastSpawnHash") + .HasMaxLength(64) + .HasColumnType("char(64)") + .IsFixedLength(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("OppRace") + .HasColumnType("int"); + + b.Property("PlayerId") + .HasColumnType("int"); + + b.Property("PlayerResult") + .HasColumnType("int"); + + b.Property("Race") + .HasColumnType("int"); + + b.Property("Refineries") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.Property("ReplayId") + .HasColumnType("int"); + + b.Property("Team") + .HasColumnType("int"); + + b.Property("TierUpgrades") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.Property("UpgradeId") + .HasColumnType("int"); + + b.Property("UpgradesSpent") + .HasColumnType("int"); + + b.Property("Views") + .HasColumnType("int"); + + b.HasKey("ReplayPlayerId"); + + b.HasIndex("Kills"); + + b.HasIndex("LastSpawnHash") + .IsUnique(); + + b.HasIndex("Name"); + + b.HasIndex("PlayerId"); + + b.HasIndex("Race"); + + b.HasIndex("ReplayId"); + + b.HasIndex("UpgradeId"); + + b.HasIndex("IsUploader", "Team"); + + b.HasIndex("Race", "OppRace"); + + b.ToTable("ReplayPlayers"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayRating", b => + { + b.Property("ReplayRatingId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayRatingId")); + + b.Property("AvgRating") + .HasColumnType("int"); + + b.Property("ExpectationToWin") + .HasColumnType("float"); + + b.Property("IsPreRating") + .HasColumnType("tinyint(1)"); + + b.Property("LeaverType") + .HasColumnType("int"); + + b.Property("RatingType") + .HasColumnType("int"); + + b.Property("ReplayId") + .HasColumnType("int"); + + b.HasKey("ReplayRatingId"); + + b.HasIndex("RatingType"); + + b.HasIndex("ReplayId") + .IsUnique(); + + b.ToTable("ReplayRatings"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayViewCount", b => + { + b.Property("ReplayViewCountId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ReplayViewCountId")); + + b.Property("ReplayHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.HasKey("ReplayViewCountId"); + + b.ToTable("ReplayViewCounts"); + }); + + modelBuilder.Entity("dsstats.db8.SkipReplay", b => + { + b.Property("SkipReplayId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("SkipReplayId")); + + b.Property("Path") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("varchar(500)"); + + b.HasKey("SkipReplayId"); + + b.ToTable("SkipReplays"); + }); + + modelBuilder.Entity("dsstats.db8.Spawn", b => + { + b.Property("SpawnId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("SpawnId")); + + b.Property("ArmyValue") + .HasColumnType("int"); + + b.Property("Breakpoint") + .HasColumnType("int"); + + b.Property("Gameloop") + .HasColumnType("int"); + + b.Property("GasCount") + .HasColumnType("int"); + + b.Property("Income") + .HasColumnType("int"); + + b.Property("KilledValue") + .HasColumnType("int"); + + b.Property("ReplayPlayerId") + .HasColumnType("int"); + + b.Property("UpgradeSpent") + .HasColumnType("int"); + + b.HasKey("SpawnId"); + + b.HasIndex("ReplayPlayerId"); + + b.ToTable("Spawns"); + }); + + modelBuilder.Entity("dsstats.db8.SpawnUnit", b => + { + b.Property("SpawnUnitId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("SpawnUnitId")); + + b.Property("Count") + .HasColumnType("tinyint unsigned"); + + b.Property("Poss") + .IsRequired() + .HasMaxLength(4000) + .HasColumnType("varchar(4000)"); + + b.Property("SpawnId") + .HasColumnType("int"); + + b.Property("UnitId") + .HasColumnType("int"); + + b.HasKey("SpawnUnitId"); + + b.HasIndex("SpawnId"); + + b.HasIndex("UnitId"); + + b.ToTable("SpawnUnits"); + }); + + modelBuilder.Entity("dsstats.db8.StreakInfo", b => + { + b.Property("LongestStreak") + .HasColumnType("double"); + + b.Property("PlayerResult") + .HasColumnType("int"); + + b.ToTable("StreakInfos"); + }); + + modelBuilder.Entity("dsstats.db8.Unit", b => + { + b.Property("UnitId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UnitId")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("UnitId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Units"); + }); + + modelBuilder.Entity("dsstats.db8.Upgrade", b => + { + b.Property("UpgradeId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UpgradeId")); + + b.Property("Cost") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("UpgradeId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Upgrades"); + }); + + modelBuilder.Entity("dsstats.db8.Uploader", b => + { + b.Property("UploaderId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UploaderId")); + + b.Property("AppGuid") + .HasColumnType("char(36)"); + + b.Property("AppVersion") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Games") + .HasColumnType("int"); + + b.Property("Identifier") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("LatestReplay") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("LatestUpload") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("MainCommander") + .HasColumnType("int"); + + b.Property("MainCount") + .HasColumnType("int"); + + b.Property("Mvp") + .HasColumnType("int"); + + b.Property("TeamGames") + .HasColumnType("int"); + + b.Property("UploadDisabledCount") + .HasColumnType("int"); + + b.Property("UploadIsDisabled") + .HasColumnType("tinyint(1)"); + + b.Property("UploadLastDisabled") + .HasPrecision(0) + .HasColumnType("datetime(0)"); + + b.Property("Wins") + .HasColumnType("int"); + + b.HasKey("UploaderId"); + + b.HasIndex("AppGuid") + .IsUnique(); + + b.ToTable("Uploaders"); + }); + + modelBuilder.Entity("DsAbilityDsUnit", b => + { + b.HasOne("dsstats.db8.DsAbility", null) + .WithMany() + .HasForeignKey("AbilitiesDsAbilityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.DsUnit", null) + .WithMany() + .HasForeignKey("DsUnitsDsUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReplayUploader", b => + { + b.HasOne("dsstats.db8.Replay", null) + .WithMany() + .HasForeignKey("ReplaysReplayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Uploader", null) + .WithMany() + .HasForeignKey("UploadersUploaderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("dsstats.db8.ArcadePlayerRating", b => + { + b.HasOne("dsstats.db8.Player", "Player") + .WithMany("ArcadePlayerRatings") + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadePlayerRatingChange", b => + { + b.HasOne("dsstats.db8.ArcadePlayerRating", "ArcadePlayerRating") + .WithOne("ArcadePlayerRatingChange") + .HasForeignKey("dsstats.db8.ArcadePlayerRatingChange", "ArcadePlayerRatingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ArcadePlayerRating"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayer", b => + { + b.HasOne("dsstats.db8.ArcadeReplay", "ArcadeReplay") + .WithMany("ArcadeReplayDsPlayers") + .HasForeignKey("ArcadeReplayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Player", "Player") + .WithMany() + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ArcadeReplay"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayerRating", b => + { + b.HasOne("dsstats.db8.ArcadeReplayDsPlayer", "ReplayDsPlayer") + .WithOne("ArcadeReplayPlayerRating") + .HasForeignKey("dsstats.db8.ArcadeReplayDsPlayerRating", "ArcadeReplayDsPlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.ArcadeReplayRating", "ArcadeReplayRating") + .WithMany("ArcadeReplayDsPlayerRatings") + .HasForeignKey("ArcadeReplayRatingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ArcadeReplayRating"); + + b.Navigation("ReplayDsPlayer"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayRating", b => + { + b.HasOne("dsstats.db8.ArcadeReplay", "ArcadeReplay") + .WithOne("ArcadeReplayRating") + .HasForeignKey("dsstats.db8.ArcadeReplayRating", "ArcadeReplayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ArcadeReplay"); + }); + + modelBuilder.Entity("dsstats.db8.BattleNetInfo", b => + { + b.HasOne("dsstats.db8.Uploader", "Uploader") + .WithMany("BattleNetInfos") + .HasForeignKey("UploaderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Uploader"); + }); + + modelBuilder.Entity("dsstats.db8.BonusDamage", b => + { + b.HasOne("dsstats.db8.DsWeapon", "DsWeapon") + .WithMany("BonusDamages") + .HasForeignKey("DsWeaponId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DsWeapon"); + }); + + modelBuilder.Entity("dsstats.db8.ComboPlayerRating", b => + { + b.HasOne("dsstats.db8.Player", "Player") + .WithMany() + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("dsstats.db8.ComboReplayPlayerRating", b => + { + b.HasOne("dsstats.db8.ReplayPlayer", "ReplayPlayer") + .WithOne("ComboReplayPlayerRating") + .HasForeignKey("dsstats.db8.ComboReplayPlayerRating", "ReplayPlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReplayPlayer"); + }); + + modelBuilder.Entity("dsstats.db8.ComboReplayRating", b => + { + b.HasOne("dsstats.db8.Replay", "Replay") + .WithOne("ComboReplayRating") + .HasForeignKey("dsstats.db8.ComboReplayRating", "ReplayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Replay"); + }); + + modelBuilder.Entity("dsstats.db8.DsUpgrade", b => + { + b.HasOne("dsstats.db8.DsUnit", null) + .WithMany("Upgrades") + .HasForeignKey("DsUnitId"); + }); + + modelBuilder.Entity("dsstats.db8.DsWeapon", b => + { + b.HasOne("dsstats.db8.DsUnit", "DsUnit") + .WithMany("Weapons") + .HasForeignKey("DsUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DsUnit"); + }); + + modelBuilder.Entity("dsstats.db8.IhSessionPlayer", b => + { + b.HasOne("dsstats.db8.IhSession", "IhSession") + .WithMany("IhSessionPlayers") + .HasForeignKey("IhSessionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Player", "Player") + .WithMany() + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IhSession"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("dsstats.db8.NoUploadResult", b => + { + b.HasOne("dsstats.db8.Player", "Player") + .WithMany() + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("dsstats.db8.Player", b => + { + b.HasOne("dsstats.db8.Uploader", "Uploader") + .WithMany("Players") + .HasForeignKey("UploaderId"); + + b.Navigation("Uploader"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerRating", b => + { + b.HasOne("dsstats.db8.Player", "Player") + .WithMany("PlayerRatings") + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerRatingChange", b => + { + b.HasOne("dsstats.db8.PlayerRating", "PlayerRating") + .WithOne("PlayerRatingChange") + .HasForeignKey("dsstats.db8.PlayerRatingChange", "PlayerRatingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PlayerRating"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerUpgrade", b => + { + b.HasOne("dsstats.db8.ReplayPlayer", "ReplayPlayer") + .WithMany("Upgrades") + .HasForeignKey("ReplayPlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Upgrade", "Upgrade") + .WithMany() + .HasForeignKey("UpgradeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReplayPlayer"); + + b.Navigation("Upgrade"); + }); + + modelBuilder.Entity("dsstats.db8.RepPlayerRating", b => + { + b.HasOne("dsstats.db8.ReplayPlayer", "ReplayPlayer") + .WithOne("ReplayPlayerRatingInfo") + .HasForeignKey("dsstats.db8.RepPlayerRating", "ReplayPlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.ReplayRating", "ReplayRatingInfo") + .WithMany("RepPlayerRatings") + .HasForeignKey("ReplayRatingInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReplayPlayer"); + + b.Navigation("ReplayRatingInfo"); + }); + + modelBuilder.Entity("dsstats.db8.Replay", b => + { + b.HasOne("dsstats.db8.ReplayEvent", "ReplayEvent") + .WithMany("Replays") + .HasForeignKey("ReplayEventId"); + + b.Navigation("ReplayEvent"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayEvent", b => + { + b.HasOne("dsstats.db8.Event", "Event") + .WithMany("ReplayEvents") + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayPlayer", b => + { + b.HasOne("dsstats.db8.Player", "Player") + .WithMany("ReplayPlayers") + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Replay", "Replay") + .WithMany("ReplayPlayers") + .HasForeignKey("ReplayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Upgrade", null) + .WithMany("ReplayPlayers") + .HasForeignKey("UpgradeId"); + + b.Navigation("Player"); + + b.Navigation("Replay"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayRating", b => + { + b.HasOne("dsstats.db8.Replay", "Replay") + .WithOne("ReplayRatingInfo") + .HasForeignKey("dsstats.db8.ReplayRating", "ReplayId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Replay"); + }); + + modelBuilder.Entity("dsstats.db8.Spawn", b => + { + b.HasOne("dsstats.db8.ReplayPlayer", "ReplayPlayer") + .WithMany("Spawns") + .HasForeignKey("ReplayPlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReplayPlayer"); + }); + + modelBuilder.Entity("dsstats.db8.SpawnUnit", b => + { + b.HasOne("dsstats.db8.Spawn", "Spawn") + .WithMany("Units") + .HasForeignKey("SpawnId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("dsstats.db8.Unit", "Unit") + .WithMany() + .HasForeignKey("UnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Spawn"); + + b.Navigation("Unit"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadePlayerRating", b => + { + b.Navigation("ArcadePlayerRatingChange"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplay", b => + { + b.Navigation("ArcadeReplayDsPlayers"); + + b.Navigation("ArcadeReplayRating"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayer", b => + { + b.Navigation("ArcadeReplayPlayerRating"); + }); + + modelBuilder.Entity("dsstats.db8.ArcadeReplayRating", b => + { + b.Navigation("ArcadeReplayDsPlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.DsUnit", b => + { + b.Navigation("Upgrades"); + + b.Navigation("Weapons"); + }); + + modelBuilder.Entity("dsstats.db8.DsWeapon", b => + { + b.Navigation("BonusDamages"); + }); + + modelBuilder.Entity("dsstats.db8.Event", b => + { + b.Navigation("ReplayEvents"); + }); + + modelBuilder.Entity("dsstats.db8.IhSession", b => + { + b.Navigation("IhSessionPlayers"); + }); + + modelBuilder.Entity("dsstats.db8.Player", b => + { + b.Navigation("ArcadePlayerRatings"); + + b.Navigation("PlayerRatings"); + + b.Navigation("ReplayPlayers"); + }); + + modelBuilder.Entity("dsstats.db8.PlayerRating", b => + { + b.Navigation("PlayerRatingChange"); + }); + + modelBuilder.Entity("dsstats.db8.Replay", b => + { + b.Navigation("ComboReplayRating"); + + b.Navigation("ReplayPlayers"); + + b.Navigation("ReplayRatingInfo"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayEvent", b => + { + b.Navigation("Replays"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayPlayer", b => + { + b.Navigation("ComboReplayPlayerRating"); + + b.Navigation("ReplayPlayerRatingInfo"); + + b.Navigation("Spawns"); + + b.Navigation("Upgrades"); + }); + + modelBuilder.Entity("dsstats.db8.ReplayRating", b => + { + b.Navigation("RepPlayerRatings"); + }); + + modelBuilder.Entity("dsstats.db8.Spawn", b => + { + b.Navigation("Units"); + }); + + modelBuilder.Entity("dsstats.db8.Upgrade", b => + { + b.Navigation("ReplayPlayers"); + }); + + modelBuilder.Entity("dsstats.db8.Uploader", b => + { + b.Navigation("BattleNetInfos"); + + b.Navigation("Players"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MysqlMigrations/Migrations/20240722064121_RemoveArcadePlayers.cs b/src/MysqlMigrations/Migrations/20240722064121_RemoveArcadePlayers.cs new file mode 100644 index 00000000..abf433fe --- /dev/null +++ b/src/MysqlMigrations/Migrations/20240722064121_RemoveArcadePlayers.cs @@ -0,0 +1,97 @@ +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace MysqlMigrations.Migrations +{ + /// + public partial class RemoveArcadePlayers : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ArcadeReplayPlayers"); + + migrationBuilder.DropTable( + name: "ArcadePlayers"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ArcadePlayers", + columns: table => new + { + ArcadePlayerId = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + Name = table.Column(type: "varchar(50)", maxLength: 50, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ProfileId = table.Column(type: "int", nullable: false), + RealmId = table.Column(type: "int", nullable: false), + RegionId = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ArcadePlayers", x => x.ArcadePlayerId); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "ArcadeReplayPlayers", + columns: table => new + { + ArcadeReplayPlayerId = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + ArcadePlayerId = table.Column(type: "int", nullable: false), + ArcadeReplayId = table.Column(type: "int", nullable: false), + Discriminator = table.Column(type: "int", nullable: false), + Name = table.Column(type: "varchar(50)", maxLength: 50, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + PlayerResult = table.Column(type: "int", nullable: false), + SlotNumber = table.Column(type: "int", nullable: false), + Team = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ArcadeReplayPlayers", x => x.ArcadeReplayPlayerId); + table.ForeignKey( + name: "FK_ArcadeReplayPlayers_ArcadePlayers_ArcadePlayerId", + column: x => x.ArcadePlayerId, + principalTable: "ArcadePlayers", + principalColumn: "ArcadePlayerId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ArcadeReplayPlayers_ArcadeReplays_ArcadeReplayId", + column: x => x.ArcadeReplayId, + principalTable: "ArcadeReplays", + principalColumn: "ArcadeReplayId", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_ArcadePlayers_Name", + table: "ArcadePlayers", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_ArcadePlayers_RegionId_RealmId_ProfileId", + table: "ArcadePlayers", + columns: new[] { "RegionId", "RealmId", "ProfileId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ArcadeReplayPlayers_ArcadePlayerId", + table: "ArcadeReplayPlayers", + column: "ArcadePlayerId"); + + migrationBuilder.CreateIndex( + name: "IX_ArcadeReplayPlayers_ArcadeReplayId", + table: "ArcadeReplayPlayers", + column: "ArcadeReplayId"); + } + } +} diff --git a/src/MysqlMigrations/Migrations/ReplayContextModelSnapshot.cs b/src/MysqlMigrations/Migrations/ReplayContextModelSnapshot.cs index 80551605..8c5054a8 100644 --- a/src/MysqlMigrations/Migrations/ReplayContextModelSnapshot.cs +++ b/src/MysqlMigrations/Migrations/ReplayContextModelSnapshot.cs @@ -52,38 +52,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("UploaderReplays", (string)null); }); - modelBuilder.Entity("dsstats.db8.ArcadePlayer", b => - { - b.Property("ArcadePlayerId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadePlayerId")); - - b.Property("Name") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("varchar(50)"); - - b.Property("ProfileId") - .HasColumnType("int"); - - b.Property("RealmId") - .HasColumnType("int"); - - b.Property("RegionId") - .HasColumnType("int"); - - b.HasKey("ArcadePlayerId"); - - b.HasIndex("Name"); - - b.HasIndex("RegionId", "RealmId", "ProfileId") - .IsUnique(); - - b.ToTable("ArcadePlayers"); - }); - modelBuilder.Entity("dsstats.db8.ArcadePlayerRating", b => { b.Property("ArcadePlayerRatingId") @@ -309,46 +277,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("ArcadeReplayDsPlayerRatings"); }); - modelBuilder.Entity("dsstats.db8.ArcadeReplayPlayer", b => - { - b.Property("ArcadeReplayPlayerId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayPlayerId")); - - b.Property("ArcadePlayerId") - .HasColumnType("int"); - - b.Property("ArcadeReplayId") - .HasColumnType("int"); - - b.Property("Discriminator") - .HasColumnType("int"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("varchar(50)"); - - b.Property("PlayerResult") - .HasColumnType("int"); - - b.Property("SlotNumber") - .HasColumnType("int"); - - b.Property("Team") - .HasColumnType("int"); - - b.HasKey("ArcadeReplayPlayerId"); - - b.HasIndex("ArcadePlayerId"); - - b.HasIndex("ArcadeReplayId"); - - b.ToTable("ArcadeReplayPlayers"); - }); - modelBuilder.Entity("dsstats.db8.ArcadeReplayRating", b => { b.Property("ArcadeReplayRatingId") @@ -2057,25 +1985,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("ReplayDsPlayer"); }); - modelBuilder.Entity("dsstats.db8.ArcadeReplayPlayer", b => - { - b.HasOne("dsstats.db8.ArcadePlayer", "ArcadePlayer") - .WithMany("ArcadeReplayPlayers") - .HasForeignKey("ArcadePlayerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("dsstats.db8.ArcadeReplay", "ArcadeReplay") - .WithMany("ArcadeReplayPlayers") - .HasForeignKey("ArcadeReplayId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("ArcadePlayer"); - - b.Navigation("ArcadeReplay"); - }); - modelBuilder.Entity("dsstats.db8.ArcadeReplayRating", b => { b.HasOne("dsstats.db8.ArcadeReplay", "ArcadeReplay") @@ -2343,11 +2252,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Unit"); }); - modelBuilder.Entity("dsstats.db8.ArcadePlayer", b => - { - b.Navigation("ArcadeReplayPlayers"); - }); - modelBuilder.Entity("dsstats.db8.ArcadePlayerRating", b => { b.Navigation("ArcadePlayerRatingChange"); @@ -2357,8 +2261,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Navigation("ArcadeReplayDsPlayers"); - b.Navigation("ArcadeReplayPlayers"); - b.Navigation("ArcadeReplayRating"); }); diff --git a/src/SC2ArcadeCrawler/CrawlerService.MapPlayers.cs b/src/SC2ArcadeCrawler/CrawlerService.MapPlayers.cs index 39936e0a..f8bf2c03 100644 --- a/src/SC2ArcadeCrawler/CrawlerService.MapPlayers.cs +++ b/src/SC2ArcadeCrawler/CrawlerService.MapPlayers.cs @@ -30,52 +30,4 @@ private async Task MapPlayers(List replays, CancellationToken toke } } } - - public async Task MapArcadePlayersToPlayers(CancellationToken token = default) - { - using var scope = serviceProvider.CreateScope(); - var importService = scope.ServiceProvider.GetRequiredService(); - var context = scope.ServiceProvider.GetRequiredService(); - - Dictionary ArcadePlayerIdDict = await importService.MapArcadePlayers(); - - int skip = await context.ArcadeReplayDsPlayers.CountAsync(); - int take = 100_000; - - var arcadeReplayPlayers = await context.ArcadeReplayPlayers - .OrderBy(o => o.ArcadeReplayPlayerId) - .Skip(skip) - .Take(take) - .AsNoTracking() - .ToListAsync(); - - while (arcadeReplayPlayers.Count > 0) - { - List arcadeReplayDsPlayers = []; - foreach (var replayPlayer in arcadeReplayPlayers) - { - var replayDsPlayer = new ArcadeReplayDsPlayer() - { - Name = replayPlayer.Name, - SlotNumber = replayPlayer.SlotNumber, - Team = replayPlayer.Team, - Discriminator = replayPlayer.Discriminator, - PlayerResult = replayPlayer.PlayerResult, - PlayerId = ArcadePlayerIdDict[replayPlayer.ArcadePlayerId], - ArcadeReplayId = replayPlayer.ArcadeReplayId - }; - arcadeReplayDsPlayers.Add(replayDsPlayer); - } - context.ArcadeReplayDsPlayers.AddRange(arcadeReplayDsPlayers); - await context.SaveChangesAsync(token); - skip += take; - arcadeReplayPlayers = await context.ArcadeReplayPlayers - .OrderBy(o => o.ArcadeReplayPlayerId) - .Skip(skip) - .Take(take) - .AsNoTracking() - .ToListAsync(); - logger.LogInformation("skip: {skip}", skip); - } - } } diff --git a/src/SC2ArcadeCrawler/Program.cs b/src/SC2ArcadeCrawler/Program.cs index ebda76e5..bdf8e9c6 100644 --- a/src/SC2ArcadeCrawler/Program.cs +++ b/src/SC2ArcadeCrawler/Program.cs @@ -67,15 +67,8 @@ static void Main(string[] args) var crawlerService = scope.ServiceProvider.GetRequiredService(); - if (args.Length > 0 && args[0] == "maparcadeplayers") - { - crawlerService.MapArcadePlayersToPlayers().Wait(); - } - else - { - crawlerService.GetLobbyHistory(DateTime.Today.AddDays(-2), default).Wait(); - // crawlerService.GetLobbyHistory(new DateTime(2021, 2, 1), default).Wait(); - } + crawlerService.GetLobbyHistory(DateTime.Today.AddDays(-2), default).Wait(); + // crawlerService.GetLobbyHistory(new DateTime(2021, 2, 1), default).Wait(); Console.WriteLine("done."); Console.ReadLine(); diff --git a/src/dsstats.db8/ArcadeReplay.cs b/src/dsstats.db8/ArcadeReplay.cs index eb0f97b2..18da3f93 100644 --- a/src/dsstats.db8/ArcadeReplay.cs +++ b/src/dsstats.db8/ArcadeReplay.cs @@ -20,7 +20,6 @@ public class ArcadeReplay { public ArcadeReplay() { - ArcadeReplayPlayers = new HashSet(); ArcadeReplayDsPlayers = new HashSet(); } @@ -41,26 +40,9 @@ public ArcadeReplay() [StringLength(64)] public string ReplayHash { get; set; } = string.Empty; public ArcadeReplayRating? ArcadeReplayRating { get; set; } - public ICollection ArcadeReplayPlayers { get; set; } public ICollection ArcadeReplayDsPlayers { get; set; } } -public class ArcadeReplayPlayer -{ - [Key] - public int ArcadeReplayPlayerId { get; set; } - [MaxLength(50)] - public string Name { get; set; } = string.Empty; - public int SlotNumber { get; set; } - public int Team { get; set; } - public int Discriminator { get; set; } - public PlayerResult PlayerResult { get; set; } - public int ArcadePlayerId { get; set; } - public ArcadePlayer? ArcadePlayer { get; set; } - public int ArcadeReplayId { get; set; } - public ArcadeReplay? ArcadeReplay { get; set; } -} - public class ArcadeReplayDsPlayer { [Key] @@ -78,23 +60,6 @@ public class ArcadeReplayDsPlayer public Player? Player { get; set; } } -public class ArcadePlayer -{ - public ArcadePlayer() - { - ArcadeReplayPlayers = new HashSet(); - } - - [Key] - public int ArcadePlayerId { get; set; } - [MaxLength(50)] - public string Name { get; set; } = string.Empty; - public int RegionId { get; set; } - public int RealmId { get; set; } - public int ProfileId { get; set; } - public ICollection ArcadeReplayPlayers { get; set; } -} - public class ArcadePlayerRating { public int ArcadePlayerRatingId { get; set; } diff --git a/src/dsstats.db8/AutoMapper/AutoMapperProfile.cs b/src/dsstats.db8/AutoMapper/AutoMapperProfile.cs index 54cad00a..f73f5f25 100644 --- a/src/dsstats.db8/AutoMapper/AutoMapperProfile.cs +++ b/src/dsstats.db8/AutoMapper/AutoMapperProfile.cs @@ -51,14 +51,11 @@ public AutoMapperProfile() // Arcade CreateMap(MemberList.Destination); - CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); - CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); - CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); CreateMap(MemberList.Destination) .ForMember(x => x.MmrChange, opt => opt.Ignore()); @@ -66,19 +63,14 @@ public AutoMapperProfile() CreateMap(MemberList.Destination) .ForMember(x => x.MmrChange, opt => opt.Ignore()); CreateMap(MemberList.Destination); - CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); CreateMap(MemberList.Destination) .ForMember(x => x.Player, opt => opt.MapFrom(m => m.Player)) .ForMember(x => x.PlayerRatingChange, opt => opt.MapFrom(m => m.ArcadePlayerRatingChange)); - CreateMap(MemberList.Destination) - .ForMember(x => x.ToonId, opt => opt.MapFrom(m => m.ProfileId)) - .ForMember(x => x.ArcadeDefeatsSinceLastUpload, opt => opt.Ignore()) - .ForMember(x => x.IsUploader, opt => opt.Ignore()); + CreateMap(); - CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); CreateMap(MemberList.Source); diff --git a/src/dsstats.db8/ReplayContext.cs b/src/dsstats.db8/ReplayContext.cs index e01926cd..a33703d7 100644 --- a/src/dsstats.db8/ReplayContext.cs +++ b/src/dsstats.db8/ReplayContext.cs @@ -37,9 +37,7 @@ public class ReplayContext : DbContext public virtual DbSet FunStatMemories { get; set; } = null!; public virtual DbSet ArcadeReplays { get; set; } = null!; public virtual DbSet MaterializedArcadeReplays { get; set; } = null!; - public virtual DbSet ArcadeReplayPlayers { get; set; } = null!; public virtual DbSet ArcadeReplayDsPlayers { get; set; } = null!; - public virtual DbSet ArcadePlayers { get; set; } = null!; public virtual DbSet ArcadeReplayRatings { get; set; } = null!; public virtual DbSet ArcadePlayerRatings { get; set; } = null!; public virtual DbSet ArcadeReplayDsPlayerRatings { get; set; } = null!; @@ -176,12 +174,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) entity.HasIndex(i => i.ReplayHash); }); - modelBuilder.Entity(entity => - { - entity.HasIndex(i => i.Name); - entity.HasIndex(i => new { i.RegionId, i.RealmId, i.ProfileId }).IsUnique(); - }); - modelBuilder.Entity(entity => { entity.HasIndex(i => i.RatingType); diff --git a/src/dsstats.db8services/Import/ImportService.cs b/src/dsstats.db8services/Import/ImportService.cs index 462d011a..59eeb9bb 100644 --- a/src/dsstats.db8services/Import/ImportService.cs +++ b/src/dsstats.db8services/Import/ImportService.cs @@ -264,56 +264,4 @@ private int GetUpgradeId(string name) } return upgradeId; } - - public async Task> MapArcadePlayers() - { - await playersSs.WaitAsync(); - Dictionary arcadePlayerIdMap = []; - try - { - if (!IsInit) - { - await Init(); - } - List newPlayers = []; - - using var scope = serviceProvider.CreateAsyncScope(); - var context = scope.ServiceProvider.GetRequiredService(); - - var arcadePlayersDict = (await context.ArcadePlayers - .ToListAsync()).ToDictionary(k => new PlayerId(k.ProfileId, k.RealmId, k.RegionId), v => v); - - foreach (var arcadePlayer in arcadePlayersDict.Values) - { - var playerId = new PlayerId(arcadePlayer.ProfileId, arcadePlayer.RealmId, arcadePlayer.RegionId); - if (PlayerIds.TryGetValue(playerId, out var dsPlayerId)) - { - arcadePlayerIdMap[arcadePlayer.ArcadePlayerId] = dsPlayerId; - } - else - { - newPlayers.Add(new() - { - Name = arcadePlayer.Name, - ToonId = arcadePlayer.ProfileId, - RealmId = arcadePlayer.RealmId, - RegionId = arcadePlayer.RegionId, - }); - } - } - context.Players.AddRange(newPlayers); - await context.SaveChangesAsync(); - foreach (var player in newPlayers) - { - var playerId = new PlayerId(player.ToonId, player.RealmId, player.RegionId); - PlayerIds[playerId] = player.PlayerId; - arcadePlayerIdMap[arcadePlayersDict[playerId].ArcadePlayerId] = player.PlayerId; - } - } - finally - { - playersSs.Release(); - } - return arcadePlayerIdMap; - } } diff --git a/src/dsstats.db8services/PlayerService/PlayerService.PlayerIdArcade.cs b/src/dsstats.db8services/PlayerService/PlayerService.PlayerIdArcade.cs index b9856f38..b5bf2845 100644 --- a/src/dsstats.db8services/PlayerService/PlayerService.PlayerIdArcade.cs +++ b/src/dsstats.db8services/PlayerService/PlayerService.PlayerIdArcade.cs @@ -62,12 +62,11 @@ private async Task> GetPlayerIdArcadeRatings(PlayerI private async Task> GetPlayerIdArcadeGameModeCounts(PlayerId playerId, CancellationToken token) { - var gameModeGroup = from r in context.ArcadeReplays - from rp in r.ArcadeReplayPlayers - where rp.ArcadePlayer!.ProfileId == playerId.ToonId - && rp.ArcadePlayer.RealmId == playerId.RealmId - && rp.ArcadePlayer.RegionId == playerId.RegionId - group r by new { r.GameMode, r.PlayerCount } into g + var gameModeGroup = from rp in context.ArcadeReplayDsPlayers + where rp.Player!.ToonId == playerId.ToonId + && rp.Player.RealmId == playerId.RealmId + && rp.Player.RegionId == playerId.RegionId + group rp.ArcadeReplay by new { rp.ArcadeReplay!.GameMode, rp.ArcadeReplay.PlayerCount } into g select new PlayerGameModeResult() { GameMode = g.Key.GameMode, @@ -115,25 +114,25 @@ private async Task> GetPlayerIdArcadePlayerTeammates(Repl { var replays = GetArcadeRatingReplays(context, ratingType); var teammateGroup = from r in replays - from rp in r.ArcadeReplayPlayers - from t in r.ArcadeReplayPlayers - join p in context.ArcadePlayers on rp.ArcadePlayerId equals p.ArcadePlayerId - join tp in context.ArcadePlayers on t.ArcadePlayerId equals tp.ArcadePlayerId - join rpr in context.ArcadeReplayDsPlayerRatings on rp.ArcadeReplayPlayerId equals rpr.ArcadeReplayDsPlayerId - where p.ProfileId == playerId.ToonId + from rp in r.ArcadeReplayDsPlayers + from t in r.ArcadeReplayDsPlayers + join p in context.Players on rp.PlayerId equals p.PlayerId + join tp in context.Players on t.PlayerId equals tp.PlayerId + join rpr in context.ArcadeReplayDsPlayerRatings on rp.ArcadeReplayDsPlayerId equals rpr.ArcadeReplayDsPlayerId + where p.ToonId == playerId.ToonId && p.RegionId == playerId.RegionId && p.RealmId == playerId.RealmId && t != rp && t.Team == rp.Team - && tp.ProfileId > 0 - group new { t, tp, rpr } by new { tp.Name, tp.ArcadePlayerId, tp.ProfileId, tp.RealmId, tp.RegionId } into g + && tp.ToonId > 0 + group new { t, tp, rpr } by new { tp.Name, tp.PlayerId, tp.ToonId, tp.RealmId, tp.RegionId } into g orderby g.Count() descending where g.Count() > 10 select new AracdePlayerTeamResultHelper() { - PlayerId = new(g.Key.ProfileId, g.Key.RealmId, g.Key.RegionId), + PlayerId = new(g.Key.ToonId, g.Key.RealmId, g.Key.RegionId), Name = g.Key.Name, - ArcadePlayerId = g.Key.ArcadePlayerId, + ArcadePlayerId = g.Key.PlayerId, Count = g.Count(), Wins = g.Count(c => c.t.PlayerResult == PlayerResult.Win), AvgGain = Math.Round(g.Average(a => a.rpr.RatingChange), 2) @@ -156,24 +155,24 @@ private async Task> GetPlayerIdArcadePlayerOpponents(Repl { var replays = GetArcadeRatingReplays(context, ratingType); var teammateGroup = from r in replays - from rp in r.ArcadeReplayPlayers - from o in r.ArcadeReplayPlayers - join p in context.ArcadePlayers on rp.ArcadePlayerId equals p.ArcadePlayerId - join op in context.ArcadePlayers on o.ArcadePlayerId equals op.ArcadePlayerId - join rpr in context.ArcadeReplayDsPlayerRatings on o.ArcadeReplayPlayerId equals rpr.ArcadeReplayDsPlayerId - where p.ProfileId == playerId.ToonId + from rp in r.ArcadeReplayDsPlayers + from o in r.ArcadeReplayDsPlayers + join p in context.Players on rp.PlayerId equals p.PlayerId + join op in context.Players on o.PlayerId equals op.PlayerId + join rpr in context.ArcadeReplayDsPlayerRatings on o.ArcadeReplayDsPlayerId equals rpr.ArcadeReplayDsPlayerId + where p.ToonId == playerId.ToonId && p.RegionId == playerId.RegionId && p.RealmId == playerId.RealmId && o.Team != rp.Team - && op.ProfileId > 0 - group new { o, op, rpr } by new { op.Name, op.ArcadePlayerId, op.ProfileId, op.RealmId, op.RegionId } into g + && op.ToonId > 0 + group new { o, op, rpr } by new { op.Name, op.PlayerId, op.ToonId, op.RealmId, op.RegionId } into g orderby g.Count() descending where g.Count() > 10 select new AracdePlayerTeamResultHelper() { - PlayerId = new(g.Key.ProfileId, g.Key.RealmId, g.Key.RegionId), + PlayerId = new(g.Key.ToonId, g.Key.RealmId, g.Key.RegionId), Name = g.Key.Name, - ArcadePlayerId = g.Key.ArcadePlayerId, + ArcadePlayerId = g.Key.PlayerId, Count = g.Count(), Wins = g.Count(c => c.o.PlayerResult == PlayerResult.Win), AvgGain = Math.Round(g.Average(a => a.rpr.RatingChange), 2) diff --git a/src/dsstats.db8services/PlayerService/PlayerService.cs b/src/dsstats.db8services/PlayerService/PlayerService.cs index 234ab113..4c57854d 100644 --- a/src/dsstats.db8services/PlayerService/PlayerService.cs +++ b/src/dsstats.db8services/PlayerService/PlayerService.cs @@ -34,8 +34,8 @@ public PlayerService(ReplayContext context, public async Task GetPlayerIdName(PlayerId playerId) { - return await context.ArcadePlayers - .Where(x => x.ProfileId == playerId.ToonId + return await context.Players + .Where(x => x.ToonId == playerId.ToonId && x.RealmId == playerId.RealmId && x.RegionId == playerId.RegionId) .Select(s => s.Name) @@ -183,14 +183,13 @@ private async Task> GetArcadelayerRatingChartData(Pla RatingType ratingType, CancellationToken token) { - var query = from p in context.ArcadePlayers - from rp in p.ArcadeReplayPlayers + var query = from rp in context.ArcadeReplayDsPlayers join r in context.ArcadeReplays on rp.ArcadeReplayId equals r.ArcadeReplayId join rr in context.ArcadeReplayRatings on r.ArcadeReplayId equals rr.ArcadeReplayId - join rpr in context.ArcadeReplayDsPlayerRatings on rp.ArcadeReplayPlayerId equals rpr.ArcadeReplayDsPlayerId - where p.ProfileId == playerId.ToonId - && p.RealmId == playerId.RealmId - && p.RegionId == playerId.RegionId + join rpr in context.ArcadeReplayDsPlayerRatings on rp.ArcadeReplayDsPlayerId equals rpr.ArcadeReplayDsPlayerId + where rp.Player!.ToonId == playerId.ToonId + && rp.Player.RealmId == playerId.RealmId + && rp.Player.RegionId == playerId.RegionId && rr.RatingType == ratingType group new { r, rpr } by new { r.CreatedAt.Year, Week = context.Week(r.CreatedAt) } into g select new ReplayPlayerChartDto() diff --git a/src/dsstats.ratings/RatingService.Combo.cs b/src/dsstats.ratings/RatingService.Combo.cs index 442e856b..258cf52a 100644 --- a/src/dsstats.ratings/RatingService.Combo.cs +++ b/src/dsstats.ratings/RatingService.Combo.cs @@ -14,20 +14,22 @@ public partial class RatingService { private async Task ProduceComboRatings(bool recalc) { + + using var scope = scopeFactory.CreateAsyncScope(); + var context = scope.ServiceProvider.GetRequiredService(); + var ratingSaveService = scope.ServiceProvider.GetRequiredService(); + var comboRatings = scope.ServiceProvider.GetRequiredService(); + + await CleanupComboPreRatings(context); + if (!recalc) { await ContinueComboRatings(); return; } - - using var scope = scopeFactory.CreateAsyncScope(); - var context = scope.ServiceProvider.GetRequiredService(); - var ratingSaveService = scope.ServiceProvider.GetRequiredService(); - var comboRatings = scope.ServiceProvider.GetRequiredService(); + await comboRatings.CombineDsstatsSc2ArcadeReplays(); - await CleanupComboPreRatings(context); - DsstatsCalcRequest dsstatsRequest = new() { FromDate = new DateTime(2021, 2, 1), diff --git a/src/dsstats.ratings/RatingService.ComboContinue.cs b/src/dsstats.ratings/RatingService.ComboContinue.cs index 305ce6a8..73c2dc3d 100644 --- a/src/dsstats.ratings/RatingService.ComboContinue.cs +++ b/src/dsstats.ratings/RatingService.ComboContinue.cs @@ -50,8 +50,6 @@ public async Task ContinueComboRatings() BannedPlayers = new Dictionary().ToFrozenDictionary() }; - await CleanupComboPreRatings(context); - ratingRequest.ReplayPlayerRatingAppendId = await context.ComboReplayPlayerRatings .OrderByDescending(o => o.ComboReplayPlayerRatingId) .Select(s => s.ComboReplayPlayerRatingId) diff --git a/src/dsstats.shared/Interfaces/IImportService.cs b/src/dsstats.shared/Interfaces/IImportService.cs index 04bbc381..fecbc329 100644 --- a/src/dsstats.shared/Interfaces/IImportService.cs +++ b/src/dsstats.shared/Interfaces/IImportService.cs @@ -9,5 +9,4 @@ public interface IImportService Task Import(List replayDtos, List? uploaderPlayerIds = null); Task Init(); Task SetPreRatings(); - Task> MapArcadePlayers(); } \ No newline at end of file diff --git a/src/tests/dsstats.ratings.tests/PreRatingTests.cs b/src/tests/dsstats.ratings.tests/PreRatingTests.cs index 80f7a71e..046945fa 100644 --- a/src/tests/dsstats.ratings.tests/PreRatingTests.cs +++ b/src/tests/dsstats.ratings.tests/PreRatingTests.cs @@ -54,9 +54,11 @@ public PreRatingTests() services.AddSingleton(); services.AddSingleton(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); + serviceProvider = services.BuildServiceProvider(); }