Skip to content

Commit 8b1d1bc

Browse files
committed
Speed up session lookups
Signed-off-by: applenick <applenick@users.noreply.github.com>
1 parent d853f78 commit 8b1d1bc

2 files changed

Lines changed: 61 additions & 11 deletions

File tree

core/src/main/java/dev/pgm/community/sessions/services/SQLSessionService.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.common.cache.CacheLoader;
66
import com.google.common.cache.LoadingCache;
77
import dev.pgm.community.Community;
8+
import dev.pgm.community.database.Query;
89
import dev.pgm.community.feature.SQLFeatureBase;
910
import dev.pgm.community.sessions.Session;
1011
import dev.pgm.community.sessions.SessionQuery;
@@ -31,6 +32,12 @@ public SessionData load(@NotNull SessionQuery key) {
3132
});
3233
}
3334

35+
@Override
36+
public void createTable() {
37+
super.createTable();
38+
DB.executeUpdateAsync(Query.createTable(LATEST_TABLE_NAME, LATEST_TABLE_FIELDS));
39+
}
40+
3441
@Override
3542
public void save(Session session) {
3643
SessionData query = sessionCache.getUnchecked(new SessionQuery(session.getPlayerId(), false));
@@ -47,20 +54,50 @@ public void save(Session session) {
4754
session.getServerName(),
4855
session.getStartDate().toEpochMilli(),
4956
session.getEndDate() == null ? null : session.getEndDate().toEpochMilli());
57+
58+
DB.executeUpdateAsync(
59+
UPSERT_LATEST_SESSION_QUERY,
60+
session.getPlayerId().toString(),
61+
false,
62+
session.getSessionId().toString(),
63+
session.isDisguised(),
64+
session.getServerName(),
65+
session.getStartDate().toEpochMilli(),
66+
session.getEndDate() == null ? null : session.getEndDate().toEpochMilli());
67+
68+
if (!session.isDisguised()) {
69+
DB.executeUpdateAsync(
70+
UPSERT_LATEST_SESSION_QUERY,
71+
session.getPlayerId().toString(),
72+
true,
73+
session.getSessionId().toString(),
74+
session.isDisguised(),
75+
session.getServerName(),
76+
session.getStartDate().toEpochMilli(),
77+
session.getEndDate() == null ? null : session.getEndDate().toEpochMilli());
78+
}
5079
}
5180

5281
public void updateSessionEndTime(Session session) {
5382
DB.executeUpdateAsync(
5483
UPDATE_SESSION_ENDTIME_QUERY,
5584
session.getEndDate() == null ? null : session.getEndDate().toEpochMilli(),
5685
session.getSessionId().toString());
86+
DB.executeUpdateAsync(
87+
UPDATE_LATEST_ENDTIME_QUERY,
88+
session.getEndDate() == null ? null : session.getEndDate().toEpochMilli(),
89+
session.getSessionId().toString());
5790
}
5891

5992
public void endOngoingSessions() {
6093
DB.executeUpdateAsync(
6194
UPDATE_ONGOING_SESSION_ENDING_QUERY,
6295
Instant.now().toEpochMilli(),
6396
Community.get().getServerId());
97+
DB.executeUpdateAsync(
98+
UPDATE_LATEST_ONGOING_SESSION_ENDING_QUERY,
99+
Instant.now().toEpochMilli(),
100+
Community.get().getServerId());
64101
}
65102

66103
@Override
@@ -76,11 +113,12 @@ public CompletableFuture<Session> query(SessionQuery target) {
76113
return CompletableFuture.completedFuture(data.getSession());
77114
} else {
78115
return DB.getFirstRowAsync(
79-
target.ignoreDisguised() ? SELECT_DISGUISED_SESSION_QUERY : SELECT_SESSION_QUERY,
80-
target.getPlayerId().toString())
116+
SELECT_LATEST_SESSION_QUERY,
117+
target.getPlayerId().toString(),
118+
target.ignoreDisguised())
81119
.thenApplyAsync(result -> {
82120
if (result != null) {
83-
String id = result.getString("id");
121+
String id = result.getString("session_id");
84122

85123
String player = result.getString("player");
86124
boolean disguised = DatabaseUtils.parseBoolean(result, "disguised");

core/src/main/java/dev/pgm/community/sessions/services/SessionDataQuery.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,31 @@ public interface SessionDataQuery {
66
static final String TABLE_FIELDS =
77
"(id VARCHAR(36) PRIMARY KEY, player VARCHAR(36), disguised BOOL, server VARCHAR(32), start_time BIGINT, end_time BIGINT)";
88

9-
static final String INSERT_SESSION_QUERY = "INSERT INTO "
10-
+ TABLE_NAME
9+
static final String INSERT_SESSION_QUERY = "INSERT INTO " + TABLE_NAME
1110
+ "(id, player, disguised, server, start_time, end_time) VALUES (?, ?, ?, ?, ?, ?)";
1211

13-
static final String SELECT_DISGUISED_SESSION_QUERY = "SELECT * FROM " + TABLE_NAME
14-
+ " WHERE player = ? AND disguised = 0 ORDER BY end_time DESC LIMIT 1";
15-
16-
static final String SELECT_SESSION_QUERY =
17-
"SELECT * FROM " + TABLE_NAME + " WHERE player = ? ORDER BY end_time DESC LIMIT 1";
18-
1912
static final String UPDATE_SESSION_ENDTIME_QUERY =
2013
"UPDATE " + TABLE_NAME + " SET end_time = ? WHERE id = ?";
2114

2215
static final String UPDATE_ONGOING_SESSION_ENDING_QUERY =
2316
"UPDATE " + TABLE_NAME + " SET end_time = ? WHERE server = ? AND end_time IS NULL";
17+
18+
static final String LATEST_TABLE_NAME = "latest_sessions";
19+
static final String LATEST_TABLE_FIELDS =
20+
"(player VARCHAR(36), ignore_disguised BOOL, session_id VARCHAR(36), disguised BOOL, server VARCHAR(32), start_time BIGINT, end_time BIGINT, PRIMARY KEY (player, ignore_disguised))";
21+
22+
static final String UPSERT_LATEST_SESSION_QUERY = "INSERT INTO " + LATEST_TABLE_NAME
23+
+ "(player, ignore_disguised, session_id, disguised, server, start_time, end_time)"
24+
+ " VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE "
25+
+ "session_id = VALUES(session_id), disguised = VALUES(disguised), "
26+
+ "server = VALUES(server), start_time = VALUES(start_time), end_time = VALUES(end_time)";
27+
28+
static final String SELECT_LATEST_SESSION_QUERY =
29+
"SELECT * FROM " + LATEST_TABLE_NAME + " WHERE player = ? AND ignore_disguised = ? LIMIT 1";
30+
31+
static final String UPDATE_LATEST_ENDTIME_QUERY =
32+
"UPDATE " + LATEST_TABLE_NAME + " SET end_time = ? WHERE session_id = ?";
33+
34+
static final String UPDATE_LATEST_ONGOING_SESSION_ENDING_QUERY =
35+
"UPDATE " + LATEST_TABLE_NAME + " SET end_time = ? WHERE server = ? AND end_time IS NULL";
2436
}

0 commit comments

Comments
 (0)