Refactored UserInfoTable#getAllUserInfo to a better query

This commit is contained in:
Rsl1122 2019-02-01 11:20:24 +02:00
parent d5adc7f428
commit aa3678ba0e
5 changed files with 145 additions and 113 deletions

View File

@ -17,9 +17,11 @@
package com.djrapitops.plan.db.access.queries; package com.djrapitops.plan.db.access.queries;
import com.djrapitops.plan.data.container.GeoInfo; import com.djrapitops.plan.data.container.GeoInfo;
import com.djrapitops.plan.data.container.UserInfo;
import com.djrapitops.plan.db.access.Query; import com.djrapitops.plan.db.access.Query;
import com.djrapitops.plan.db.access.QueryStatement; import com.djrapitops.plan.db.access.QueryStatement;
import com.djrapitops.plan.db.sql.tables.GeoInfoTable; import com.djrapitops.plan.db.sql.tables.GeoInfoTable;
import com.djrapitops.plan.db.sql.tables.UserInfoTable;
import com.djrapitops.plan.db.sql.tables.UsersTable; import com.djrapitops.plan.db.sql.tables.UsersTable;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -97,4 +99,34 @@ public class PlayerFetchQueries {
} }
}; };
} }
public static Query<List<UserInfo>> playerServerSpecificUserInformation(UUID playerUUID) {
String sql = "SELECT " +
UserInfoTable.TABLE_NAME + "." + UserInfoTable.REGISTERED + ", " +
UserInfoTable.BANNED + ", " +
UserInfoTable.OP + ", " +
UserInfoTable.SERVER_UUID +
" FROM " + UserInfoTable.TABLE_NAME +
" WHERE " + UserInfoTable.TABLE_NAME + "." + UserInfoTable.USER_UUID + "=?";
return new QueryStatement<List<UserInfo>>(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, playerUUID.toString());
}
@Override
public List<UserInfo> processResults(ResultSet set) throws SQLException {
List<UserInfo> userInformation = new ArrayList<>();
while (set.next()) {
long registered = set.getLong(UserInfoTable.REGISTERED);
boolean op = set.getBoolean(UserInfoTable.OP);
boolean banned = set.getBoolean(UserInfoTable.BANNED);
UUID serverUUID = UUID.fromString(set.getString(UserInfoTable.SERVER_UUID));
userInformation.add(new UserInfo(playerUUID, serverUUID, registered, op, banned));
}
return userInformation;
}
};
}
} }

View File

@ -0,0 +1,84 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.db.access.queries.containers;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.container.UserInfo;
import com.djrapitops.plan.data.store.containers.DataContainer;
import com.djrapitops.plan.data.store.containers.PerServerContainer;
import com.djrapitops.plan.data.store.keys.PerServerKeys;
import com.djrapitops.plan.data.store.keys.PlayerKeys;
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
import com.djrapitops.plan.db.SQLDB;
import com.djrapitops.plan.db.access.Query;
import com.djrapitops.plan.db.access.queries.PlayerFetchQueries;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* Used to get a PerServerContainer for a specific player.
*
* @author Rsl1122
*/
public class PerServerContainerQuery implements Query<PerServerContainer> {
private final UUID playerUUID;
public PerServerContainerQuery(UUID playerUUID) {
this.playerUUID = playerUUID;
}
@Override
public PerServerContainer executeQuery(SQLDB db) {
PerServerContainer perServerContainer = new PerServerContainer();
List<UserInfo> userInformation = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
for (UserInfo userInfo : userInformation) {
UUID serverUUID = userInfo.getServerUUID();
DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer());
container.putRawData(PlayerKeys.REGISTERED, userInfo.getRegistered());
container.putRawData(PlayerKeys.BANNED, userInfo.isBanned());
container.putRawData(PlayerKeys.OPERATOR, userInfo.isOperator());
perServerContainer.put(serverUUID, container);
}
Map<UUID, List<Session>> sessions = db.getSessionsTable().getSessions(playerUUID);
for (Map.Entry<UUID, List<Session>> entry : sessions.entrySet()) {
UUID serverUUID = entry.getKey();
List<Session> serverSessions = entry.getValue();
DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer());
container.putRawData(PerServerKeys.SESSIONS, serverSessions);
container.putSupplier(PerServerKeys.LAST_SEEN, () -> SessionsMutator.forContainer(container).toLastSeen());
container.putSupplier(PerServerKeys.WORLD_TIMES, () -> SessionsMutator.forContainer(container).toTotalWorldTimes());
container.putSupplier(PerServerKeys.PLAYER_KILLS, () -> SessionsMutator.forContainer(container).toPlayerKillList());
container.putSupplier(PerServerKeys.PLAYER_DEATHS, () -> SessionsMutator.forContainer(container).toPlayerDeathList());
container.putSupplier(PerServerKeys.PLAYER_KILL_COUNT, () -> container.getUnsafe(PerServerKeys.PLAYER_KILLS).size());
container.putSupplier(PerServerKeys.MOB_KILL_COUNT, () -> SessionsMutator.forContainer(container).toMobKillCount());
container.putSupplier(PerServerKeys.DEATH_COUNT, () -> SessionsMutator.forContainer(container).toDeathCount());
perServerContainer.put(serverUUID, container);
}
return perServerContainer;
}
}

View File

@ -17,11 +17,7 @@
package com.djrapitops.plan.db.access.queries.containers; package com.djrapitops.plan.db.access.queries.containers;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.container.UserInfo;
import com.djrapitops.plan.data.store.containers.DataContainer;
import com.djrapitops.plan.data.store.containers.PerServerContainer;
import com.djrapitops.plan.data.store.containers.PlayerContainer; import com.djrapitops.plan.data.store.containers.PlayerContainer;
import com.djrapitops.plan.data.store.keys.PerServerKeys;
import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.keys.PlayerKeys;
import com.djrapitops.plan.data.store.keys.SessionKeys; import com.djrapitops.plan.data.store.keys.SessionKeys;
import com.djrapitops.plan.data.store.mutators.PerServerMutator; import com.djrapitops.plan.data.store.mutators.PerServerMutator;
@ -34,7 +30,6 @@ import com.djrapitops.plan.db.access.queries.PlayerFetchQueries;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
@ -61,7 +56,7 @@ public class PlayerContainerQuery implements Query<PlayerContainer> {
container.putCachingSupplier(PlayerKeys.GEO_INFO, () -> db.query(PlayerFetchQueries.playerGeoInfo(uuid))); container.putCachingSupplier(PlayerKeys.GEO_INFO, () -> db.query(PlayerFetchQueries.playerGeoInfo(uuid)));
container.putCachingSupplier(PlayerKeys.PING, () -> db.getPingTable().getPing(uuid)); container.putCachingSupplier(PlayerKeys.PING, () -> db.getPingTable().getPing(uuid));
container.putCachingSupplier(PlayerKeys.NICKNAMES, () -> db.getNicknamesTable().getNicknameInformation(uuid)); container.putCachingSupplier(PlayerKeys.NICKNAMES, () -> db.getNicknamesTable().getNicknameInformation(uuid));
container.putCachingSupplier(PlayerKeys.PER_SERVER, () -> getPerServerData(db)); container.putCachingSupplier(PlayerKeys.PER_SERVER, () -> db.query(new PerServerContainerQuery(uuid)));
container.putSupplier(PlayerKeys.BANNED, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isBanned()); container.putSupplier(PlayerKeys.BANNED, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isBanned());
container.putSupplier(PlayerKeys.OPERATOR, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isOperator()); container.putSupplier(PlayerKeys.OPERATOR, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isOperator());
@ -91,42 +86,4 @@ public class PlayerContainerQuery implements Query<PlayerContainer> {
return container; return container;
} }
private PerServerContainer getPerServerData(SQLDB db) {
PerServerContainer perServerContainer = new PerServerContainer();
Map<UUID, UserInfo> allUserInfo = db.getUserInfoTable().getAllUserInfo(uuid);
for (Map.Entry<UUID, UserInfo> entry : allUserInfo.entrySet()) {
UUID serverUUID = entry.getKey();
UserInfo info = entry.getValue();
DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer());
container.putRawData(PlayerKeys.REGISTERED, info.getRegistered());
container.putRawData(PlayerKeys.BANNED, info.isBanned());
container.putRawData(PlayerKeys.OPERATOR, info.isOperator());
perServerContainer.put(serverUUID, container);
}
Map<UUID, List<Session>> sessions = db.getSessionsTable().getSessions(uuid);
for (Map.Entry<UUID, List<Session>> entry : sessions.entrySet()) {
UUID serverUUID = entry.getKey();
List<Session> serverSessions = entry.getValue();
DataContainer container = perServerContainer.getOrDefault(serverUUID, new DataContainer());
container.putRawData(PerServerKeys.SESSIONS, serverSessions);
container.putSupplier(PerServerKeys.LAST_SEEN, () -> SessionsMutator.forContainer(container).toLastSeen());
container.putSupplier(PerServerKeys.WORLD_TIMES, () -> SessionsMutator.forContainer(container).toTotalWorldTimes());
container.putSupplier(PerServerKeys.PLAYER_KILLS, () -> SessionsMutator.forContainer(container).toPlayerKillList());
container.putSupplier(PerServerKeys.PLAYER_DEATHS, () -> SessionsMutator.forContainer(container).toPlayerDeathList());
container.putSupplier(PerServerKeys.PLAYER_KILL_COUNT, () -> container.getUnsafe(PerServerKeys.PLAYER_KILLS).size());
container.putSupplier(PerServerKeys.MOB_KILL_COUNT, () -> SessionsMutator.forContainer(container).toMobKillCount());
container.putSupplier(PerServerKeys.DEATH_COUNT, () -> SessionsMutator.forContainer(container).toDeathCount());
perServerContainer.put(serverUUID, container);
}
return perServerContainer;
}
} }

View File

@ -143,36 +143,6 @@ public class UserInfoTable extends Table {
}); });
} }
public Map<UUID, UserInfo> getAllUserInfo(UUID uuid) {
String sql = "SELECT " +
TABLE_NAME + "." + REGISTERED + ", " +
BANNED + ", " +
OP + ", " +
SERVER_UUID +
" FROM " + TABLE_NAME +
" WHERE " + TABLE_NAME + "." + USER_UUID + "=?";
return query(new QueryStatement<Map<UUID, UserInfo>>(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, uuid.toString());
}
@Override
public Map<UUID, UserInfo> processResults(ResultSet set) throws SQLException {
Map<UUID, UserInfo> map = new HashMap<>();
while (set.next()) {
long registered = set.getLong(REGISTERED);
boolean op = set.getBoolean(OP);
boolean banned = set.getBoolean(BANNED);
UUID serverUUID = UUID.fromString(set.getString(SERVER_UUID));
map.put(serverUUID, new UserInfo(uuid, serverUUID, registered, op, banned));
}
return map;
}
});
}
public List<UserInfo> getServerUserInfo(UUID serverUUID) { public List<UserInfo> getServerUserInfo(UUID serverUUID) {
String sql = "SELECT " + String sql = "SELECT " +
TABLE_NAME + "." + REGISTERED + ", " + TABLE_NAME + "." + REGISTERED + ", " +

View File

@ -398,63 +398,52 @@ public abstract class CommonDBTest {
} }
@Test @Test
public void testUserInfoTableRegisterRegistered() throws DBInitException { public void userInfoTableStoresCorrectUserInformation() {
saveUserOne(); userRegisterChecksReturnCorrectValues();
List<UserInfo> userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
List<UserInfo> expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, false, false));
assertEquals(expected, userInfo);
}
@Test
public void userRegisterChecksReturnCorrectValues() {
UsersTable usersTable = db.getUsersTable(); UsersTable usersTable = db.getUsersTable();
assertFalse(usersTable.isRegistered(playerUUID));
saveUserOne();
assertTrue(usersTable.isRegistered(playerUUID)); assertTrue(usersTable.isRegistered(playerUUID));
UserInfoTable userInfoTable = db.getUserInfoTable(); UserInfoTable userInfoTable = db.getUserInfoTable();
assertFalse(userInfoTable.isRegistered(playerUUID)); assertFalse(userInfoTable.isRegistered(playerUUID));
userInfoTable.registerUserInfo(playerUUID, 223456789L); userInfoTable.registerUserInfo(playerUUID, 223456789L);
commitTest();
assertTrue(usersTable.isRegistered(playerUUID));
assertTrue(userInfoTable.isRegistered(playerUUID)); assertTrue(userInfoTable.isRegistered(playerUUID));
UserInfo userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); assertEquals(123456789L, (long) db.getUsersTable().getRegisterDates().get(0));
assertEquals(playerUUID, userInfo.getPlayerUuid());
assertEquals(123456789L, (long) usersTable.getRegisterDates().get(0));
assertEquals(223456789L, userInfo.getRegistered());
assertFalse(userInfo.isBanned());
assertFalse(userInfo.isOperator());
assertEquals(userInfo, userInfoTable.getServerUserInfo().get(0));
} }
@Test @Test
public void testUserInfoTableUpdateBannedOpped() throws DBInitException { public void userInfoTableUpdatesBanStatus() {
UsersTable usersTable = db.getUsersTable(); userRegisterChecksReturnCorrectValues();
usersTable.registerUser(playerUUID, 223456789L, "Test_name");
UserInfoTable userInfoTable = db.getUserInfoTable();
userInfoTable.registerUserInfo(playerUUID, 223456789L);
assertTrue(userInfoTable.isRegistered(playerUUID));
userInfoTable.updateOpStatus(playerUUID, true); db.getUserInfoTable().updateBanStatus(playerUUID, true);
userInfoTable.updateBanStatus(playerUUID, true);
commitTest();
UserInfo userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); List<UserInfo> userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
assertTrue(userInfo.isBanned()); List<UserInfo> expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, true, false));
assertTrue(userInfo.isOperator());
userInfoTable.updateOpStatus(playerUUID, false); assertEquals(expected, userInfo);
userInfoTable.updateBanStatus(playerUUID, true); }
commitTest();
userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); @Test
public void userInfoTableUpdatesOperatorStatus() {
userRegisterChecksReturnCorrectValues();
assertTrue(userInfo.isBanned()); db.getUserInfoTable().updateOpStatus(playerUUID, true);
assertFalse(userInfo.isOperator());
userInfoTable.updateOpStatus(playerUUID, true); List<UserInfo> userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
userInfoTable.updateBanStatus(playerUUID, false); List<UserInfo> expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, false, true));
commitTest();
userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID); assertEquals(expected, userInfo);
assertFalse(userInfo.isBanned());
assertTrue(userInfo.isOperator());
} }
@Test @Test