diff --git a/src/main/kotlin/net/sportsday/services/GamesService.kt b/src/main/kotlin/net/sportsday/services/GamesService.kt index 5ef5cda..fd013f8 100644 --- a/src/main/kotlin/net/sportsday/services/GamesService.kt +++ b/src/main/kotlin/net/sportsday/services/GamesService.kt @@ -10,8 +10,11 @@ import net.sportsday.utils.configuration.KeyValueStore import org.jetbrains.exposed.sql.SizedCollection import org.jetbrains.exposed.sql.transactions.transaction import java.time.LocalDateTime +import kotlin.math.abs import kotlin.time.Duration.Companion.minutes +private const val EPSILON = 1e-6 + /** * Created by testusuke on 2023/05/05 * @author testusuke @@ -456,14 +459,18 @@ object GamesService { if (game.calculationType == CalculationType.DIFF_SCORE || game.calculationType == CalculationType.TOTAL_SCORE) { leagueTeamResults.values .sortedWith( - compareByDescending { it.score } - .apply { - if (game.calculationType == CalculationType.DIFF_SCORE) { - thenByDescending { it.goalDiff } - } else if (game.calculationType == CalculationType.TOTAL_SCORE) { - thenByDescending { it.goal } - } - }, + when (game.calculationType) { + CalculationType.DIFF_SCORE -> + compareByDescending { it.score } + .thenByDescending { it.goalDiff } + + CalculationType.TOTAL_SCORE -> + compareByDescending { it.score } + .thenByDescending { it.goal } + + else -> + compareByDescending { it.score } + } ) .map { leagueTeamResult -> if (lastResult == null) { @@ -472,8 +479,8 @@ object GamesService { // if score is same, rank is same if (game.calculationType == CalculationType.TOTAL_SCORE) { if ( - lastResult!!.score == leagueTeamResult.score && - lastResult!!.goal == leagueTeamResult.goal + abs(lastResult!!.score - leagueTeamResult.score) < EPSILON && + abs(lastResult!!.goal - leagueTeamResult.goal) < EPSILON ) { leagueTeamResult.rank = lastRank } else { @@ -481,8 +488,8 @@ object GamesService { } } else { if ( - lastResult!!.score == leagueTeamResult.score && - lastResult!!.goalDiff == leagueTeamResult.goalDiff + abs(lastResult!!.score - leagueTeamResult.score) < EPSILON && + abs(lastResult!!.goalDiff - leagueTeamResult.goalDiff) < EPSILON ) { leagueTeamResult.rank = lastRank } else { @@ -504,7 +511,7 @@ object GamesService { if (lastResult == null) { leagueTeamResult.rank = 1 } else { - if (lastResult!!.score == leagueTeamResult.score) { + if (abs(lastResult!!.score - leagueTeamResult.score) < EPSILON) { leagueTeamResult.rank = lastRank } else { leagueTeamResult.rank = lastRank + 1