Some code cleaning; define ID type as an alias to Int

This commit is contained in:
Claude Brisson
2023-05-23 18:08:04 +02:00
parent 74dcb64899
commit 728ed482f9
8 changed files with 31 additions and 25 deletions

View File

@@ -4,6 +4,7 @@ import com.republicate.kson.Json
import com.republicate.kson.toJsonArray import com.republicate.kson.toJsonArray
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
import org.jeudego.pairgoth.model.Pairing import org.jeudego.pairgoth.model.Pairing
import org.jeudego.pairgoth.model.toID
import org.jeudego.pairgoth.model.toJson import org.jeudego.pairgoth.model.toJson
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.web.Event
import org.jeudego.pairgoth.web.Event.* import org.jeudego.pairgoth.web.Event.*
@@ -35,7 +36,7 @@ object PairingHandler: PairgothApiHandler {
tournament.pairables.values.filter { !it.skip.contains(round) && !playing.contains(it.id) } tournament.pairables.values.filter { !it.skip.contains(round) && !playing.contains(it.id) }
else payload.map { else payload.map {
// CB - because of the '["all"]' map, conversion to int lands here... Better API syntax for 'all players'? // CB - because of the '["all"]' map, conversion to int lands here... Better API syntax for 'all players'?
if (it is Number) it.toInt() else badRequest("invalid pairable id: #$it") if (it is Number) it.toID() else badRequest("invalid pairable id: #$it")
}.map { id -> }.map { id ->
tournament.pairables[id]?.also { tournament.pairables[id]?.also {
if (it.skip.contains(round)) badRequest("pairable #$id does not play round $round") if (it.skip.contains(round)) badRequest("pairable #$id does not play round $round")

View File

@@ -0,0 +1,6 @@
package org.jeudego.pairgoth.model
typealias ID = Int
fun String.toID() = toInt()
fun Number.toID() = toInt()

View File

@@ -5,9 +5,9 @@ import org.jeudego.pairgoth.model.Game.Result.*
import java.util.* import java.util.*
data class Game( data class Game(
val id: Int, val id: ID,
val white: Int, val white: ID,
val black: Int, val black: ID,
val handicap: Int = 0, val handicap: Int = 0,
var result: Result = UNKNOWN var result: Result = UNKNOWN
) { ) {

View File

@@ -9,7 +9,7 @@ import kotlin.math.roundToInt
// Pairable // Pairable
sealed class Pairable(val id: Int, val name: String, open val rating: Int, open val rank: Int) { sealed class Pairable(val id: ID, val name: String, open val rating: Int, open val rank: Int) {
companion object {} companion object {}
abstract fun toJson(): Json.Object abstract fun toJson(): Json.Object
abstract val club: String? abstract val club: String?
@@ -49,7 +49,7 @@ fun Pairable.Companion.parseRank(rankStr: String): Int {
// Player // Player
class Player( class Player(
id: Int, id: ID,
name: String, name: String,
var firstname: String, var firstname: String,
rating: Int, rating: Int,

View File

@@ -1,2 +0,0 @@
package org.jeudego.pairgoth.model

View File

@@ -8,7 +8,7 @@ import org.jeudego.pairgoth.store.Store
import kotlin.math.roundToInt import kotlin.math.roundToInt
sealed class Tournament <P: Pairable>( sealed class Tournament <P: Pairable>(
val id: Int, val id: ID,
val type: Type, val type: Type,
val name: String, val name: String,
val shortName: String, val shortName: String,
@@ -41,11 +41,11 @@ sealed class Tournament <P: Pairable>(
} }
// players per id // players per id
abstract val players: MutableMap<Int, Player> abstract val players: MutableMap<ID, Player>
// pairables per id // pairables per id
protected val _pairables = mutableMapOf<Int, P>() protected val _pairables = mutableMapOf<ID, P>()
val pairables: Map<Int, Pairable> get() = _pairables val pairables: Map<ID, Pairable> get() = _pairables
// pairing // pairing
fun pair(round: Int, pairables: List<Pairable>): List<Game> { fun pair(round: Int, pairables: List<Pairable>): List<Game> {
@@ -63,7 +63,7 @@ sealed class Tournament <P: Pairable>(
} }
// games per id for each round // games per id for each round
private val games = mutableListOf<MutableMap<Int, Game>>() private val games = mutableListOf<MutableMap<ID, Game>>()
fun games(round: Int) = games.getOrNull(round - 1) ?: mutableMapOf() fun games(round: Int) = games.getOrNull(round - 1) ?: mutableMapOf()
fun lastRound() = games.size fun lastRound() = games.size
@@ -78,7 +78,7 @@ sealed class Tournament <P: Pairable>(
// standard tournament of individuals // standard tournament of individuals
class StandardTournament( class StandardTournament(
id: Int, id: ID,
type: Tournament.Type, type: Tournament.Type,
name: String, name: String,
shortName: String, shortName: String,
@@ -99,7 +99,7 @@ class StandardTournament(
// team tournament // team tournament
class TeamTournament( class TeamTournament(
id: Int, id: ID,
type: Tournament.Type, type: Tournament.Type,
name: String, name: String,
shortName: String, shortName: String,
@@ -116,11 +116,11 @@ class TeamTournament(
komi: Double = 7.5 komi: Double = 7.5
): Tournament<TeamTournament.Team>(id, type, name, shortName, startDate, endDate, country, location, online, timeSystem, rounds, pairing, rules, gobanSize, komi) { ): Tournament<TeamTournament.Team>(id, type, name, shortName, startDate, endDate, country, location, online, timeSystem, rounds, pairing, rules, gobanSize, komi) {
companion object {} companion object {}
override val players = mutableMapOf<Int, Player>() override val players = mutableMapOf<ID, Player>()
val teams: MutableMap<Int, Team> = _pairables val teams: MutableMap<ID, Team> = _pairables
inner class Team(id: Int, name: String): Pairable(id, name, 0, 0) { inner class Team(id: ID, name: String): Pairable(id, name, 0, 0) {
val playerIds = mutableSetOf<Int>() val playerIds = mutableSetOf<ID>()
val teamPlayers: Set<Player> get() = playerIds.mapNotNull { players[id] }.toSet() val teamPlayers: Set<Player> get() = playerIds.mapNotNull { players[id] }.toSet()
override val rating: Int get() = if (teamPlayers.isEmpty()) super.rating else (teamPlayers.sumOf { player -> player.rating.toDouble() } / players.size).roundToInt() override val rating: Int get() = if (teamPlayers.isEmpty()) super.rating else (teamPlayers.sumOf { player -> player.rating.toDouble() } / players.size).roundToInt()
override val rank: Int get() = if (teamPlayers.isEmpty()) super.rank else (teamPlayers.sumOf { player -> player.rank.toDouble() } / players.size).roundToInt() override val rank: Int get() = if (teamPlayers.isEmpty()) super.rank else (teamPlayers.sumOf { player -> player.rank.toDouble() } / players.size).roundToInt()

View File

@@ -1,5 +1,6 @@
package org.jeudego.pairgoth.store package org.jeudego.pairgoth.store
import org.jeudego.pairgoth.model.ID
import org.jeudego.pairgoth.model.Player import org.jeudego.pairgoth.model.Player
import org.jeudego.pairgoth.model.Tournament import org.jeudego.pairgoth.model.Tournament
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
@@ -13,16 +14,16 @@ object Store {
val nextPlayerId get() = _nextPlayerId.incrementAndGet() val nextPlayerId get() = _nextPlayerId.incrementAndGet()
val nextGameId get() = _nextGameId.incrementAndGet() val nextGameId get() = _nextGameId.incrementAndGet()
private val tournaments = mutableMapOf<Int, Tournament<*>>() private val tournaments = mutableMapOf<ID, Tournament<*>>()
fun addTournament(tournament: Tournament<*>) { fun addTournament(tournament: Tournament<*>) {
if (tournaments.containsKey(tournament.id)) throw Error("tournament id #${tournament.id} already exists") if (tournaments.containsKey(tournament.id)) throw Error("tournament id #${tournament.id} already exists")
tournaments[tournament.id] = tournament tournaments[tournament.id] = tournament
} }
fun getTournament(id: Int) = tournaments[id] fun getTournament(id: ID) = tournaments[id]
fun getTournamentsIDs(): Set<Int> = tournaments.keys fun getTournamentsIDs(): Set<ID> = tournaments.keys
fun replaceTournament(tournament: Tournament<*>) { fun replaceTournament(tournament: Tournament<*>) {
if (!tournaments.containsKey(tournament.id)) throw Error("tournament id #${tournament.id} not known") if (!tournaments.containsKey(tournament.id)) throw Error("tournament id #${tournament.id} not known")

View File

@@ -13,15 +13,15 @@ class ImportExportTests: TestBase() {
val resp = TestAPI.post("/api/tour", resource) val resp = TestAPI.post("/api/tour", resource)
val id = resp.asObject().getInt("id") val id = resp.asObject().getInt("id")
val tournament = TestAPI.get("/api/tour/$id").asObject() val tournament = TestAPI.get("/api/tour/$id").asObject()
logger.info(tournament.toString()) logger.info(tournament.toString().slice(0..50) + "...")
val players = TestAPI.get("/api/tour/$id/part").asArray() val players = TestAPI.get("/api/tour/$id/part").asArray()
logger.info(players.toString()) logger.info(players.toString().slice(0..50) + "...")
for (round in 1..tournament.getInt("rounds")!!) { for (round in 1..tournament.getInt("rounds")!!) {
val games = TestAPI.get("/api/tour/$id/res/1").asArray() val games = TestAPI.get("/api/tour/$id/res/1").asArray()
logger.info("games for round $round: {}", games.toString()) logger.info("games for round $round: {}", games.toString())
} }
val xml = TestAPI.getXml("/api/tour/$id") val xml = TestAPI.getXml("/api/tour/$id")
logger.info(xml) logger.info(xml.slice(0..50)+"...")
} }
} }
} }