diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/analysis/PlayerCountQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/analysis/PlayerCountQueries.java index 73860c9a5..c791c8619 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/analysis/PlayerCountQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/analysis/PlayerCountQueries.java @@ -111,6 +111,37 @@ public class PlayerCountQueries { }; } + public static Query averageUniquePlayerCount(long after, long before, long timeZoneOffset, UUID serverUUID) { + return database -> { + Sql sql = database.getType().getSql(); + String selectUniquePlayersPerDay = SELECT + + sql.dateToEpochSecond(sql.dateToDayStamp(sql.epochSecondToDate('(' + SessionsTable.SESSION_START + "+?)/1000"))) + + "*1000 as date," + + "COUNT(DISTINCT " + SessionsTable.USER_UUID + ") as player_count" + + FROM + SessionsTable.TABLE_NAME + + WHERE + SessionsTable.SESSION_END + "<=?" + + AND + SessionsTable.SESSION_START + ">=?" + + AND + SessionsTable.SERVER_UUID + "=?" + + GROUP_BY + "date"; + String selectAverage = SELECT + "AVG(player_count) as average" + FROM + '(' + selectUniquePlayersPerDay + ") q1"; + + return database.query(new QueryStatement(selectAverage, 100) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setLong(1, timeZoneOffset); + statement.setLong(2, before); + statement.setLong(3, after); + statement.setString(4, serverUUID.toString()); + } + + @Override + public Integer processResults(ResultSet set) throws SQLException { + return set.next() ? set.getInt("average") : 0; + } + }); + }; + } + public static Query newPlayerCount(long after, long before, UUID serverUUID) { String sql = SELECT + "COUNT(" + UserInfoTable.USER_UUID + ") as player_count" + FROM + UserInfoTable.TABLE_NAME + @@ -163,4 +194,35 @@ public class PlayerCountQueries { }); }; } + + public static Query averageNewPlayerCount(long after, long before, long timeZoneOffset, UUID serverUUID) { + return database -> { + Sql sql = database.getType().getSql(); + String selectNewPlayersQuery = SELECT + + sql.dateToEpochSecond(sql.dateToDayStamp(sql.epochSecondToDate('(' + UserInfoTable.REGISTERED + "+?)/1000"))) + + "*1000 as date," + + "COUNT(1) as player_count" + + FROM + UserInfoTable.TABLE_NAME + + WHERE + UserInfoTable.REGISTERED + "<=?" + + AND + UserInfoTable.REGISTERED + ">=?" + + AND + UserInfoTable.SERVER_UUID + "=?" + + GROUP_BY + "date"; + String selectAverage = SELECT + "AVG(player_count) as average" + FROM + '(' + selectNewPlayersQuery + ") q1"; + + return database.query(new QueryStatement(selectAverage, 100) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setLong(1, timeZoneOffset); + statement.setLong(2, before); + statement.setLong(3, after); + statement.setString(4, serverUUID.toString()); + } + + @Override + public Integer processResults(ResultSet set) throws SQLException { + return set.next() ? set.getInt("average") : 0; + } + }); + }; + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/json/OnlineActivityOverviewJSONParser.java b/Plan/common/src/main/java/com/djrapitops/plan/system/json/OnlineActivityOverviewJSONParser.java index f4c0d921c..5d9fc3bbf 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/json/OnlineActivityOverviewJSONParser.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/json/OnlineActivityOverviewJSONParser.java @@ -29,15 +29,13 @@ import com.djrapitops.plan.db.access.queries.objects.UserInfoQueries; import com.djrapitops.plan.system.database.DBSystem; import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.paths.DisplaySettings; +import com.djrapitops.plan.system.settings.paths.TimeSettings; import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.utilities.formatting.Formatters; import javax.inject.Inject; import javax.inject.Singleton; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -54,6 +52,7 @@ public class OnlineActivityOverviewJSONParser implements TabJSONParser timeAmountFormatter; private Formatter decimalFormatter; private Formatter percentageFormatter; + private final TimeZone timeZone; @Inject public OnlineActivityOverviewJSONParser( @@ -67,6 +66,7 @@ public class OnlineActivityOverviewJSONParser implements TabJSONParser createJSONAsMap(UUID serverUUID) { @@ -83,6 +83,7 @@ public class OnlineActivityOverviewJSONParser implements TabJSONParser numbers = new HashMap<>(); @@ -95,15 +96,14 @@ public class OnlineActivityOverviewJSONParser implements TabJSONParser decimals; private Formatter percentage; private Formatter year; + private final TimeZone timeZone; @Inject public ServerOverviewJSONParser( @@ -77,6 +75,7 @@ public class ServerOverviewJSONParser implements TabJSONParser createJSONAsMap(UUID serverUUID) { @@ -95,7 +94,7 @@ public class ServerOverviewJSONParser implements TabJSONParser sevenDays = new HashMap<>(); sevenDays.put("unique_players", db.query(PlayerCountQueries.uniquePlayerCount(sevenDaysAgo, now, serverUUID))); - sevenDays.put("unique_players_day", "!"); // TODO + sevenDays.put("unique_players_day", db.query(PlayerCountQueries.averageUniquePlayerCount(sevenDaysAgo, now, timeZone.getOffset(now), serverUUID))); sevenDays.put("new_players", db.query(PlayerCountQueries.newPlayerCount(sevenDaysAgo, now, serverUUID))); sevenDays.put("new_players_retention", "!"); // TODO sevenDays.put("new_players_retention_perc", "!"); // TODO