From ace56912c9c89e80807798fee021b094ece42b18 Mon Sep 17 00:00:00 2001 From: der1sebi <47915100+der1sebi@users.noreply.github.com> Date: Wed, 22 May 2024 12:10:24 +0200 Subject: [PATCH 1/2] Added 3. ruleset to api and all relevant scripts/schema --- Database/DB Maintenance/gamecache update.sql | 24 +++++++++++-------- .../special cases/delete_cleanup games.sql | 6 +++-- Database/Schema/db schema MODERN.sql | 4 +++- Database/Schema/db schema WILD.sql | 4 +++- HistoryCrawler/Database.cs | 8 +++---- HistoryCrawler/Model/Game.cs | 2 ++ .../Api/TeamGeneration.cs | 1 + Ultimate-Splinterlands-Bot API/Model/Game.cs | 2 ++ .../Resources/config/api_team_select.sql | 1 + 9 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Database/DB Maintenance/gamecache update.sql b/Database/DB Maintenance/gamecache update.sql index 4b56dca..e7d4d3a 100644 --- a/Database/DB Maintenance/gamecache update.sql +++ b/Database/DB Maintenance/gamecache update.sql @@ -1,18 +1,20 @@ --wild -INSERT INTO "wild_CachedTeams" ("Ruleset1", "Ruleset2", "ManaCap", "WinRate", "GamesPlayed", "TeamHash", "RatingBracket") +INSERT INTO "wild_CachedTeams" ("Ruleset1", "Ruleset2", "Ruleset3", "ManaCap", "WinRate", "GamesPlayed", "TeamHash", "RatingBracket") SELECT * FROM ( SELECT team_results."Ruleset1", team_results."Ruleset2", + team_results."Ruleset3", team_results."ManaCap", - avg(team_results."WinFlag") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."ManaCap", team_results."RatingBracket") * 100 as "WinRate", - count(team_results."TeamHash") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."ManaCap", team_results."RatingBracket") as "GamesPlayed", + avg(team_results."WinFlag") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3", team_results."ManaCap", team_results."RatingBracket") * 100 as "WinRate", + count(team_results."TeamHash") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3",team_results."ManaCap", team_results."RatingBracket") as "GamesPlayed", team_results."TeamHash", team_results."RatingBracket" FROM (SELECT g."Ruleset1", g."Ruleset2", + g."Ruleset3", g."ManaCap", CASE WHEN tg."Result" = 'W' THEN CAST(1 AS DECIMAL) @@ -36,24 +38,26 @@ SELECT * FROM -- etc ) aggregated_results WHERE "GamesPlayed" > 2 -GROUP BY 1,2,3,4,5,6,7 -ON CONFLICT ("Ruleset1", "Ruleset2", "ManaCap", "TeamHash", "RatingBracket") DO UPDATE SET "WinRate"=EXCLUDED."WinRate", "GamesPlayed" = excluded."GamesPlayed"; +GROUP BY 1,2,3,4,5,6,7,8 +ON CONFLICT ("Ruleset1", "Ruleset2", "Ruleset3", "ManaCap", "TeamHash", "RatingBracket") DO UPDATE SET "WinRate"=EXCLUDED."WinRate", "GamesPlayed" = excluded."GamesPlayed"; --modern -INSERT INTO "modern_CachedTeams" ("Ruleset1", "Ruleset2", "ManaCap", "WinRate", "GamesPlayed", "TeamHash", "RatingBracket") +INSERT INTO "modern_CachedTeams" ("Ruleset1", "Ruleset2", "Ruleset3", "ManaCap", "WinRate", "GamesPlayed", "TeamHash", "RatingBracket") SELECT * FROM ( SELECT team_results."Ruleset1", team_results."Ruleset2", + team_results."Ruleset3", team_results."ManaCap", - avg(team_results."WinFlag") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."ManaCap", team_results."RatingBracket") * 100 as "WinRate", - count(team_results."TeamHash") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."ManaCap", team_results."RatingBracket") as "GamesPlayed", + avg(team_results."WinFlag") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3", team_results."ManaCap", team_results."RatingBracket") * 100 as "WinRate", + count(team_results."TeamHash") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3", team_results."ManaCap", team_results."RatingBracket") as "GamesPlayed", team_results."TeamHash", team_results."RatingBracket" FROM (SELECT g."Ruleset1", g."Ruleset2", + g."Ruleset3", g."ManaCap", CASE WHEN tg."Result" = 'W' THEN CAST(1 AS DECIMAL) @@ -77,5 +81,5 @@ SELECT * FROM -- etc ) aggregated_results WHERE "GamesPlayed" > 2 -GROUP BY 1,2,3,4,5,6,7 -ON CONFLICT ("Ruleset1", "Ruleset2", "ManaCap", "TeamHash", "RatingBracket") DO UPDATE SET "WinRate"=EXCLUDED."WinRate", "GamesPlayed" = excluded."GamesPlayed"; \ No newline at end of file +GROUP BY 1,2,3,4,5,6,7,8 +ON CONFLICT ("Ruleset1", "Ruleset2", "Ruleset3", "ManaCap", "TeamHash", "RatingBracket") DO UPDATE SET "WinRate"=EXCLUDED."WinRate", "GamesPlayed" = excluded."GamesPlayed"; \ No newline at end of file diff --git a/Database/DB Maintenance/special cases/delete_cleanup games.sql b/Database/DB Maintenance/special cases/delete_cleanup games.sql index 50bc461..992defc 100644 --- a/Database/DB Maintenance/special cases/delete_cleanup games.sql +++ b/Database/DB Maintenance/special cases/delete_cleanup games.sql @@ -3,11 +3,12 @@ SELECT sub_select."Id" FROM( SELECT main_select."Id", main_select."Ruleset1", - main_select."Ruleset2", + main_select."Ruleset2", + main_select."Ruleset3", main_select."RatingBracket", main_select."CreatedDate", ROW_NUMBER () OVER ( - PARTITION BY main_select."Ruleset1", main_select."Ruleset2", main_select."RatingBracket" + PARTITION BY main_select."Ruleset1", main_select."Ruleset2", main_select."Ruleset3", main_select."RatingBracket" ORDER BY main_select."CreatedDate" DESC) FROM ( @@ -15,6 +16,7 @@ SELECT sub_select."Id" g."Id", g."Ruleset1", g."Ruleset2", + g."Ruleset3", CASE WHEN g."Rating" BETWEEN 0 AND 120 THEN 1 WHEN g."Rating" BETWEEN 121 AND 400 THEN 1 diff --git a/Database/Schema/db schema MODERN.sql b/Database/Schema/db schema MODERN.sql index 4d66241..5f916d4 100644 --- a/Database/Schema/db schema MODERN.sql +++ b/Database/Schema/db schema MODERN.sql @@ -12,6 +12,7 @@ CREATE TABLE IF NOT EXISTS "modern_Game" ( "ManaCap" INTEGER NOT NULL CHECK("ManaCap" <= 100), "Ruleset1" TEXT NOT NULL, "Ruleset2" TEXT NOT NULL, + "Ruleset3" TEXT NOT NULL, "Inactive" TEXT NOT NULL, "TournamentSettings" TEXT, unique("QueueIdHash", "QueueId1") @@ -47,12 +48,13 @@ CREATE TABLE IF NOT EXISTS "modern_CachedTeams" ( "Id" serial primary key, "Ruleset1" TEXT NOT NULL, "Ruleset2" TEXT NOT NULL, + "Ruleset3" TEXT NOT NULL, "ManaCap" INTEGER NOT NULL, "WinRate" numeric NOT NULL, "GamesPlayed" BIGINT NOT NULL, "TeamHash" BIGINT NOT NULL, "RatingBracket" INTEGER NOT NULL, - UNIQUE("Ruleset1", "Ruleset2", "ManaCap", "TeamHash", "RatingBracket")); + UNIQUE("Ruleset1", "Ruleset2", "Ruleset3", "ManaCap", "TeamHash", "RatingBracket")); CREATE INDEX ON public."modern_CachedTeams" ("Ruleset1"); CREATE INDEX ON public."modern_CachedTeams" ("TeamHash"); CREATE INDEX ON public."modern_CachedTeams" ("RatingBracket"); diff --git a/Database/Schema/db schema WILD.sql b/Database/Schema/db schema WILD.sql index 74b180c..d1dc93b 100644 --- a/Database/Schema/db schema WILD.sql +++ b/Database/Schema/db schema WILD.sql @@ -12,6 +12,7 @@ CREATE TABLE IF NOT EXISTS "wild_Game" ( "ManaCap" INTEGER NOT NULL CHECK("ManaCap" <= 100), "Ruleset1" TEXT NOT NULL, "Ruleset2" TEXT NOT NULL, + "Ruleset3" TEXT NOT NULL, "Inactive" TEXT NOT NULL, "TournamentSettings" TEXT, unique("QueueIdHash", "QueueId1") @@ -47,12 +48,13 @@ CREATE TABLE IF NOT EXISTS "wild_CachedTeams" ( "Id" serial primary key, "Ruleset1" TEXT NOT NULL, "Ruleset2" TEXT NOT NULL, + "Ruleset3" TEXT NOT NULL, "ManaCap" INTEGER NOT NULL, "WinRate" numeric NOT NULL, "GamesPlayed" BIGINT NOT NULL, "TeamHash" BIGINT NOT NULL, "RatingBracket" INTEGER NOT NULL, - UNIQUE("Ruleset1", "Ruleset2", "ManaCap", "TeamHash", "RatingBracket")); + UNIQUE("Ruleset1", "Ruleset2", "Ruleset3", "ManaCap", "TeamHash", "RatingBracket")); CREATE INDEX ON public."wild_CachedTeams" ("Ruleset1"); CREATE INDEX ON public."wild_CachedTeams" ("TeamHash"); CREATE INDEX ON public."wild_CachedTeams" ("RatingBracket"); diff --git a/HistoryCrawler/Database.cs b/HistoryCrawler/Database.cs index 6e0c32a..4f64591 100644 --- a/HistoryCrawler/Database.cs +++ b/HistoryCrawler/Database.cs @@ -296,7 +296,7 @@ public List InsertNewGames(IEnumerable<(User user, List games)> ps) sqlEnd.Add(gameType, @") , ins AS ( - INSERT INTO """ + GAME_TYPE_PREFIXES[i] + @"_Game"" (""QueueIdHash"", ""QueueId1"", ""Winner"", ""Loser"", ""Rating"", ""CreatedDate"", ""MatchType"", ""ManaCap"", ""Ruleset1"", ""Ruleset2"", ""Inactive"", ""TournamentSettings"") + INSERT INTO """ + GAME_TYPE_PREFIXES[i] + @"_Game"" (""QueueIdHash"", ""QueueId1"", ""Winner"", ""Loser"", ""Rating"", ""CreatedDate"", ""MatchType"", ""ManaCap"", ""Ruleset1"", ""Ruleset2"", ""Ruleset3"", ""Inactive"", ""TournamentSettings"") SELECT * FROM input_rows ON CONFLICT (""QueueIdHash"", ""QueueId1"") DO NOTHING RETURNING ""Id"", ""QueueIdHash"" @@ -311,7 +311,7 @@ FROM input_rows JOIN """ + GAME_TYPE_PREFIXES[i] + @"_Game"" g USING (""QueueIdHash"", ""QueueId1"");"); // https://stackoverflow.com/a/42217872 - sql.Add(gameType, @"WITH input_rows(""QueueIdHash"", ""QueueId1"", ""Winner"", ""Loser"", ""Rating"", ""CreatedDate"", ""MatchType"", ""ManaCap"", ""Ruleset1"", ""Ruleset2"", ""Inactive"", ""TournamentSettings"") AS ( + sql.Add(gameType, @"WITH input_rows(""QueueIdHash"", ""QueueId1"", ""Winner"", ""Loser"", ""Rating"", ""CreatedDate"", ""MatchType"", ""ManaCap"", ""Ruleset1"", ""Ruleset2"", ""Ruleset3"", ""Inactive"", ""TournamentSettings"") AS ( VALUES"); } @@ -336,7 +336,7 @@ FROM input_rows { continue; } - sql[gameType] += $"(text '{firstGame.QueueIdHash}', text '{firstGame.QueueId1}', text '{firstGame.Winner}', text '{firstGame.Loser}', integer '{firstGame.Rating}', timestamp '{firstGame.CreatedDate}', text '{firstGame.MatchType}', integer '{firstGame.ManaCap}', text '{firstGame.Ruleset1}', text '{firstGame.Ruleset2}', text '{firstGame.Inactive}', text '{firstGame.TournamentSettings}')"; + sql[gameType] += $"(text '{firstGame.QueueIdHash}', text '{firstGame.QueueId1}', text '{firstGame.Winner}', text '{firstGame.Loser}', integer '{firstGame.Rating}', timestamp '{firstGame.CreatedDate}', text '{firstGame.MatchType}', integer '{firstGame.ManaCap}', text '{firstGame.Ruleset1}', text '{firstGame.Ruleset2}', text '{firstGame.Ruleset3}', text '{firstGame.Inactive}', text '{firstGame.TournamentSettings}')"; games[gameType].TryAdd(firstGame.QueueIdHash, firstGame); ps.ElementAt(i).games.Remove(firstGame); } @@ -358,7 +358,7 @@ FROM input_rows return; } - sql[game.Format] += $",('{game.QueueIdHash}','{game.QueueId1}','{game.Winner}','{game.Loser}',{game.Rating},'{game.CreatedDate}','{game.MatchType}',{game.ManaCap},'{game.Ruleset1}','{game.Ruleset2}','{game.Inactive}','{game.TournamentSettings}')"; + sql[game.Format] += $",('{game.QueueIdHash}','{game.QueueId1}','{game.Winner}','{game.Loser}',{game.Rating},'{game.CreatedDate}','{game.MatchType}',{game.ManaCap},'{game.Ruleset1}','{game.Ruleset2}','{game.Ruleset3}','{game.Inactive}','{game.TournamentSettings}')"; games[game.Format].TryAdd(game.QueueIdHash, game); }); diff --git a/HistoryCrawler/Model/Game.cs b/HistoryCrawler/Model/Game.cs index fb6f151..f9217ca 100644 --- a/HistoryCrawler/Model/Game.cs +++ b/HistoryCrawler/Model/Game.cs @@ -20,6 +20,7 @@ internal record Game public int ManaCap { get; init; } public string Ruleset1 { get; init; } public string Ruleset2 { get; init; } + public string Ruleset3 { get; init; } public string Inactive { get; init; } public string? TournamentSettings { get; init; } [NotMapped] @@ -70,6 +71,7 @@ public Game(JToken game) string[] rulesets = ((string?)game["ruleset"] ?? throw new ArgumentNullException(nameof(game))).Split('|'); Ruleset1 = rulesets[0]; Ruleset2 = rulesets.Length > 1 ? rulesets[1] : ""; + Ruleset3 = rulesets.Length > 2 ? rulesets[2] : ""; string winner = (string?)game["winner"] ?? throw new ArgumentNullException(nameof(game)); string player1 = (string?)game["player_1"] ?? throw new ArgumentNullException(nameof(game)); string player2 = (string?)game["player_2"] ?? throw new ArgumentNullException(nameof(game)); diff --git a/Ultimate-Splinterlands-Bot API/Api/TeamGeneration.cs b/Ultimate-Splinterlands-Bot API/Api/TeamGeneration.cs index d12e5ac..9adde9b 100644 --- a/Ultimate-Splinterlands-Bot API/Api/TeamGeneration.cs +++ b/Ultimate-Splinterlands-Bot API/Api/TeamGeneration.cs @@ -358,6 +358,7 @@ private static string GetPlayerTeams(int ratingBracket, int manaCap, string[] ru .Replace("@manaCap", manaCap.ToString()) .Replace("@ruleset1", System.Web.HttpUtility.HtmlEncode(rulesets[0])) .Replace("@ruleset2", System.Web.HttpUtility.HtmlEncode(rulesets.Length > 1 ? rulesets[1] : "")) + .Replace("@ruleset3", System.Web.HttpUtility.HtmlEncode(rulesets.Length > 2 ? rulesets[2] : "")) .Replace("@additionalFilters", additionalFilters); using NpgsqlDataReader reader = cmd.ExecuteReader(); diff --git a/Ultimate-Splinterlands-Bot API/Model/Game.cs b/Ultimate-Splinterlands-Bot API/Model/Game.cs index df7ab2f..6728a5c 100644 --- a/Ultimate-Splinterlands-Bot API/Model/Game.cs +++ b/Ultimate-Splinterlands-Bot API/Model/Game.cs @@ -14,6 +14,7 @@ internal record Game public int ManaCap { get; init; } public string Ruleset1 { get; init; } public string Ruleset2 { get; init; } + public string Ruleset3 { get; init; } public string Inactive { get; init; } public string? TournamentSettings { get; init; } public bool IsSurrender { get; init; } @@ -53,6 +54,7 @@ public Game(JToken game) string[] rulesets = ((string?)game["ruleset"] ?? throw new ArgumentNullException(nameof(game))).Split('|'); Ruleset1 = rulesets[0]; Ruleset2 = rulesets.Length > 1 ? rulesets[1] : ""; + Ruleset3 = rulesets.Length > 2 ? rulesets[2] : ""; string winner = (string?)game["winner"] ?? throw new ArgumentNullException(nameof(game)); string player1 = (string?)game["player_1"] ?? throw new ArgumentNullException(nameof(game)); string player2 = (string?)game["player_2"] ?? throw new ArgumentNullException(nameof(game)); diff --git a/Ultimate-Splinterlands-Bot API/Resources/config/api_team_select.sql b/Ultimate-Splinterlands-Bot API/Resources/config/api_team_select.sql index b4f70fe..085deb1 100644 --- a/Ultimate-Splinterlands-Bot API/Resources/config/api_team_select.sql +++ b/Ultimate-Splinterlands-Bot API/Resources/config/api_team_select.sql @@ -16,6 +16,7 @@ WHERE aggregated_results."GamesPlayed" > @minGamesPlayed AND aggregated_results."Ruleset1" = '@ruleset1' AND aggregated_results."Ruleset2" = '@ruleset2' + AND aggregated_results."Ruleset3" = '@ruleset3' AND aggregated_results."RatingBracket" @ratingBracket -- special case AND aggregated_results."ManaCap" = @manaCap @additionalFilters From 5af9c3158e810c2ecfa1eb01528838948cd41624 Mon Sep 17 00:00:00 2001 From: der1sebi <47915100+der1sebi@users.noreply.github.com> Date: Wed, 22 May 2024 12:13:26 +0200 Subject: [PATCH 2/2] Update gamecache update.sql --- Database/DB Maintenance/gamecache update.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Database/DB Maintenance/gamecache update.sql b/Database/DB Maintenance/gamecache update.sql index e7d4d3a..712ced7 100644 --- a/Database/DB Maintenance/gamecache update.sql +++ b/Database/DB Maintenance/gamecache update.sql @@ -7,7 +7,7 @@ SELECT * FROM team_results."Ruleset3", team_results."ManaCap", avg(team_results."WinFlag") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3", team_results."ManaCap", team_results."RatingBracket") * 100 as "WinRate", - count(team_results."TeamHash") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3",team_results."ManaCap", team_results."RatingBracket") as "GamesPlayed", + count(team_results."TeamHash") OVER (PARTITION BY team_results."TeamHash", team_results."Ruleset1", team_results."Ruleset2", team_results."Ruleset3", team_results."ManaCap", team_results."RatingBracket") as "GamesPlayed", team_results."TeamHash", team_results."RatingBracket"