diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/batch/LargeFetchQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/batch/LargeFetchQueries.java index f6345c1df..d3d1fea0a 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/batch/LargeFetchQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/batch/LargeFetchQueries.java @@ -20,6 +20,7 @@ import com.djrapitops.plan.data.WebUser; import com.djrapitops.plan.data.container.GeoInfo; import com.djrapitops.plan.data.container.Ping; import com.djrapitops.plan.data.container.PlayerKill; +import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.store.objects.Nickname; import com.djrapitops.plan.db.access.Query; import com.djrapitops.plan.db.access.QueryAllStatement; @@ -314,4 +315,65 @@ public class LargeFetchQueries { } }; } + + /** + * Query the database for Session data without kill, death or world data. + * + * @return Multimap: Server UUID - (Player UUID - List of sessions) + */ + public static Query>>> fetchAllSessionsWithoutKillOrWorldData() { + String sql = "SELECT " + + SessionsTable.Col.ID + ", " + + SessionsTable.Col.UUID + ", " + + SessionsTable.Col.SERVER_UUID + ", " + + SessionsTable.Col.SESSION_START + ", " + + SessionsTable.Col.SESSION_END + ", " + + SessionsTable.Col.DEATHS + ", " + + SessionsTable.Col.MOB_KILLS + ", " + + SessionsTable.Col.AFK_TIME + + " FROM " + SessionsTable.TABLE_NAME; + + return new QueryAllStatement>>>(sql, 20000) { + @Override + public Map>> processResults(ResultSet set) throws SQLException { + Map>> map = new HashMap<>(); + while (set.next()) { + UUID serverUUID = UUID.fromString(set.getString(SessionsTable.Col.SERVER_UUID.get())); + UUID uuid = UUID.fromString(set.getString(SessionsTable.Col.UUID.get())); + + Map> sessionsByUser = map.getOrDefault(serverUUID, new HashMap<>()); + List sessions = sessionsByUser.getOrDefault(uuid, new ArrayList<>()); + + long start = set.getLong(SessionsTable.Col.SESSION_START.get()); + long end = set.getLong(SessionsTable.Col.SESSION_END.get()); + + int deaths = set.getInt(SessionsTable.Col.DEATHS.get()); + int mobKills = set.getInt(SessionsTable.Col.MOB_KILLS.get()); + int id = set.getInt(SessionsTable.Col.ID.get()); + + long timeAFK = set.getLong(SessionsTable.Col.AFK_TIME.get()); + + sessions.add(new Session(id, uuid, serverUUID, start, end, mobKills, deaths, timeAFK)); + + sessionsByUser.put(uuid, sessions); + map.put(serverUUID, sessionsByUser); + } + return map; + } + }; + } + + /** + * Query the database for Session data with kill, death or world data. + * + * @return Multimap: Server UUID - (Player UUID - List of sessions) + */ + public static Query>>> fetchAllSessionsWithKillAndWorldData() { + return db -> { + Map>> sessions = db.query(fetchAllSessionsWithoutKillOrWorldData()); + db.getKillsTable().addKillsToSessions(sessions); + db.getWorldTimesTable().addWorldTimesToSessions(sessions); + return sessions; + }; + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/SessionsTable.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/SessionsTable.java index b7b431e15..ccd8690b8 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/SessionsTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/SessionsTable.java @@ -30,6 +30,7 @@ import com.djrapitops.plan.db.sql.parsing.Column; import com.djrapitops.plan.db.sql.parsing.Select; import com.djrapitops.plan.db.sql.parsing.Sql; import com.djrapitops.plan.db.sql.parsing.TableSqlParser; +import com.djrapitops.plan.db.sql.queries.batch.LargeFetchQueries; import com.djrapitops.plugin.utilities.Verify; import java.sql.PreparedStatement; @@ -439,53 +440,6 @@ public class SessionsTable extends UserUUIDTable { }); } - public Map>> getAllSessions(boolean getKillsAndWorldTimes) { - String sql = "SELECT " + - Col.ID + ", " + - Col.UUID + ", " + - Col.SERVER_UUID + ", " + - Col.SESSION_START + ", " + - Col.SESSION_END + ", " + - Col.DEATHS + ", " + - Col.MOB_KILLS + ", " + - Col.AFK_TIME + - " FROM " + tableName; - - return query(new QueryAllStatement>>>(sql, 20000) { - @Override - public Map>> processResults(ResultSet set) throws SQLException { - Map>> map = new HashMap<>(); - while (set.next()) { - UUID serverUUID = UUID.fromString(set.getString(Col.SERVER_UUID.get())); - UUID uuid = UUID.fromString(set.getString(Col.UUID.get())); - - Map> sessionsByUser = map.getOrDefault(serverUUID, new HashMap<>()); - List sessions = sessionsByUser.getOrDefault(uuid, new ArrayList<>()); - - long start = set.getLong(Col.SESSION_START.get()); - long end = set.getLong(Col.SESSION_END.get()); - - int deaths = set.getInt(Col.DEATHS.get()); - int mobKills = set.getInt(Col.MOB_KILLS.get()); - int id = set.getInt(Col.ID.get()); - - long timeAFK = set.getLong(Col.AFK_TIME.get()); - - Session session = new Session(id, uuid, serverUUID, start, end, mobKills, deaths, timeAFK); - sessions.add(session); - - sessionsByUser.put(uuid, sessions); - map.put(serverUUID, sessionsByUser); - } - if (getKillsAndWorldTimes) { - db.getKillsTable().addKillsToSessions(map); - db.getWorldTimesTable().addWorldTimesToSessions(map); - } - return map; - } - }); - } - public void insertSessions(Map>> allSessions, boolean saveKillsAndWorldTimes) { if (Verify.isEmpty(allSessions)) { return; @@ -514,7 +468,7 @@ public class SessionsTable extends UserUUIDTable { } }); if (saveKillsAndWorldTimes) { - Map>> savedSessions = getAllSessions(false); + Map>> savedSessions = db.query(LargeFetchQueries.fetchAllSessionsWithoutKillOrWorldData()); matchSessionIDs(allSessions, savedSessions); db.getKillsTable().savePlayerKills(allSessions); db.getWorldTimesTable().saveWorldTimes(allSessions); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/move/BatchOperationTable.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/move/BatchOperationTable.java index 0bf1a0bae..732a426ce 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/move/BatchOperationTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/move/BatchOperationTable.java @@ -171,6 +171,6 @@ public class BatchOperationTable extends Table { if (toDB.equals(this)) { return; } - toDB.db.getSessionsTable().insertSessions(db.getSessionsTable().getAllSessions(true), true); + toDB.db.getSessionsTable().insertSessions(db.query(LargeFetchQueries.fetchAllSessionsWithKillAndWorldData()), true); } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java index 3b1ecaa4e..3d7174592 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java @@ -198,7 +198,7 @@ public class SQLFetchOps extends SQLOps implements FetchOperations { Map> allPings = db.query(LargeFetchQueries.fetchAllPingData()); Map> allNicknames = db.query(LargeFetchQueries.fetchAllNicknameDataByPlayerUUIDs()); - Map>> sessions = sessionsTable.getAllSessions(false); + Map>> sessions = db.query(LargeFetchQueries.fetchAllSessionsWithoutKillOrWorldData()); Map> allUserInfo = userInfoTable.getAllUserInfo(); Map perServerInfo = getPerServerData(sessions, allUserInfo, allPings); @@ -419,7 +419,7 @@ public class SQLFetchOps extends SQLOps implements FetchOperations { @Override public Map>> getSessionsWithNoExtras() { - return sessionsTable.getAllSessions(false); + return db.query(LargeFetchQueries.fetchAllSessionsWithoutKillOrWorldData()); } @Override 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 7365323de..f2e2210bf 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 @@ -799,7 +799,7 @@ public abstract class CommonDBTest { sessionsTable.insertSessions(map, true); - Map>> allSessions = sessionsTable.getAllSessions(true); + Map>> allSessions = db.query(LargeFetchQueries.fetchAllSessionsWithKillAndWorldData()); assertEquals(worldTimes, allSessions.get(serverUUID).get(playerUUID).get(0).getUnsafe(SessionKeys.WORLD_TIMES)); }