From 4315b53ca3e2d3831b4d1a7545358d56d7bc335b Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sun, 27 Jan 2019 11:42:40 +0200 Subject: [PATCH] [#900] Refactored WorldTimesTable#getWorldTimesOfServer to a query: - Changed GROUP BY to group by world_name instead, this should fix the issue, even if it could not be reproduced. --- .../plan/db/sql/queries/AggregateQueries.java | 49 +++++++++++++++++-- .../containers/ServerContainerQuery.java | 2 +- .../plan/db/sql/tables/WorldTimesTable.java | 42 ---------------- .../com/djrapitops/plan/db/CommonDBTest.java | 4 +- 4 files changed, 48 insertions(+), 49 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java index eb340d55d..8aaa4647e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java @@ -16,13 +16,12 @@ */ package com.djrapitops.plan.db.sql.queries; +import com.djrapitops.plan.data.time.GMTimes; +import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.db.access.Query; import com.djrapitops.plan.db.access.QueryAllStatement; import com.djrapitops.plan.db.access.QueryStatement; -import com.djrapitops.plan.db.sql.tables.CommandUseTable; -import com.djrapitops.plan.db.sql.tables.ServerTable; -import com.djrapitops.plan.db.sql.tables.UserInfoTable; -import com.djrapitops.plan.db.sql.tables.UsersTable; +import com.djrapitops.plan.db.sql.tables.*; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -133,4 +132,46 @@ public class AggregateQueries { } }; } + + public static Query totalWorldTimes(UUID serverUUID) { + String worldIDColumn = WorldTable.TABLE_NAME + "." + WorldTable.ID; + String worldNameColumn = WorldTable.TABLE_NAME + "." + WorldTable.NAME + " as world"; + String sql = "SELECT " + + "SUM(" + WorldTimesTable.SURVIVAL + ") as survival, " + + "SUM(" + WorldTimesTable.CREATIVE + ") as creative, " + + "SUM(" + WorldTimesTable.ADVENTURE + ") as adventure, " + + "SUM(" + WorldTimesTable.SPECTATOR + ") as spectator, " + + worldNameColumn + + " FROM " + WorldTimesTable.TABLE_NAME + + " INNER JOIN " + WorldTable.TABLE_NAME + " on " + worldIDColumn + "=" + WorldTimesTable.WORLD_ID + + " WHERE " + WorldTimesTable.TABLE_NAME + "." + WorldTimesTable.SERVER_UUID + "=?" + + " GROUP BY world"; + + return new QueryStatement(sql, 1000) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setString(1, serverUUID.toString()); + } + + @Override + public WorldTimes processResults(ResultSet set) throws SQLException { + String[] gms = GMTimes.getGMKeyArray(); + + WorldTimes worldTimes = new WorldTimes(new HashMap<>()); + while (set.next()) { + String worldName = set.getString("world"); + + Map gmMap = new HashMap<>(); + gmMap.put(gms[0], set.getLong("survival")); + gmMap.put(gms[1], set.getLong("creative")); + gmMap.put(gms[2], set.getLong("adventure")); + gmMap.put(gms[3], set.getLong("spectator")); + GMTimes gmTimes = new GMTimes(gmMap); + + worldTimes.setGMTimesForWorld(worldName, gmTimes); + } + return worldTimes; + } + }; + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/containers/ServerContainerQuery.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/containers/ServerContainerQuery.java index d8e07b59f..d9105c7d6 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/containers/ServerContainerQuery.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/containers/ServerContainerQuery.java @@ -76,7 +76,7 @@ public class ServerContainerQuery implements Query { }); container.putCachingSupplier(ServerKeys.COMMAND_USAGE, () -> db.query(AggregateQueries.commandUsageCounts(serverUUID))); - container.putCachingSupplier(ServerKeys.WORLD_TIMES, () -> db.getWorldTimesTable().getWorldTimesOfServer(serverUUID)); + container.putCachingSupplier(ServerKeys.WORLD_TIMES, () -> db.query(AggregateQueries.totalWorldTimes(serverUUID))); // Calculating getters container.putCachingSupplier(ServerKeys.OPERATORS, () -> PlayersMutator.forContainer(container).operators()); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/WorldTimesTable.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/WorldTimesTable.java index 69dbad0b0..33a6c920f 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/WorldTimesTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/WorldTimesTable.java @@ -184,48 +184,6 @@ public class WorldTimesTable extends Table { }); } - public WorldTimes getWorldTimesOfServer(UUID serverUUID) { - String worldIDColumn = worldTable + "." + WorldTable.ID; - String worldNameColumn = worldTable + "." + WorldTable.NAME + " as world_name"; - String sql = "SELECT " + - "SUM(" + SURVIVAL + ") as survival, " + - "SUM(" + CREATIVE + ") as creative, " + - "SUM(" + ADVENTURE + ") as adventure, " + - "SUM(" + SPECTATOR + ") as spectator, " + - worldNameColumn + - " FROM " + tableName + - " INNER JOIN " + worldTable + " on " + worldIDColumn + "=" + WORLD_ID + - " WHERE " + tableName + "." + SERVER_UUID + "=?" + - " GROUP BY " + WORLD_ID; - - return query(new QueryStatement(sql, 1000) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setString(1, serverUUID.toString()); - } - - @Override - public WorldTimes processResults(ResultSet set) throws SQLException { - String[] gms = GMTimes.getGMKeyArray(); - - WorldTimes worldTimes = new WorldTimes(new HashMap<>()); - while (set.next()) { - String worldName = set.getString("world_name"); - - Map gmMap = new HashMap<>(); - gmMap.put(gms[0], set.getLong("survival")); - gmMap.put(gms[1], set.getLong("creative")); - gmMap.put(gms[2], set.getLong("adventure")); - gmMap.put(gms[3], set.getLong("spectator")); - GMTimes gmTimes = new GMTimes(gmMap); - - worldTimes.setGMTimesForWorld(worldName, gmTimes); - } - return worldTimes; - } - }); - } - public WorldTimes getWorldTimesOfUser(UUID uuid) { String worldIDColumn = worldTable + "." + WorldTable.ID; String worldNameColumn = worldTable + "." + WorldTable.NAME + " as world_name"; diff --git a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java index 4db541eed..43fa2ad4c 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java @@ -775,13 +775,13 @@ public abstract class CommonDBTest { @Test public void testGetServerWorldTimes() { testSaveSessionsWorldTimes(); - WorldTimes worldTimesOfServer = db.getWorldTimesTable().getWorldTimesOfServer(serverUUID); + WorldTimes worldTimesOfServer = db.query(AggregateQueries.totalWorldTimes(serverUUID)); assertEquals(createWorldTimes(), worldTimesOfServer); } @Test public void testGetServerWorldTimesNoSessions() { - WorldTimes worldTimesOfServer = db.getWorldTimesTable().getWorldTimesOfServer(serverUUID); + WorldTimes worldTimesOfServer = db.query(AggregateQueries.totalWorldTimes(serverUUID)); assertEquals(new WorldTimes(new HashMap<>()), worldTimesOfServer); }