From a86453f497e15a473a1a94e01c2b65c5c52f6e5e Mon Sep 17 00:00:00 2001 From: Kevin Belisle Date: Thu, 2 Sep 2021 00:25:24 -0400 Subject: [PATCH] Fix aggregates calculations --- .../xyz/etztech/stonks/StatisticsImporter.kt | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/xyz/etztech/stonks/StatisticsImporter.kt b/app/src/main/kotlin/xyz/etztech/stonks/StatisticsImporter.kt index 257cf4e..8dd66ac 100644 --- a/app/src/main/kotlin/xyz/etztech/stonks/StatisticsImporter.kt +++ b/app/src/main/kotlin/xyz/etztech/stonks/StatisticsImporter.kt @@ -65,8 +65,6 @@ object StatisticsImporter { } } transaction(database) { - addLogger(StdOutSqlLogger) - statsFile?.stats?.forEach { type, stats -> stats.forEach { name, value -> if (playerStats.get(type)?.get(name) != value) { @@ -134,29 +132,41 @@ object StatisticsImporter { SET @Timestamp = CURRENT_TIMESTAMP; INSERT INTO AGGREGATESTATISTICS ("Type", "Name", "Timestamp", "Value") - SELECT Live."Type", + SELECT LiveMax."Type", '', @Timestamp AS "Timestamp", - sum(Live."Value") - FROM LIVESTATISTICS as Live - LEFT JOIN AGGREGATESTATISTICS as Agg - ON Live."Type" = Agg."Type" - WHERE array_contains(array['minecraft:mined'], Live."Type") + SUM(LiveMax."Value") + FROM ( + SELECT Live."Type", + Live."Name", + MAX(Live."Value") AS "Value" + FROM livestatistics as Live + WHERE array_contains(array['minecraft:mined'], Live."Type") + GROUP BY Live."Type", Live."Name", Live."PlayerId" + ) as LiveMax + LEFT JOIN AGGREGATESTATISTICS as Agg + ON Live."Type" = Agg."Type" GROUP BY Live."Type" HAVING sum(Live."Value") <> max(Agg."Value") OR max(Agg."Value") IS NULL; INSERT INTO AGGREGATESTATISTICS ("Type", "Name", "Timestamp", "Value") - SELECT Live."Type", - Live."Name", + SELECT LiveMax."Type", + LiveMax."Name", @Timestamp AS "Timestamp", - Sum(Live."Value") - FROM livestatistics as Live - LEFT JOIN AGGREGATESTATISTICS as Agg - ON Live."Type" = Agg."Type" AND Live."Name" = Agg."Name" - WHERE array_contains(array['minecraft:animals_bred', 'minecraft:play_one_minute', 'minecraft:deaths', 'minecraft:player_kills', 'minecraft:aviate_one_cm', 'minecraft:boat_one_cm', 'minecraft:crouch_one_cm', 'minecraft:horse_one_cm', 'minecraft:minecart_one_cm', 'minecraft:sprint_one_cm', 'minecraft:strider_one_cm', 'minecraft:swim_one_cm', 'minecraft:walk_on_water_one_cm', 'minecraft:walk_one_cm', 'minecraft:walk_under_water_one_cm' ], Live."Name") -OR array_contains(array['minecraft:killed', 'minecraft:killed_by'], Live."Type") - GROUP BY Live."Type", Live."Name" - HAVING sum(Live."Value") <> max(Agg."Value") OR max(Agg."Value") IS NULL; + SUM(LiveMax."Value") + FROM ( + SELECT Live."Type", + Live."Name", + MAX(Live."Value") AS "Value" + FROM livestatistics as Live + WHERE array_contains(array['minecraft:animals_bred', 'minecraft:play_one_minute', 'minecraft:deaths', 'minecraft:player_kills', 'minecraft:aviate_one_cm', 'minecraft:boat_one_cm', 'minecraft:crouch_one_cm', 'minecraft:horse_one_cm', 'minecraft:minecart_one_cm', 'minecraft:sprint_one_cm', 'minecraft:strider_one_cm', 'minecraft:swim_one_cm', 'minecraft:walk_on_water_one_cm', 'minecraft:walk_one_cm', 'minecraft:walk_under_water_one_cm' ], Live."Name") + OR array_contains(array['minecraft:killed', 'minecraft:killed_by'], Live."Type") + GROUP BY Live."Type", Live."Name", Live."PlayerId" + ) as LiveMax + LEFT JOIN AGGREGATESTATISTICS as Agg + ON LiveMax."Type" = Agg."Type" AND LiveMax."Name" = Agg."Name" + GROUP BY LiveMax."Type", LiveMax."Name" + HAVING SUM(LiveMax."Value") <> MAX(Agg."Value") OR MAX(Agg."Value") IS NULL; """.trimIndent() ) }