Refactor getSimilarScores

This commit is contained in:
nise.moe 2024-02-26 00:16:40 +01:00
parent c2f20d8636
commit 5decaf0e3c

View File

@ -330,40 +330,37 @@ class ScoreService(
}.sortedWith(compareBy({ it.replay_date_2 }, { it.similarity })).reversed() }.sortedWith(compareBy({ it.replay_date_2 }, { it.similarity })).reversed()
fun getSimilarScores(scoreId: Long): List<ReplayDataSimilarScore> { fun getSimilarScores(scoreId: Long): List<ReplayDataSimilarScore> {
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) .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))) .where(SCORES_SIMILARITY.REPLAY_ID_1.eq(scoreId).or(SCORES_SIMILARITY.REPLAY_ID_2.eq(scoreId)))
.and(SCORES.REPLAY_ID.ne(scoreId))
.fetch() .fetch()
// Collect all score ids (either replay_id_1 or replay_id_2) that aren't scoreId return similarScoresWithReplayData.map { record ->
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 {
ReplayDataSimilarScore( ReplayDataSimilarScore(
replay_id = it.get(SCORES.REPLAY_ID, Long::class.java), replay_id = record.get(SCORES.REPLAY_ID, Long::class.java),
user_id = it.get(SCORES.USER_ID, Int::class.java), user_id = record.get(SCORES.USER_ID, Int::class.java),
username = it.get(USERS.USERNAME, String::class.java), username = record.get(USERS.USERNAME, String::class.java),
date = Format.formatLocalDateTime(it.get(SCORES.DATE, LocalDateTime::class.java)), date = Format.formatLocalDateTime(record.get(SCORES.DATE, LocalDateTime::class.java)),
pp = it.get(SCORES.PP, Double::class.java), pp = record.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, similarity = record.get(SCORES_SIMILARITY.SIMILARITY, Double::class.java),
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 correlation = record.get(SCORES_SIMILARITY.CORRELATION, Double::class.java)
) )
} }
} }