From c2f20d8636d1d31927622b37f1b4618c9f8dfd9a Mon Sep 17 00:00:00 2001 From: "nise.moe" Date: Sun, 25 Feb 2024 23:49:38 +0100 Subject: [PATCH] Show similar scores in scores page --- .../main/kotlin/com/nisemoe/nise/Models.kt | 11 +++++ .../com/nisemoe/nise/database/ScoreService.kt | 42 ++++++++++++++++++- nise-frontend/Dockerfile | 5 ++- nise-frontend/nginx.conf | 3 ++ nise-frontend/src/app/replays.ts | 11 +++++ .../app/view-score/view-score.component.html | 28 +++++++++++++ 6 files changed, 98 insertions(+), 2 deletions(-) diff --git a/nise-backend/src/main/kotlin/com/nisemoe/nise/Models.kt b/nise-backend/src/main/kotlin/com/nisemoe/nise/Models.kt index 129d414..fa8f1cc 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/nise/Models.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/nise/Models.kt @@ -84,6 +84,16 @@ data class ReplayDataChart( val data: List ) +data class ReplayDataSimilarScore( + val replay_id: Long, + val user_id: Int, + val username: String, + val date: String, + val pp: Double, + val similarity: Double, + val correlation: Double +) + data class ReplayData( val replay_id: Long, val user_id: Int, @@ -136,6 +146,7 @@ data class ReplayData( val count_50: Int, val count_miss: Int, + val similar_scores: List, val error_distribution: Map, val charts: List ) { 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 4740ece..db6784b 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 @@ -129,7 +129,8 @@ class ScoreService( error_coefficient_of_variation = result.get(SCORES.ERROR_COEFFICIENT_OF_VARIATION, Double::class.java), error_kurtosis = result.get(SCORES.ERROR_KURTOSIS, Double::class.java), error_skewness = result.get(SCORES.ERROR_SKEWNESS, Double::class.java), - charts = charts + charts = charts, + similar_scores = this.getSimilarScores(replayId) ) this.loadComparableReplayData(replayData) return replayData @@ -328,6 +329,45 @@ class ScoreService( "$smallerId-$largerId" }.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) + .from(SCORES_SIMILARITY) + .where(SCORES_SIMILARITY.REPLAY_ID_1.eq(scoreId).or(SCORES_SIMILARITY.REPLAY_ID_2.eq(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 { + 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 + ) + } + } + fun loadComparableReplayData(replayData: ReplayData) { // Total samples val totalSamples = dslContext.fetchCount( diff --git a/nise-frontend/Dockerfile b/nise-frontend/Dockerfile index 14da25f..5193ef6 100644 --- a/nise-frontend/Dockerfile +++ b/nise-frontend/Dockerfile @@ -1,7 +1,10 @@ -FROM nginx:latest +FROM openresty/openresty:focal RUN rm -rf /usr/share/nginx/html/* +RUN /usr/local/openresty/luajit/bin/luarocks install luaxml +RUN /usr/local/openresty/luajit/bin/luarocks install lua-resty-http + COPY dist/nise-frontend /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf diff --git a/nise-frontend/nginx.conf b/nise-frontend/nginx.conf index 10b4ff6..0c8f3b4 100644 --- a/nise-frontend/nginx.conf +++ b/nise-frontend/nginx.conf @@ -8,6 +8,9 @@ server { listen 80; + resolver local=on ipv6=off; + resolver_timeout 5s; + root /usr/share/nginx/html; location ~ /index.html { diff --git a/nise-frontend/src/app/replays.ts b/nise-frontend/src/app/replays.ts index 07c31c8..e9fdadc 100644 --- a/nise-frontend/src/app/replays.ts +++ b/nise-frontend/src/app/replays.ts @@ -3,6 +3,16 @@ export interface ReplayDataChart { data: number[]; } +export interface ReplayDataSimilarScore { + replay_id: number; + user_id: number; + date: string; + pp: number; + username: string; + similarity: number; + correlation: number; +} + export interface ReplayData { replay_id: number; user_id: number; @@ -55,6 +65,7 @@ export interface ReplayData { count_50: number, count_miss: number; + similar_scores: ReplayDataSimilarScore[]; error_distribution: ErrorDistribution; charts: ReplayDataChart[]; } diff --git a/nise-frontend/src/app/view-score/view-score.component.html b/nise-frontend/src/app/view-score/view-score.component.html index d5f9671..a44ea61 100644 --- a/nise-frontend/src/app/view-score/view-score.component.html +++ b/nise-frontend/src/app/view-score/view-score.component.html @@ -98,6 +98,34 @@ +
+

# similar replays

+ + + + + + + + + + + + + + +
Played bySimilarityCorrelation
+ {{ score.username }} + + {{ score.similarity | number: '1.2-3' }} + + {{ score.correlation | number: '1.2-4' }} + + details + comparison +
+
+

# nerd stats