Refactor getSimilarScores
This commit is contained in:
parent
c2f20d8636
commit
5decaf0e3c
@ -330,40 +330,37 @@ class ScoreService(
|
||||
}.sortedWith(compareBy({ it.replay_date_2 }, { it.similarity })).reversed()
|
||||
|
||||
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)
|
||||
.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)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user