Refactor getSimilarScores
This commit is contained in:
parent
c2f20d8636
commit
5decaf0e3c
@ -330,18 +330,12 @@ 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
|
||||||
.from(SCORES_SIMILARITY)
|
.select(
|
||||||
.where(SCORES_SIMILARITY.REPLAY_ID_1.eq(scoreId).or(SCORES_SIMILARITY.REPLAY_ID_2.eq(scoreId)))
|
SCORES_SIMILARITY.REPLAY_ID_1,
|
||||||
.fetch()
|
SCORES_SIMILARITY.REPLAY_ID_2,
|
||||||
|
SCORES_SIMILARITY.SIMILARITY,
|
||||||
// Collect all score ids (either replay_id_1 or replay_id_2) that aren't scoreId
|
SCORES_SIMILARITY.CORRELATION,
|
||||||
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.REPLAY_ID,
|
||||||
SCORES.USER_ID,
|
SCORES.USER_ID,
|
||||||
USERS.USERNAME,
|
USERS.USERNAME,
|
||||||
@ -349,21 +343,24 @@ class ScoreService(
|
|||||||
SCORES.PP,
|
SCORES.PP,
|
||||||
SCORES.BEATMAP_ID
|
SCORES.BEATMAP_ID
|
||||||
)
|
)
|
||||||
.from(SCORES)
|
.from(SCORES_SIMILARITY)
|
||||||
.join(USERS).on(SCORES.USER_ID.eq(USERS.USER_ID))
|
.join(SCORES)
|
||||||
.where(SCORES.REPLAY_ID.`in`(otherScoreIds))
|
.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()
|
.fetch()
|
||||||
|
|
||||||
// Map the replay data to ReplayDataSimilarScore
|
return similarScoresWithReplayData.map { record ->
|
||||||
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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user