From 417738c560fa0437ffbbbcb6d81bea6a46b6d470 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 13 Aug 2019 19:35:28 +0300 Subject: [PATCH] New player retention 7d, 30d --- .../queries/analysis/PlayerCountQueries.java | 38 +++++++++++++++++++ .../OnlineActivityOverviewJSONParser.java | 18 ++++++--- .../system/json/ServerOverviewJSONParser.java | 19 ++++++---- 3 files changed, 62 insertions(+), 13 deletions(-) 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 c791c8619..d816733f6 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 @@ -225,4 +225,42 @@ public class PlayerCountQueries { }); }; } + + public static Query retainedPlayerCount(long after, long before, UUID serverUUID) { + String selectNewUUIDs = SELECT + UserInfoTable.USER_UUID + + FROM + UserInfoTable.TABLE_NAME + + WHERE + UserInfoTable.REGISTERED + "<=?" + + AND + UserInfoTable.REGISTERED + ">=?" + + AND + UserInfoTable.SERVER_UUID + "=?"; + + String selectUniqueUUIDs = SELECT + "DISTINCT " + SessionsTable.USER_UUID + + FROM + SessionsTable.TABLE_NAME + + WHERE + SessionsTable.SESSION_START + ">=?" + + AND + SessionsTable.SESSION_END + "<=?" + + AND + SessionsTable.SERVER_UUID + "=?"; + + String sql = SELECT + "COUNT(1) as player_count" + + FROM + '(' + selectNewUUIDs + ") q1" + + INNER_JOIN + '(' + selectUniqueUUIDs + ") q2 on q1." + SessionsTable.USER_UUID + "=q2." + SessionsTable.USER_UUID; + + return new QueryStatement(sql) { + @Override + public void prepare(PreparedStatement statement) throws SQLException { + statement.setLong(1, before); + statement.setLong(2, after); + statement.setString(3, serverUUID.toString()); + + // Have played in the last half of the time frame + long half = before - (after - before) / 2; + statement.setLong(4, half); + statement.setLong(5, before); + statement.setString(6, serverUUID.toString()); + } + + @Override + public Integer processResults(ResultSet set) throws SQLException { + return set.next() ? set.getInt("player_count") : 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 5d9fc3bbf..3bf84375c 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 @@ -105,13 +105,15 @@ public class OnlineActivityOverviewJSONParser implements TabJSONParser createLast7DaysMap(UUID serverUUID) { Database db = dbSystem.getDatabase(); long now = System.currentTimeMillis(); - long sevenDaysAgo = now - TimeUnit.DAYS.toMillis(7L); + long weekAgo = now - TimeUnit.DAYS.toMillis(7L); Map sevenDays = new HashMap<>(); - sevenDays.put("unique_players", db.query(PlayerCountQueries.uniquePlayerCount(sevenDaysAgo, now, serverUUID))); - 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 - TPSMutator tpsMutator = new TPSMutator(db.query(TPSQueries.fetchTPSDataOfServer(sevenDaysAgo, now, serverUUID))); + sevenDays.put("unique_players", db.query(PlayerCountQueries.uniquePlayerCount(weekAgo, now, serverUUID))); + sevenDays.put("unique_players_day", db.query(PlayerCountQueries.averageUniquePlayerCount(weekAgo, now, timeZone.getOffset(now), serverUUID))); + + int new7d = db.query(PlayerCountQueries.newPlayerCount(weekAgo, now, serverUUID)); + int retained7d = db.query(PlayerCountQueries.retainedPlayerCount(weekAgo, now, serverUUID)); + double retentionPerc7d = new7d != 0 ? (double) retained7d / new7d : -1; + + sevenDays.put("new_players", new7d); + sevenDays.put("new_players_retention", retained7d); + sevenDays.put("new_players_retention_perc", percentage.apply(retentionPerc7d)); + TPSMutator tpsMutator = new TPSMutator(db.query(TPSQueries.fetchTPSDataOfServer(weekAgo, now, serverUUID))); sevenDays.put("average_tps", decimals.apply(tpsMutator.averageTPS())); sevenDays.put("low_tps_spikes", tpsMutator.lowTpsSpikeCount(config.getNumber(DisplaySettings.GRAPH_TPS_THRESHOLD_MED))); sevenDays.put("downtime", timeAmount.apply(tpsMutator.serverDownTime()));