mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-03-10 13:49:17 +01:00
AggregateQueries for server user counts:
- Removed CountOperations, SQLCountOps - Removed UserInfoTable#getServerUserCount - Removed UserInfoTable#getPlayersRegisteredForServers - Optimized server box generation for network page, user counts - Deprecated NetworkKeys.SERVER_REGISTER_DATA, no longer supported.
This commit is contained in:
parent
fbb1bb72de
commit
817ce5bbd9
@ -23,6 +23,7 @@ import com.djrapitops.plan.data.store.keys.ServerKeys;
|
|||||||
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
||||||
import com.djrapitops.plan.data.store.mutators.TPSMutator;
|
import com.djrapitops.plan.data.store.mutators.TPSMutator;
|
||||||
import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation;
|
import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation;
|
||||||
|
import com.djrapitops.plan.db.sql.queries.AggregateQueries;
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.Server;
|
import com.djrapitops.plan.system.info.server.Server;
|
||||||
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
|
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
|
||||||
@ -100,19 +101,16 @@ public class NetworkContainer extends DataContainer {
|
|||||||
putSupplier(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA, () -> dbSystem.getDatabase().fetch().getPlayersOnlineForServers(
|
putSupplier(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA, () -> dbSystem.getDatabase().fetch().getPlayersOnlineForServers(
|
||||||
getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>()))
|
getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>()))
|
||||||
);
|
);
|
||||||
putSupplier(NetworkKeys.SERVER_REGISTER_DATA, () -> dbSystem.getDatabase().fetch().getPlayersRegisteredForServers(
|
|
||||||
getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>()))
|
|
||||||
);
|
|
||||||
putSupplier(NetworkKeys.SERVERS_TAB, () -> {
|
putSupplier(NetworkKeys.SERVERS_TAB, () -> {
|
||||||
StringBuilder serverBoxes = new StringBuilder();
|
StringBuilder serverBoxes = new StringBuilder();
|
||||||
Map<Integer, List<TPS>> playersOnlineData = getValue(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA).orElse(new HashMap<>());
|
Map<Integer, List<TPS>> playersOnlineData = getValue(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA).orElse(new HashMap<>());
|
||||||
Map<UUID, Integer> registerData = getValue(NetworkKeys.SERVER_REGISTER_DATA).orElse(new HashMap<>());
|
Map<UUID, Integer> userCounts = dbSystem.getDatabase().query(AggregateQueries.serverUserCounts());
|
||||||
Collection<Server> servers = getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>());
|
Collection<Server> servers = getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>());
|
||||||
servers.stream()
|
servers.stream()
|
||||||
.sorted((one, two) -> String.CASE_INSENSITIVE_ORDER.compare(one.getName(), two.getName()))
|
.sorted((one, two) -> String.CASE_INSENSITIVE_ORDER.compare(one.getName(), two.getName()))
|
||||||
.forEach(server -> {
|
.forEach(server -> {
|
||||||
TPSMutator tpsMutator = new TPSMutator(playersOnlineData.getOrDefault(server.getId(), new ArrayList<>()));
|
TPSMutator tpsMutator = new TPSMutator(playersOnlineData.getOrDefault(server.getId(), new ArrayList<>()));
|
||||||
int registered = registerData.getOrDefault(server.getUuid(), 0);
|
int registered = userCounts.getOrDefault(server.getUuid(), 0);
|
||||||
NetworkServerBox serverBox = new NetworkServerBox(server, registered, tpsMutator, graphs);
|
NetworkServerBox serverBox = new NetworkServerBox(server, registered, tpsMutator, graphs);
|
||||||
serverBoxes.append(serverBox.toHtml());
|
serverBoxes.append(serverBox.toHtml());
|
||||||
});
|
});
|
||||||
|
@ -74,6 +74,7 @@ public class NetworkKeys {
|
|||||||
public static final Key<Collection<Server>> BUKKIT_SERVERS = new Key<>(new Type<Collection<Server>>() {}, "BUKKIT_SERVERS");
|
public static final Key<Collection<Server>> BUKKIT_SERVERS = new Key<>(new Type<Collection<Server>>() {}, "BUKKIT_SERVERS");
|
||||||
public static final Key<TreeMap<Long, Map<String, Set<UUID>>>> ACTIVITY_DATA = CommonKeys.ACTIVITY_DATA;
|
public static final Key<TreeMap<Long, Map<String, Set<UUID>>>> ACTIVITY_DATA = CommonKeys.ACTIVITY_DATA;
|
||||||
public static final Key<Map<Integer, List<TPS>>> NETWORK_PLAYER_ONLINE_DATA = new Key<>(new Type<Map<Integer, List<TPS>>>() {}, "NETWORK_PLAYER_ONLINE_DATA");
|
public static final Key<Map<Integer, List<TPS>>> NETWORK_PLAYER_ONLINE_DATA = new Key<>(new Type<Map<Integer, List<TPS>>>() {}, "NETWORK_PLAYER_ONLINE_DATA");
|
||||||
|
@Deprecated
|
||||||
public static final Key<Map<UUID, Integer>> SERVER_REGISTER_DATA = new Key<>(new Type<Map<UUID, Integer>>() {}, "SERVER_REGISTER_DATA");
|
public static final Key<Map<UUID, Integer>> SERVER_REGISTER_DATA = new Key<>(new Type<Map<UUID, Integer>>() {}, "SERVER_REGISTER_DATA");
|
||||||
|
|
||||||
private NetworkKeys() {
|
private NetworkKeys() {
|
||||||
|
@ -65,9 +65,6 @@ public interface Database {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
SearchOperations search();
|
SearchOperations search();
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
CountOperations count();
|
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
SaveOperations save();
|
SaveOperations save();
|
||||||
|
|
||||||
|
@ -93,7 +93,6 @@ public abstract class SQLDB extends AbstractDatabase {
|
|||||||
private final SQLFetchOps fetchOps;
|
private final SQLFetchOps fetchOps;
|
||||||
private final SQLRemoveOps removeOps;
|
private final SQLRemoveOps removeOps;
|
||||||
private final SQLSearchOps searchOps;
|
private final SQLSearchOps searchOps;
|
||||||
private final SQLCountOps countOps;
|
|
||||||
private final SQLSaveOps saveOps;
|
private final SQLSaveOps saveOps;
|
||||||
|
|
||||||
private PluginTask dbCleanTask;
|
private PluginTask dbCleanTask;
|
||||||
@ -136,7 +135,6 @@ public abstract class SQLDB extends AbstractDatabase {
|
|||||||
checkOps = new SQLCheckOps(this);
|
checkOps = new SQLCheckOps(this);
|
||||||
fetchOps = new SQLFetchOps(this);
|
fetchOps = new SQLFetchOps(this);
|
||||||
removeOps = new SQLRemoveOps(this);
|
removeOps = new SQLRemoveOps(this);
|
||||||
countOps = new SQLCountOps(this);
|
|
||||||
searchOps = new SQLSearchOps(this);
|
searchOps = new SQLSearchOps(this);
|
||||||
saveOps = new SQLSaveOps(this);
|
saveOps = new SQLSaveOps(this);
|
||||||
}
|
}
|
||||||
@ -476,12 +474,6 @@ public abstract class SQLDB extends AbstractDatabase {
|
|||||||
return searchOps;
|
return searchOps;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public CountOperations count() {
|
|
||||||
return countOps;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public SaveOperations save() {
|
public SaveOperations save() {
|
||||||
|
@ -18,10 +18,16 @@ package com.djrapitops.plan.db.sql.queries;
|
|||||||
|
|
||||||
import com.djrapitops.plan.db.access.Query;
|
import com.djrapitops.plan.db.access.Query;
|
||||||
import com.djrapitops.plan.db.access.QueryAllStatement;
|
import com.djrapitops.plan.db.access.QueryAllStatement;
|
||||||
|
import com.djrapitops.plan.db.access.QueryStatement;
|
||||||
|
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.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static method class for queries that count how many entries of particular kinds there are.
|
* Static method class for queries that count how many entries of particular kinds there are.
|
||||||
@ -37,7 +43,7 @@ public class AggregateQueries {
|
|||||||
/**
|
/**
|
||||||
* Count how many users are in the Plan database.
|
* Count how many users are in the Plan database.
|
||||||
*
|
*
|
||||||
* @return Count of base users, all users in a network.
|
* @return Count of base users, all users in a network after Plan installation.
|
||||||
*/
|
*/
|
||||||
public static Query<Integer> baseUserCount() {
|
public static Query<Integer> baseUserCount() {
|
||||||
String sql = "SELECT COUNT(1) as c FROM " + UsersTable.TABLE_NAME;
|
String sql = "SELECT COUNT(1) as c FROM " + UsersTable.TABLE_NAME;
|
||||||
@ -48,4 +54,52 @@ public class AggregateQueries {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count how many users are on a server in the network.
|
||||||
|
*
|
||||||
|
* @param serverUUID ServerUUID of the Plan server.
|
||||||
|
* @return Count of users registered to that server after Plan installation.
|
||||||
|
*/
|
||||||
|
public static Query<Integer> serverUserCount(UUID serverUUID) {
|
||||||
|
String sql = "SELECT COUNT(1) as c FROM " + UserInfoTable.TABLE_NAME +
|
||||||
|
" WHERE " + UserInfoTable.SERVER_UUID + "=?";
|
||||||
|
return new QueryStatement<Integer>(sql) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setString(1, serverUUID.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer processResults(ResultSet set) throws SQLException {
|
||||||
|
return set.next() ? set.getInt("c") : 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count how many users are on each server in the network.
|
||||||
|
* <p>
|
||||||
|
* Please note that counts can overlap as one user can join multiple servers.
|
||||||
|
* Use {@link AggregateQueries#baseUserCount()} if you want to count total number of users.
|
||||||
|
*
|
||||||
|
* @return Map: Server UUID - Count of users registered to that server
|
||||||
|
*/
|
||||||
|
public static Query<Map<UUID, Integer>> serverUserCounts() {
|
||||||
|
String sql = "SELECT COUNT(1) as c, " + UserInfoTable.SERVER_UUID + " FROM " + UserInfoTable.TABLE_NAME +
|
||||||
|
" WHERE " + UserInfoTable.SERVER_UUID + "=?" +
|
||||||
|
" GROUP BY " + UserInfoTable.SERVER_UUID;
|
||||||
|
return new QueryAllStatement<Map<UUID, Integer>>(sql, 100) {
|
||||||
|
@Override
|
||||||
|
public Map<UUID, Integer> processResults(ResultSet set) throws SQLException {
|
||||||
|
Map<UUID, Integer> ofServer = new HashMap<>();
|
||||||
|
while (set.next()) {
|
||||||
|
UUID serverUUID = UUID.fromString(set.getString(UserInfoTable.SERVER_UUID));
|
||||||
|
int count = set.getInt("c");
|
||||||
|
ofServer.put(serverUUID, count);
|
||||||
|
}
|
||||||
|
return ofServer;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
@ -20,7 +20,6 @@ import com.djrapitops.plan.data.container.UserInfo;
|
|||||||
import com.djrapitops.plan.db.DBType;
|
import com.djrapitops.plan.db.DBType;
|
||||||
import com.djrapitops.plan.db.SQLDB;
|
import com.djrapitops.plan.db.SQLDB;
|
||||||
import com.djrapitops.plan.db.access.ExecStatement;
|
import com.djrapitops.plan.db.access.ExecStatement;
|
||||||
import com.djrapitops.plan.db.access.QueryAllStatement;
|
|
||||||
import com.djrapitops.plan.db.access.QueryStatement;
|
import com.djrapitops.plan.db.access.QueryStatement;
|
||||||
import com.djrapitops.plan.db.patches.UserInfoOptimizationPatch;
|
import com.djrapitops.plan.db.patches.UserInfoOptimizationPatch;
|
||||||
import com.djrapitops.plan.db.patches.Version10Patch;
|
import com.djrapitops.plan.db.patches.Version10Patch;
|
||||||
@ -28,7 +27,6 @@ import com.djrapitops.plan.db.sql.parsing.CreateTableParser;
|
|||||||
import com.djrapitops.plan.db.sql.parsing.Select;
|
import com.djrapitops.plan.db.sql.parsing.Select;
|
||||||
import com.djrapitops.plan.db.sql.parsing.Sql;
|
import com.djrapitops.plan.db.sql.parsing.Sql;
|
||||||
import com.djrapitops.plan.db.sql.parsing.Update;
|
import com.djrapitops.plan.db.sql.parsing.Update;
|
||||||
import com.djrapitops.plan.system.info.server.Server;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@ -238,56 +236,10 @@ public class UserInfoTable extends Table {
|
|||||||
return getServerUserInfo(getServerUUID());
|
return getServerUserInfo(getServerUUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getServerUserCount(UUID serverUUID) {
|
|
||||||
String sql = "SELECT " +
|
|
||||||
" COUNT(" + REGISTERED + ") as c" +
|
|
||||||
" FROM " + tableName +
|
|
||||||
" WHERE " + SERVER_UUID + "=?";
|
|
||||||
|
|
||||||
return query(new QueryAllStatement<Integer>(sql, 20000) {
|
|
||||||
@Override
|
|
||||||
public void prepare(PreparedStatement statement) throws SQLException {
|
|
||||||
statement.setString(1, serverUUID.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer processResults(ResultSet set) throws SQLException {
|
|
||||||
if (set.next()) {
|
|
||||||
return set.getInt("c");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isRegisteredOnThisServer(UUID player) {
|
public boolean isRegisteredOnThisServer(UUID player) {
|
||||||
return isRegistered(player, getServerUUID());
|
return isRegistered(player, getServerUUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<UUID, Integer> getPlayersRegisteredForServers(Collection<Server> servers) {
|
|
||||||
if (servers.isEmpty()) {
|
|
||||||
return new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
String sql = "SELECT " + SERVER_UUID + ", " +
|
|
||||||
"COUNT(" + REGISTERED + ") AS count" +
|
|
||||||
" FROM " + tableName +
|
|
||||||
" GROUP BY " + SERVER_UUID;
|
|
||||||
return query(new QueryAllStatement<Map<UUID, Integer>>(sql, 10000) {
|
|
||||||
@Override
|
|
||||||
public Map<UUID, Integer> processResults(ResultSet set) throws SQLException {
|
|
||||||
Map<UUID, Integer> map = new HashMap<>();
|
|
||||||
while (set.next()) {
|
|
||||||
UUID serverUUID = UUID.fromString(set.getString(SERVER_UUID));
|
|
||||||
int count = set.getInt("count");
|
|
||||||
map.put(serverUUID, count);
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<UUID> getSavedUUIDs(UUID serverUUID) {
|
public Set<UUID> getSavedUUIDs(UUID serverUUID) {
|
||||||
String sql = "SELECT " + USER_UUID + " FROM " + tableName + " WHERE " + SERVER_UUID + "=?";
|
String sql = "SELECT " + USER_UUID + " FROM " + tableName + " WHERE " + SERVER_UUID + "=?";
|
||||||
|
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.system.database.databases.operation;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public interface CountOperations {
|
|
||||||
@Deprecated
|
|
||||||
int getServerPlayerCount(UUID server);
|
|
||||||
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.system.database.databases.sql.operation;
|
|
||||||
|
|
||||||
import com.djrapitops.plan.db.SQLDB;
|
|
||||||
import com.djrapitops.plan.system.database.databases.operation.CountOperations;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class SQLCountOps extends SQLOps implements CountOperations {
|
|
||||||
|
|
||||||
public SQLCountOps(SQLDB db) {
|
|
||||||
super(db);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getServerPlayerCount(UUID server) {
|
|
||||||
return userInfoTable.getServerUserCount(server);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -25,6 +25,7 @@ import com.djrapitops.plan.data.store.containers.NetworkContainer;
|
|||||||
import com.djrapitops.plan.data.store.containers.PlayerContainer;
|
import com.djrapitops.plan.data.store.containers.PlayerContainer;
|
||||||
import com.djrapitops.plan.data.store.containers.ServerContainer;
|
import com.djrapitops.plan.data.store.containers.ServerContainer;
|
||||||
import com.djrapitops.plan.db.SQLDB;
|
import com.djrapitops.plan.db.SQLDB;
|
||||||
|
import com.djrapitops.plan.db.sql.queries.AggregateQueries;
|
||||||
import com.djrapitops.plan.db.sql.queries.LargeFetchQueries;
|
import com.djrapitops.plan.db.sql.queries.LargeFetchQueries;
|
||||||
import com.djrapitops.plan.db.sql.queries.OptionalFetchQueries;
|
import com.djrapitops.plan.db.sql.queries.OptionalFetchQueries;
|
||||||
import com.djrapitops.plan.db.sql.queries.containers.ContainerFetchQueries;
|
import com.djrapitops.plan.db.sql.queries.containers.ContainerFetchQueries;
|
||||||
@ -177,7 +178,7 @@ public class SQLFetchOps extends SQLOps implements FetchOperations {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<UUID, Integer> getPlayersRegisteredForServers(Collection<Server> servers) {
|
public Map<UUID, Integer> getPlayersRegisteredForServers(Collection<Server> servers) {
|
||||||
return userInfoTable.getPlayersRegisteredForServers(servers);
|
return db.query(AggregateQueries.serverUserCounts());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user