mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-03-10 13:49:17 +01:00
Refactored UserInfoTable#getAllUserInfo to a better query
This commit is contained in:
parent
d5adc7f428
commit
aa3678ba0e
@ -17,9 +17,11 @@
|
||||
package com.djrapitops.plan.db.access.queries;
|
||||
|
||||
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.QueryStatement;
|
||||
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 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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -17,11 +17,7 @@
|
||||
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.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.SessionKeys;
|
||||
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.List;
|
||||
import java.util.Map;
|
||||
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.PING, () -> db.getPingTable().getPing(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.OPERATOR, () -> new PerServerMutator(container.getUnsafe(PlayerKeys.PER_SERVER)).isOperator());
|
||||
@ -91,42 +86,4 @@ public class PlayerContainerQuery implements Query<PlayerContainer> {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
@ -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) {
|
||||
String sql = "SELECT " +
|
||||
TABLE_NAME + "." + REGISTERED + ", " +
|
||||
|
@ -398,63 +398,52 @@ public abstract class CommonDBTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUserInfoTableRegisterRegistered() throws DBInitException {
|
||||
saveUserOne();
|
||||
public void userInfoTableStoresCorrectUserInformation() {
|
||||
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();
|
||||
assertFalse(usersTable.isRegistered(playerUUID));
|
||||
saveUserOne();
|
||||
assertTrue(usersTable.isRegistered(playerUUID));
|
||||
|
||||
UserInfoTable userInfoTable = db.getUserInfoTable();
|
||||
assertFalse(userInfoTable.isRegistered(playerUUID));
|
||||
|
||||
userInfoTable.registerUserInfo(playerUUID, 223456789L);
|
||||
commitTest();
|
||||
|
||||
assertTrue(usersTable.isRegistered(playerUUID));
|
||||
assertTrue(userInfoTable.isRegistered(playerUUID));
|
||||
|
||||
UserInfo userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID);
|
||||
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));
|
||||
assertEquals(123456789L, (long) db.getUsersTable().getRegisterDates().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUserInfoTableUpdateBannedOpped() throws DBInitException {
|
||||
UsersTable usersTable = db.getUsersTable();
|
||||
usersTable.registerUser(playerUUID, 223456789L, "Test_name");
|
||||
UserInfoTable userInfoTable = db.getUserInfoTable();
|
||||
userInfoTable.registerUserInfo(playerUUID, 223456789L);
|
||||
assertTrue(userInfoTable.isRegistered(playerUUID));
|
||||
public void userInfoTableUpdatesBanStatus() {
|
||||
userRegisterChecksReturnCorrectValues();
|
||||
|
||||
userInfoTable.updateOpStatus(playerUUID, true);
|
||||
userInfoTable.updateBanStatus(playerUUID, true);
|
||||
commitTest();
|
||||
db.getUserInfoTable().updateBanStatus(playerUUID, true);
|
||||
|
||||
UserInfo userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID);
|
||||
assertTrue(userInfo.isBanned());
|
||||
assertTrue(userInfo.isOperator());
|
||||
List<UserInfo> userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
|
||||
List<UserInfo> expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, true, false));
|
||||
|
||||
userInfoTable.updateOpStatus(playerUUID, false);
|
||||
userInfoTable.updateBanStatus(playerUUID, true);
|
||||
commitTest();
|
||||
assertEquals(expected, userInfo);
|
||||
}
|
||||
|
||||
userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID);
|
||||
@Test
|
||||
public void userInfoTableUpdatesOperatorStatus() {
|
||||
userRegisterChecksReturnCorrectValues();
|
||||
|
||||
assertTrue(userInfo.isBanned());
|
||||
assertFalse(userInfo.isOperator());
|
||||
db.getUserInfoTable().updateOpStatus(playerUUID, true);
|
||||
|
||||
userInfoTable.updateOpStatus(playerUUID, true);
|
||||
userInfoTable.updateBanStatus(playerUUID, false);
|
||||
commitTest();
|
||||
List<UserInfo> userInfo = db.query(PlayerFetchQueries.playerServerSpecificUserInformation(playerUUID));
|
||||
List<UserInfo> expected = Collections.singletonList(new UserInfo(playerUUID, serverUUID, 223456789L, false, true));
|
||||
|
||||
userInfo = userInfoTable.getAllUserInfo(playerUUID).get(serverUUID);
|
||||
|
||||
assertFalse(userInfo.isBanned());
|
||||
assertTrue(userInfo.isOperator());
|
||||
assertEquals(expected, userInfo);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
Loading…
Reference in New Issue
Block a user