diff --git a/Plan/common/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java b/Plan/common/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java index 47e6e7b66..0b0b8a2f4 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java @@ -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.TPSMutator; 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.info.server.Server; 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( 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, () -> { StringBuilder serverBoxes = new StringBuilder(); Map> playersOnlineData = getValue(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA).orElse(new HashMap<>()); - Map registerData = getValue(NetworkKeys.SERVER_REGISTER_DATA).orElse(new HashMap<>()); + Map userCounts = dbSystem.getDatabase().query(AggregateQueries.serverUserCounts()); Collection servers = getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>()); servers.stream() .sorted((one, two) -> String.CASE_INSENSITIVE_ORDER.compare(one.getName(), two.getName())) .forEach(server -> { 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); serverBoxes.append(serverBox.toHtml()); }); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java b/Plan/common/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java index 1b0b7b7f2..50421cddd 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java @@ -74,6 +74,7 @@ public class NetworkKeys { public static final Key> BUKKIT_SERVERS = new Key<>(new Type>() {}, "BUKKIT_SERVERS"); public static final Key>>> ACTIVITY_DATA = CommonKeys.ACTIVITY_DATA; public static final Key>> NETWORK_PLAYER_ONLINE_DATA = new Key<>(new Type>>() {}, "NETWORK_PLAYER_ONLINE_DATA"); + @Deprecated public static final Key> SERVER_REGISTER_DATA = new Key<>(new Type>() {}, "SERVER_REGISTER_DATA"); private NetworkKeys() { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/Database.java b/Plan/common/src/main/java/com/djrapitops/plan/db/Database.java index 2c49a4a00..4825d5bd9 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/Database.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/Database.java @@ -65,9 +65,6 @@ public interface Database { @Deprecated SearchOperations search(); - @Deprecated - CountOperations count(); - @Deprecated SaveOperations save(); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java b/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java index d4ec3de4d..7a9c2fd19 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/SQLDB.java @@ -93,7 +93,6 @@ public abstract class SQLDB extends AbstractDatabase { private final SQLFetchOps fetchOps; private final SQLRemoveOps removeOps; private final SQLSearchOps searchOps; - private final SQLCountOps countOps; private final SQLSaveOps saveOps; private PluginTask dbCleanTask; @@ -136,7 +135,6 @@ public abstract class SQLDB extends AbstractDatabase { checkOps = new SQLCheckOps(this); fetchOps = new SQLFetchOps(this); removeOps = new SQLRemoveOps(this); - countOps = new SQLCountOps(this); searchOps = new SQLSearchOps(this); saveOps = new SQLSaveOps(this); } @@ -476,12 +474,6 @@ public abstract class SQLDB extends AbstractDatabase { return searchOps; } - @Override - @Deprecated - public CountOperations count() { - return countOps; - } - @Override @Deprecated public SaveOperations save() { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java index 4b1f0dd62..ba861d264 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/queries/AggregateQueries.java @@ -18,10 +18,16 @@ package com.djrapitops.plan.db.sql.queries; import com.djrapitops.plan.db.access.Query; 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 java.sql.PreparedStatement; import java.sql.ResultSet; 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. @@ -37,7 +43,7 @@ public class AggregateQueries { /** * 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 baseUserCount() { 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 serverUserCount(UUID serverUUID) { + String sql = "SELECT COUNT(1) as c FROM " + UserInfoTable.TABLE_NAME + + " WHERE " + UserInfoTable.SERVER_UUID + "=?"; + return new QueryStatement(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. + *

+ * 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> 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>(sql, 100) { + @Override + public Map processResults(ResultSet set) throws SQLException { + Map 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; + } + }; + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java index 8dc62a2d1..7f03c00f9 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/sql/tables/UserInfoTable.java @@ -20,7 +20,6 @@ import com.djrapitops.plan.data.container.UserInfo; import com.djrapitops.plan.db.DBType; import com.djrapitops.plan.db.SQLDB; 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.patches.UserInfoOptimizationPatch; 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.Sql; import com.djrapitops.plan.db.sql.parsing.Update; -import com.djrapitops.plan.system.info.server.Server; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -238,56 +236,10 @@ public class UserInfoTable extends Table { return getServerUserInfo(getServerUUID()); } - public int getServerUserCount(UUID serverUUID) { - String sql = "SELECT " + - " COUNT(" + REGISTERED + ") as c" + - " FROM " + tableName + - " WHERE " + SERVER_UUID + "=?"; - - return query(new QueryAllStatement(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) { return isRegistered(player, getServerUUID()); } - public Map getPlayersRegisteredForServers(Collection 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>(sql, 10000) { - @Override - public Map processResults(ResultSet set) throws SQLException { - Map 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 getSavedUUIDs(UUID serverUUID) { String sql = "SELECT " + USER_UUID + " FROM " + tableName + " WHERE " + SERVER_UUID + "=?"; diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/CountOperations.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/CountOperations.java deleted file mode 100644 index 9cf9d4add..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/operation/CountOperations.java +++ /dev/null @@ -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 . - */ -package com.djrapitops.plan.system.database.databases.operation; - -import java.util.UUID; - -@Deprecated -public interface CountOperations { - @Deprecated - int getServerPlayerCount(UUID server); - -} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLCountOps.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLCountOps.java deleted file mode 100644 index 3c84a28af..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLCountOps.java +++ /dev/null @@ -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 . - */ -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); - } - -} 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 6fbce0acb..2811ed551 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 @@ -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.ServerContainer; 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.OptionalFetchQueries; import com.djrapitops.plan.db.sql.queries.containers.ContainerFetchQueries; @@ -177,7 +178,7 @@ public class SQLFetchOps extends SQLOps implements FetchOperations { @Override public Map getPlayersRegisteredForServers(Collection servers) { - return userInfoTable.getPlayersRegisteredForServers(servers); + return db.query(AggregateQueries.serverUserCounts()); } @Override