Skip to content

Commit

Permalink
refactor report params to immutable data classes
Browse files Browse the repository at this point in the history
  • Loading branch information
alyssaruth committed Feb 13, 2024
1 parent 3a9b676 commit 0d84d59
Show file tree
Hide file tree
Showing 18 changed files with 307 additions and 290 deletions.
8 changes: 4 additions & 4 deletions src/main/kotlin/dartzee/reporting/IncludedPlayerParameters.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package dartzee.reporting
const val COMPARATOR_SCORE_UNSET = "is unset"

data class IncludedPlayerParameters(
var finishingPositions: List<Int> = listOf(),
var finalScoreComparator: String = "",
var finalScore: Int = -1
val finishingPositions: List<Int>,
val finalScoreComparator: String,
val finalScore: Int?
) {
fun generateExtraWhereSql(alias: String): String {
val sb = StringBuilder()
Expand All @@ -16,7 +16,7 @@ data class IncludedPlayerParameters(

if (finalScoreComparator.equals(COMPARATOR_SCORE_UNSET, ignoreCase = true)) {
sb.append(" AND $alias.FinalScore = -1")
} else if (finalScore > -1) {
} else if (finalScore != null) {
sb.append(" AND $alias.FinalScore $finalScoreComparator $finalScore")
sb.append(" AND $alias.FinalScore > -1")
}
Expand Down
64 changes: 21 additions & 43 deletions src/main/kotlin/dartzee/reporting/ReportParameters.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,73 +3,58 @@ package dartzee.reporting
import dartzee.core.util.DateStatics
import dartzee.core.util.getEndOfTimeSqlString
import dartzee.core.util.getSqlString
import dartzee.db.PlayerEntity
import dartzee.db.SyncAuditEntity
import dartzee.game.GameType
import dartzee.utils.InjectedThings.mainDatabase
import java.sql.Timestamp

class ReportParameters {
var gameType: GameType? = null
var gameParams = ""
var unfinishedOnly = false
var dtStartFrom: Timestamp? = null
var dtStartTo: Timestamp? = null
var dtFinishFrom: Timestamp? = null
var dtFinishTo: Timestamp? = null
var hmIncludedPlayerToParms = mapOf<PlayerEntity, IncludedPlayerParameters>()
var excludedPlayers: List<PlayerEntity> = ArrayList()
var excludeOnlyAi: Boolean = false
var partOfMatch = MatchFilter.BOTH
var pendingChanges: Boolean? = null

data class ReportParameters(val game: ReportParametersGame, val players: ReportParametersPlayers) {

fun getExtraWhereSql(): String {
val sb = StringBuilder()

if (gameType != null) {
sb.append(" AND g.GameType = '$gameType'")
if (game.gameType != null) {
sb.append(" AND g.GameType = '${game.gameType}'")
}

if (!gameParams.isEmpty()) {
sb.append(" AND g.GameParams = '$gameParams'")
if (game.gameParams.isNotEmpty()) {
sb.append(" AND g.GameParams = '${game.gameParams}'")
}

if (dtStartFrom != null) {
if (game.dtStartFrom != null) {
sb.append(" AND g.DtCreation >= '")
sb.append(dtStartFrom)
sb.append(game.dtStartFrom)
sb.append("'")
}

if (dtStartTo != null) {
if (game.dtStartTo != null) {
sb.append(" AND g.DtCreation <= '")
sb.append(dtStartTo)
sb.append(game.dtStartTo)
sb.append("'")
}

if (dtFinishFrom != null) {
if (game.dtFinishFrom != null) {
sb.append(" AND g.DtFinish >= '")
sb.append(dtFinishFrom)
sb.append(game.dtFinishFrom)
sb.append("'")
}

if (dtFinishTo != null) {
if (game.dtFinishTo != null) {
sb.append(" AND g.DtFinish <= '")
sb.append(dtFinishTo)
sb.append(game.dtFinishTo)
sb.append("'")
}

if (unfinishedOnly) {
if (game.unfinishedOnly) {
sb.append(" AND g.DtFinish = ")
sb.append(getEndOfTimeSqlString())
}

if (partOfMatch == MatchFilter.GAMES_ONLY) {
if (game.partOfMatch == MatchFilter.GAMES_ONLY) {
sb.append(" AND g.DartsMatchId = ''")
} else if (partOfMatch == MatchFilter.MATCHES_ONLY) {
} else if (game.partOfMatch == MatchFilter.MATCHES_ONLY) {
sb.append(" AND g.DartsMatchId <> ''")
}

pendingChanges?.let { pendingChanges ->
game.pendingChanges?.let { pendingChanges ->
val dtLastSynced =
SyncAuditEntity.getLastSyncData(mainDatabase)?.lastSynced
?: DateStatics.START_OF_TIME
Expand All @@ -80,7 +65,7 @@ class ReportParameters {
}
}

val it = hmIncludedPlayerToParms.entries.iterator()
val it = players.includedPlayers.entries.iterator()
while (it.hasNext()) {
val entry = it.next()
val player = entry.key
Expand All @@ -97,14 +82,14 @@ class ReportParameters {
sb.append(")")
}

for (player in excludedPlayers) {
for (player in players.excludedPlayers) {
sb.append(" AND NOT EXISTS (")
sb.append(" SELECT 1 FROM Participant z")
sb.append(" WHERE z.PlayerId = '${player.rowId}'")
sb.append(" AND z.GameId = g.RowId)")
}

if (excludeOnlyAi) {
if (players.excludeOnlyAi) {
sb.append(" AND EXISTS (")
sb.append(" SELECT 1 FROM Participant z, Player p")
sb.append(" WHERE z.PlayerId = p.RowId")
Expand All @@ -114,13 +99,6 @@ class ReportParameters {

return sb.toString()
}

override fun toString() =
"[$gameType, $gameParams, $dtStartFrom, $dtStartTo, $dtFinishFrom, $dtFinishTo]"

fun setEnforceMatch(matches: Boolean) {
partOfMatch = if (matches) MatchFilter.MATCHES_ONLY else MatchFilter.GAMES_ONLY
}
}

enum class MatchFilter {
Expand Down
16 changes: 16 additions & 0 deletions src/main/kotlin/dartzee/reporting/ReportParametersGame.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dartzee.reporting

import dartzee.game.GameType
import java.sql.Timestamp

data class ReportParametersGame(
val gameType: GameType?,
val gameParams: String,
val dtStartFrom: Timestamp?,
val dtStartTo: Timestamp?,
val unfinishedOnly: Boolean,
val dtFinishFrom: Timestamp?,
val dtFinishTo: Timestamp?,
val partOfMatch: MatchFilter?,
val pendingChanges: Boolean?
)
9 changes: 9 additions & 0 deletions src/main/kotlin/dartzee/reporting/ReportParametersPlayers.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dartzee.reporting

import dartzee.db.PlayerEntity

data class ReportParametersPlayers(
val includedPlayers: Map<PlayerEntity, IncludedPlayerParameters>,
val excludedPlayers: List<PlayerEntity>,
val excludeOnlyAi: Boolean,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ import dartzee.game.GameType
import dartzee.utils.InjectedThings.mainDatabase
import java.sql.ResultSet
import java.sql.Timestamp
import javax.swing.JCheckBox

fun <T> grabIfSelected(checkbox: JCheckBox, getter: () -> T): T? {
return if (checkbox.isSelected) getter() else null
}

/** Refactored from ReportingResultsScreen */
fun runReport(rp: ReportParameters?): List<ReportResultWrapper> {
rp ?: return listOf()
rp ?: return emptyList()

var sql = buildBasicSqlStatement()
sql += rp.getExtraWhereSql()
Expand Down
22 changes: 7 additions & 15 deletions src/main/kotlin/dartzee/screen/reporting/PlayerParametersPanel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import dartzee.db.MAX_PLAYERS
import dartzee.db.PlayerEntity
import dartzee.reporting.COMPARATOR_SCORE_UNSET
import dartzee.reporting.IncludedPlayerParameters
import dartzee.reporting.grabIfSelected
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import javax.swing.JCheckBox
Expand Down Expand Up @@ -55,22 +56,13 @@ class PlayerParametersPanel : JPanel(), ActionListener {
}

fun generateParameters(): IncludedPlayerParameters {
val parms = IncludedPlayerParameters()
val finalScore = grabIfSelected(chckbxFinalScore) { spinner.value as Int }
val finalScoreComparator =
grabIfSelected(chckbxFinalScore) { comboBox.selectedItem as String } ?: ""
val finishingPosition =
grabIfSelected(chckbxPosition) { getFinishingPositions() } ?: emptyList()

if (chckbxFinalScore.isSelected) {
val finalScore = spinner.value as Int
val comparator = comboBox.selectedItem as String

parms.finalScore = finalScore
parms.finalScoreComparator = comparator
}

if (chckbxPosition.isSelected) {
val finishingPositions = getFinishingPositions()
parms.finishingPositions = finishingPositions
}

return parms
return IncludedPlayerParameters(finishingPosition, finalScoreComparator, finalScore)
}

private fun getFinishingPositions(): List<Int> {
Expand Down
63 changes: 33 additions & 30 deletions src/main/kotlin/dartzee/screen/reporting/ReportingGameTab.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import dartzee.core.bean.isSelectedAndEnabled
import dartzee.core.util.addActionListenerToAllChildren
import dartzee.core.util.createButtonGroup
import dartzee.core.util.enableChildren
import dartzee.reporting.ReportParameters
import dartzee.reporting.MatchFilter
import dartzee.reporting.ReportParametersGame
import dartzee.reporting.grabIfSelected
import dartzee.utils.getFilterPanel
import java.awt.FlowLayout
import java.awt.event.ActionEvent
Expand Down Expand Up @@ -112,35 +114,36 @@ class ReportingGameTab : JPanel(), ActionListener {

fun valid() = dateFilterPanelStart.valid() && dateFilterPanelFinish.valid()

fun populateReportParameters(rp: ReportParameters) {
if (checkBoxGameType.isSelected) {
rp.gameType = comboBox.getGameType()
}

if (cbType.isSelected) {
rp.gameParams = panelGameParams.getGameParams()
}

if (cbPartOfMatch.isSelected) {
rp.setEnforceMatch(rdbtnYes.isSelected)
}

if (cbSyncStatus.isSelected) {
rp.pendingChanges = rdbtnPendingChanges.isSelected
}

if (cbStartDate.isSelected) {
rp.dtStartFrom = dateFilterPanelStart.getSqlDtFrom()
rp.dtStartTo = dateFilterPanelStart.getSqlDtTo()
}

if (cbFinishDate.isSelected) {
if (rdbtnUnfinished.isSelected) {
rp.unfinishedOnly = true
} else {
rp.dtFinishFrom = dateFilterPanelFinish.getSqlDtFrom()
rp.dtFinishTo = dateFilterPanelFinish.getSqlDtTo()
fun generateReportParameters(): ReportParametersGame {
val gameType = grabIfSelected(checkBoxGameType) { comboBox.getGameType() }
val gameParams = grabIfSelected(cbType) { panelGameParams.getGameParams() } ?: ""
val dtStartFrom = grabIfSelected(cbStartDate) { dateFilterPanelStart.getSqlDtFrom() }
val dtStartTo = grabIfSelected(cbStartDate) { dateFilterPanelStart.getSqlDtTo() }
val unfinishedOnly = grabIfSelected(cbFinishDate) { rdbtnUnfinished.isSelected } ?: false
val dtFinishFrom =
grabIfSelected(cbFinishDate) {
if (rdbtnUnfinished.isSelected) null else dateFilterPanelFinish.getSqlDtFrom()
}
}
val dtFinishTo =
grabIfSelected(cbFinishDate) {
if (rdbtnUnfinished.isSelected) null else dateFilterPanelFinish.getSqlDtTo()
}
val enforceMatch = grabIfSelected(cbPartOfMatch) { enforceMatch() }
val pendingChanges = grabIfSelected(cbSyncStatus) { rdbtnPendingChanges.isSelected }

return ReportParametersGame(
gameType,
gameParams,
dtStartFrom,
dtStartTo,
unfinishedOnly,
dtFinishFrom,
dtFinishTo,
enforceMatch,
pendingChanges
)
}

private fun enforceMatch() =
if (rdbtnYes.isSelected) MatchFilter.MATCHES_ONLY else MatchFilter.GAMES_ONLY
}
28 changes: 18 additions & 10 deletions src/main/kotlin/dartzee/screen/reporting/ReportingPlayersTab.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import dartzee.core.bean.RowSelectionListener
import dartzee.core.bean.ScrollTable
import dartzee.core.util.DialogUtil
import dartzee.db.PlayerEntity
import dartzee.reporting.ReportParameters
import dartzee.reporting.ReportParametersPlayers
import dartzee.screen.PlayerSelectDialog
import dartzee.screen.ScreenCache
import java.awt.BorderLayout
Expand Down Expand Up @@ -149,14 +149,22 @@ class ReportingPlayersTab : JPanel(), ActionListener, RowSelectionListener {
return true
}

fun populateReportParameters(rp: ReportParameters) {
rp.excludeOnlyAi = checkBoxExcludeOnlyAi.isSelected

if (rdbtnInclude.isSelected) {
rp.hmIncludedPlayerToParms =
hmPlayerToParametersPanel.mapValues { entry -> entry.value.generateParameters() }
} else {
rp.excludedPlayers = hmPlayerToParametersPanel.keys.toList()
}
fun generateReportParameters(): ReportParametersPlayers {
val excludeOnlyAi = checkBoxExcludeOnlyAi.isSelected
val includedPlayers =
if (rdbtnInclude.isSelected) {
hmPlayerToParametersPanel.mapValues { it.value.generateParameters() }
} else {
emptyMap()
}

val excludedPlayers =
if (rdbtnExclude.isSelected) {
hmPlayerToParametersPanel.keys.toList()
} else {
emptyList()
}

return ReportParametersPlayers(includedPlayers, excludedPlayers, excludeOnlyAi)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,8 @@ class ReportingSetupScreen : EmbeddedScreen() {
}

private fun generateReportParams(): ReportParameters {
val rp = ReportParameters()
gameTab.populateReportParameters(rp)
playerTab.populateReportParameters(rp)
return rp
val gameFilters = gameTab.generateReportParameters()
val playerFilters = playerTab.generateReportParameters()
return ReportParameters(gameFilters, playerFilters)
}
}
Loading

0 comments on commit 0d84d59

Please sign in to comment.