From 5decaf0e3c3075e7525ffba7cf874352f42b5692 Mon Sep 17 00:00:00 2001 From: "nise.moe" Date: Mon, 26 Feb 2024 00:16:40 +0100 Subject: [PATCH] Refactor getSimilarScores --- .../com/nisemoe/nise/database/ScoreService.kt | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/nise-backend/src/main/kotlin/com/nisemoe/nise/database/ScoreService.kt b/nise-backend/src/main/kotlin/com/nisemoe/nise/database/ScoreService.kt index db6784b..6710845 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/nise/database/ScoreService.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/nise/database/ScoreService.kt @@ -330,40 +330,37 @@ class ScoreService( }.sortedWith(compareBy({ it.replay_date_2 }, { it.similarity })).reversed() fun getSimilarScores(scoreId: Long): List { - val similarScores = dslContext.select(SCORES_SIMILARITY.REPLAY_ID_1, SCORES_SIMILARITY.REPLAY_ID_2, SCORES_SIMILARITY.SIMILARITY, SCORES_SIMILARITY.CORRELATION) + val similarScoresWithReplayData = dslContext + .select( + SCORES_SIMILARITY.REPLAY_ID_1, + SCORES_SIMILARITY.REPLAY_ID_2, + SCORES_SIMILARITY.SIMILARITY, + SCORES_SIMILARITY.CORRELATION, + SCORES.REPLAY_ID, + SCORES.USER_ID, + USERS.USERNAME, + SCORES.DATE, + SCORES.PP, + SCORES.BEATMAP_ID + ) .from(SCORES_SIMILARITY) + .join(SCORES) + .on(SCORES.REPLAY_ID.eq(SCORES_SIMILARITY.REPLAY_ID_1).or(SCORES.REPLAY_ID.eq(SCORES_SIMILARITY.REPLAY_ID_2))) + .join(USERS) + .on(SCORES.USER_ID.eq(USERS.USER_ID)) .where(SCORES_SIMILARITY.REPLAY_ID_1.eq(scoreId).or(SCORES_SIMILARITY.REPLAY_ID_2.eq(scoreId))) + .and(SCORES.REPLAY_ID.ne(scoreId)) .fetch() - // Collect all score ids (either replay_id_1 or replay_id_2) that aren't scoreId - val otherScoreIds = similarScores.flatMap { - listOf(it.get(SCORES_SIMILARITY.REPLAY_ID_1, Long::class.java), it.get(SCORES_SIMILARITY.REPLAY_ID_2, Long::class.java)) - }.filter { it != scoreId } - - // Fetch the replay data for the other score ids - val replayData = dslContext.select( - SCORES.REPLAY_ID, - SCORES.USER_ID, - USERS.USERNAME, - SCORES.DATE, - SCORES.PP, - SCORES.BEATMAP_ID - ) - .from(SCORES) - .join(USERS).on(SCORES.USER_ID.eq(USERS.USER_ID)) - .where(SCORES.REPLAY_ID.`in`(otherScoreIds)) - .fetch() - - // Map the replay data to ReplayDataSimilarScore - return replayData.map { + return similarScoresWithReplayData.map { record -> ReplayDataSimilarScore( - replay_id = it.get(SCORES.REPLAY_ID, Long::class.java), - user_id = it.get(SCORES.USER_ID, Int::class.java), - username = it.get(USERS.USERNAME, String::class.java), - date = Format.formatLocalDateTime(it.get(SCORES.DATE, LocalDateTime::class.java)), - pp = it.get(SCORES.PP, Double::class.java), - similarity = similarScores.firstOrNull { score -> score.get(SCORES_SIMILARITY.REPLAY_ID_1, Long::class.java) == it.get(SCORES.REPLAY_ID, Long::class.java) || score.get(SCORES_SIMILARITY.REPLAY_ID_2, Long::class.java) == it.get(SCORES.REPLAY_ID, Long::class.java) }?.get(SCORES_SIMILARITY.SIMILARITY, Double::class.java) ?: 0.0, - correlation = similarScores.firstOrNull { score -> score.get(SCORES_SIMILARITY.REPLAY_ID_1, Long::class.java) == it.get(SCORES.REPLAY_ID, Long::class.java) || score.get(SCORES_SIMILARITY.REPLAY_ID_2, Long::class.java) == it.get(SCORES.REPLAY_ID, Long::class.java) }?.get(SCORES_SIMILARITY.CORRELATION, Double::class.java) ?: 0.0 + replay_id = record.get(SCORES.REPLAY_ID, Long::class.java), + user_id = record.get(SCORES.USER_ID, Int::class.java), + username = record.get(USERS.USERNAME, String::class.java), + date = Format.formatLocalDateTime(record.get(SCORES.DATE, LocalDateTime::class.java)), + pp = record.get(SCORES.PP, Double::class.java), + similarity = record.get(SCORES_SIMILARITY.SIMILARITY, Double::class.java), + correlation = record.get(SCORES_SIMILARITY.CORRELATION, Double::class.java) ) } }