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;
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
@ -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;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -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 + ", " +
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user