2121
2222import java .util .*;
2323import java .util .function .Consumer ;
24+ import java .util .function .Function ;
2425import java .util .stream .Collectors ;
2526
2627public class StorageManager {
@@ -182,6 +183,28 @@ private void async(Runnable runnable) {
182183 this .plugin .getServer ().getScheduler ().runTaskAsynchronously (this .plugin , runnable );
183184 }
184185
186+ /**
187+ * Creates a Session object from a SessionDTO.
188+ *
189+ * @param dto The SessionDTO to convert.
190+ * @return A new Session object.
191+ */
192+ private Session createSessionFromDTO (SessionDTO dto ) {
193+ var session = new Session (dto .getUniqueId (), dto .started_at ().getTime (), dto .finished_at ().getTime (), dto .getDifferences ());
194+ session .setId (dto .id ());
195+ return session ;
196+ }
197+
198+ /**
199+ * Creates an index map of InvalidSessionDTO by session_id for O(1) lookup.
200+ *
201+ * @param invalidSessions The list of invalid sessions to index.
202+ * @return A map with session_id as key and InvalidSessionDTO as value.
203+ */
204+ private Map <Long , InvalidSessionDTO > buildInvalidSessionIndex (List <InvalidSessionDTO > invalidSessions ) {
205+ return invalidSessions .stream ().collect (Collectors .toMap (InvalidSessionDTO ::session_id , Function .identity (), (a , b ) -> a ));
206+ }
207+
185208 /**
186209 * Asynchronously selects all sessions from the database and passes them to a consumer.
187210 * <p>
@@ -200,12 +223,15 @@ public List<ClickSession> getSessions(UUID uniqueId) {
200223 var ids = sessions .stream ().map (e -> String .valueOf (e .id ())).toList ();
201224
202225 var invalidSessions = this .requestHelper .select (Tables .INVALID_SESSIONS , InvalidSessionDTO .class , table -> table .whereIn ("session_id" , ids ));
226+ var invalidSessionIndex = buildInvalidSessionIndex (invalidSessions );
203227
204228 List <ClickSession > clickSessions = new ArrayList <>();
205229 for (SessionDTO session : sessions ) {
206- var clickSession = new Session (session .getUniqueId (), session .started_at ().getTime (), session .finished_at ().getTime (), session .getDifferences ());
207- clickSession .setId (session .id ());
208- invalidSessions .stream ().filter (e -> e .session_id () == clickSession .getId ()).findFirst ().ifPresent (clickSession ::setInvalidSession );
230+ var clickSession = createSessionFromDTO (session );
231+ InvalidSessionDTO invalid = invalidSessionIndex .get (clickSession .getId ());
232+ if (invalid != null ) {
233+ clickSession .setInvalidSession (invalid );
234+ }
209235 clickSessions .add (clickSession );
210236 }
211237 return clickSessions ;
@@ -226,11 +252,14 @@ public void getPlayers(Consumer<List<PlayerInfo>> consumer) {
226252
227253 var sessions = this .requestHelper .selectAll (Tables .SESSIONS , SessionDTO .class );
228254 var invalidSessions = this .requestHelper .selectAll (Tables .INVALID_SESSIONS , InvalidSessionDTO .class );
255+ var invalidSessionIndex = buildInvalidSessionIndex (invalidSessions );
229256
230257 for (SessionDTO session : sessions ) {
231- var clickSession = new Session (session .getUniqueId (), session .started_at ().getTime (), session .finished_at ().getTime (), session .getDifferences ());
232- clickSession .setId (session .id ());
233- invalidSessions .stream ().filter (e -> e .session_id () == clickSession .getId ()).findFirst ().ifPresent (clickSession ::setInvalidSession );
258+ var clickSession = createSessionFromDTO (session );
259+ InvalidSessionDTO invalid = invalidSessionIndex .get (clickSession .getId ());
260+ if (invalid != null ) {
261+ clickSession .setInvalidSession (invalid );
262+ }
234263 playerSessions .computeIfAbsent (session .getUniqueId (), k -> new ArrayList <>()).add (clickSession );
235264 }
236265
@@ -241,15 +270,16 @@ public void getPlayers(Consumer<List<PlayerInfo>> consumer) {
241270 private void verified (List <InvalidSessionDTO > invalidSessions , Consumer <List <ClickSession >> consumer ) {
242271 var ids = invalidSessions .stream ().map (e -> String .valueOf (e .session_id ())).toList ();
243272 var sessions = this .requestHelper .select (Tables .SESSIONS , SessionDTO .class , table -> table .whereIn ("id" , ids ));
273+ var invalidSessionIndex = buildInvalidSessionIndex (invalidSessions );
244274
245275 List <ClickSession > clickSessions = new ArrayList <>();
246276 for (SessionDTO session : sessions ) {
247- var clickSession = new Session (session . getUniqueId (), session . started_at (). getTime (), session . finished_at (). getTime (), session . getDifferences () );
248- clickSession . setId ( session . id ());
249- invalidSessions . stream (). filter ( e -> e . session_id () == clickSession . getId ()). findFirst (). ifPresent ( e -> {
250- clickSession .setInvalidSession (e );
277+ var clickSession = createSessionFromDTO (session );
278+ InvalidSessionDTO invalid = invalidSessionIndex . get ( clickSession . getId ());
279+ if ( invalid != null ) {
280+ clickSession .setInvalidSession (invalid );
251281 clickSessions .add (clickSession );
252- });
282+ }
253283 }
254284 consumer .accept (clickSessions .stream ().sorted (Comparator .comparingLong (ClickSession ::getStartedAt ).reversed ()).toList ());
255285 }
0 commit comments