fix round to loser and court Index modification

multistore
Razmig Sarkissian 2 years ago
parent 9758ecfcbc
commit 348aa591f3
  1. 4
      PadelClub/Data/Match.swift
  2. 36
      PadelClub/Data/Round.swift
  3. 2
      PadelClub/Data/Tournament.swift
  4. 11
      PadelClub/ViewModel/MatchScheduler.swift
  5. 7
      PadelClub/Views/Planning/PlanningSettingsView.swift

@ -195,7 +195,7 @@ class Match: ModelObject, Storable {
func _toggleForwardMatchDisableState(_ state: Bool) { func _toggleForwardMatchDisableState(_ state: Bool) {
guard let roundObject else { return } guard let roundObject else { return }
guard roundObject.loser != nil else { return } guard roundObject.parent != nil else { return }
guard let forwardMatch = _forwardMatch(inRound: roundObject) else { return } guard let forwardMatch = _forwardMatch(inRound: roundObject) else { return }
guard let next = _otherMatch() else { return } guard let next = _otherMatch() else { return }
if next.disabled && byeState == false && next.byeState == false { if next.disabled && byeState == false && next.byeState == false {
@ -590,7 +590,7 @@ class Match: ModelObject, Storable {
} }
var isLoserBracket: Bool { var isLoserBracket: Bool {
roundObject?.loser != nil roundObject?.parent != nil
} }
var teamScores: [TeamScore] { var teamScores: [TeamScore] {

@ -15,14 +15,14 @@ class Round: ModelObject, Storable {
var id: String = Store.randomId() var id: String = Store.randomId()
var tournament: String var tournament: String
var index: Int var index: Int
var loser: String? var parent: String?
var format: Int? var format: Int?
var startDate: Date? var startDate: Date?
internal init(tournament: String, index: Int, loser: String? = nil, matchFormat: MatchFormat? = nil) { internal init(tournament: String, index: Int, parent: String? = nil, matchFormat: MatchFormat? = nil) {
self.tournament = tournament self.tournament = tournament
self.index = index self.index = index
self.loser = loser self.parent = parent
self.format = matchFormat?.rawValue self.format = matchFormat?.rawValue
} }
@ -53,7 +53,7 @@ class Round: ModelObject, Storable {
} }
func upperMatches(ofMatch match: Match) -> [Match] { func upperMatches(ofMatch match: Match) -> [Match] {
if loser != nil, previousRound() == nil, let parentRound { if parent != nil, previousRound() == nil, let parentRound {
let matchIndex = match.index let matchIndex = match.index
let indexInRound = RoundRule.matchIndexWithinRound(fromMatchIndex: matchIndex) let indexInRound = RoundRule.matchIndexWithinRound(fromMatchIndex: matchIndex)
return [parentRound.getMatch(atMatchIndexInRound: indexInRound * 2), parentRound.getMatch(atMatchIndexInRound: indexInRound * 2 + 1)].compactMap({ $0 }) return [parentRound.getMatch(atMatchIndexInRound: indexInRound * 2), parentRound.getMatch(atMatchIndexInRound: indexInRound * 2 + 1)].compactMap({ $0 })
@ -131,8 +131,8 @@ class Round: ModelObject, Storable {
case .one: case .one:
if let luckyLoser = match.teamScores.first(where: { $0.luckyLoser == match.index * 2 }) { if let luckyLoser = match.teamScores.first(where: { $0.luckyLoser == match.index * 2 }) {
return luckyLoser.team return luckyLoser.team
} else if let loser = upperBracketTopMatch(ofMatchIndex: match.index)?.losingTeamId { } else if let parent = upperBracketTopMatch(ofMatchIndex: match.index)?.losingTeamId {
return Store.main.findById(loser) return Store.main.findById(parent)
} else if let previousMatch = topPreviousRoundMatch(ofMatch: match) { } else if let previousMatch = topPreviousRoundMatch(ofMatch: match) {
if let teamId = previousMatch.winningTeamId { if let teamId = previousMatch.winningTeamId {
return Store.main.findById(teamId) return Store.main.findById(teamId)
@ -143,8 +143,8 @@ class Round: ModelObject, Storable {
case .two: case .two:
if let luckyLoser = match.teamScores.first(where: { $0.luckyLoser == match.index * 2 + 1 }) { if let luckyLoser = match.teamScores.first(where: { $0.luckyLoser == match.index * 2 + 1 }) {
return luckyLoser.team return luckyLoser.team
} else if let loser = upperBracketBottomMatch(ofMatchIndex: match.index)?.losingTeamId { } else if let parent = upperBracketBottomMatch(ofMatchIndex: match.index)?.losingTeamId {
return Store.main.findById(loser) return Store.main.findById(parent)
} else if let previousMatch = bottomPreviousRoundMatch(ofMatch: match) { } else if let previousMatch = bottomPreviousRoundMatch(ofMatch: match) {
if let teamId = previousMatch.winningTeamId { if let teamId = previousMatch.winningTeamId {
return Store.main.findById(teamId) return Store.main.findById(teamId)
@ -196,7 +196,7 @@ class Round: ModelObject, Storable {
} }
func playedMatches() -> [Match] { func playedMatches() -> [Match] {
if loser == nil { if parent == nil {
Store.main.filter { $0.round == self.id && $0.disabled == false } Store.main.filter { $0.round == self.id && $0.disabled == false }
} else { } else {
_matches() _matches()
@ -204,11 +204,11 @@ class Round: ModelObject, Storable {
} }
func previousRound() -> Round? { func previousRound() -> Round? {
Store.main.filter(isIncluded: { $0.tournament == tournament && $0.loser == loser && $0.index == index + 1 }).first Store.main.filter(isIncluded: { $0.tournament == tournament && $0.parent == parent && $0.index == index + 1 }).first
} }
func nextRound() -> Round? { func nextRound() -> Round? {
Store.main.filter(isIncluded: { $0.tournament == tournament && $0.loser == loser && $0.index == index - 1 }).first Store.main.filter(isIncluded: { $0.tournament == tournament && $0.parent == parent && $0.index == index - 1 }).first
} }
func loserRounds(forRoundIndex roundIndex: Int) -> [Round] { func loserRounds(forRoundIndex roundIndex: Int) -> [Round] {
@ -314,7 +314,7 @@ class Round: ModelObject, Storable {
} }
func seedInterval() -> SeedInterval? { func seedInterval() -> SeedInterval? {
if loser == nil { if parent == nil {
let numberOfMatches = RoundRule.numberOfMatches(forRoundIndex: index + 1) let numberOfMatches = RoundRule.numberOfMatches(forRoundIndex: index + 1)
let initialMatchIndexFromRoundIndex = RoundRule.matchIndex(fromRoundIndex: index) let initialMatchIndexFromRoundIndex = RoundRule.matchIndex(fromRoundIndex: index)
let seedsAfterThisRound : [TeamRegistration] = Store.main.filter(isIncluded: { let seedsAfterThisRound : [TeamRegistration] = Store.main.filter(isIncluded: {
@ -337,7 +337,7 @@ class Round: ModelObject, Storable {
} }
func roundTitle(_ displayStyle: DisplayStyle = .wide) -> String { func roundTitle(_ displayStyle: DisplayStyle = .wide) -> String {
if loser != nil { if parent != nil {
return seedInterval()?.localizedLabel(displayStyle) ?? "Pas trouvé" return seedInterval()?.localizedLabel(displayStyle) ?? "Pas trouvé"
} }
return RoundRule.roundName(fromRoundIndex: index) return RoundRule.roundName(fromRoundIndex: index)
@ -352,7 +352,7 @@ class Round: ModelObject, Storable {
} }
func loserRounds() -> [Round] { func loserRounds() -> [Round] {
return Store.main.filter(isIncluded: { $0.loser == id }).sorted(by: \.index).reversed() return Store.main.filter(isIncluded: { $0.parent == id }).sorted(by: \.index).reversed()
} }
func loserRoundsAndChildren() -> [Round] { func loserRoundsAndChildren() -> [Round] {
@ -361,7 +361,7 @@ class Round: ModelObject, Storable {
} }
func isLoserBracket() -> Bool { func isLoserBracket() -> Bool {
loser != nil parent != nil
} }
func buildLoserBracket() { func buildLoserBracket() {
@ -373,7 +373,7 @@ class Round: ModelObject, Storable {
let rounds = (0..<roundCount).map { //index 0 is the final let rounds = (0..<roundCount).map { //index 0 is the final
let round = Round(tournament: tournament, index: $0, matchFormat: loserBracketMatchFormat) let round = Round(tournament: tournament, index: $0, matchFormat: loserBracketMatchFormat)
round.loser = id //parent round.parent = id //parent
return round return round
} }
@ -398,7 +398,7 @@ class Round: ModelObject, Storable {
} }
var parentRound: Round? { var parentRound: Round? {
guard let parent = loser else { return nil } guard let parent = parent else { return nil }
return Store.main.findById(parent) return Store.main.findById(parent)
} }
@ -420,7 +420,7 @@ class Round: ModelObject, Storable {
case _id = "id" case _id = "id"
case _tournament = "tournament" case _tournament = "tournament"
case _index = "index" case _index = "index"
case _loser = "loser" case _parent = "parent"
case _format = "format" case _format = "format"
case _startDate = "startDate" case _startDate = "startDate"
} }

@ -356,7 +356,7 @@ class Tournament : ModelObject, Storable {
} }
func rounds() -> [Round] { func rounds() -> [Round] {
Store.main.filter { $0.tournament == self.id && $0.loser == nil }.sorted(by: \.index).reversed() Store.main.filter { $0.tournament == self.id && $0.parent == nil }.sorted(by: \.index).reversed()
} }
func sortedTeams() -> [TeamRegistration] { func sortedTeams() -> [TeamRegistration] {

@ -391,7 +391,7 @@ class MatchScheduler {
if shouldHandleUpperRoundSlice() { if shouldHandleUpperRoundSlice() {
let roundMatchesCount = roundObject.playedMatches().count let roundMatchesCount = roundObject.playedMatches().count
print("shouldHandleUpperRoundSlice \(roundMatchesCount)") print("shouldHandleUpperRoundSlice \(roundMatchesCount)")
if roundObject.loser == nil && roundMatchesCount > courts.count { if roundObject.parent == nil && roundMatchesCount > courts.count {
print("roundMatchesCount \(roundMatchesCount) > \(courts.count)") print("roundMatchesCount \(roundMatchesCount) > \(courts.count)")
if currentRotationSameRoundMatches >= min(roundMatchesCount / 2, courts.count) { if currentRotationSameRoundMatches >= min(roundMatchesCount / 2, courts.count) {
print("return false, \(currentRotationSameRoundMatches) >= \(min(roundMatchesCount / 2, courts.count))") print("return false, \(currentRotationSameRoundMatches) >= \(min(roundMatchesCount / 2, courts.count))")
@ -403,7 +403,7 @@ class MatchScheduler {
let indexInRound = match.indexInRound() let indexInRound = match.indexInRound()
print("Upper Round, index > 0, first Match of round \(indexInRound) and more than one court available; looking for next match (same round) \(indexInRound + 1)") print("Upper Round, index > 0, first Match of round \(indexInRound) and more than one court available; looking for next match (same round) \(indexInRound + 1)")
if roundObject.loser == nil && roundObject.index > 0, indexInRound == 0, courts.count > 1, let nextMatch = match.next() { if roundObject.parent == nil && roundObject.index > 0, indexInRound == 0, courts.count > 1, let nextMatch = match.next() {
if canBePlayed && roundMatchCanBePlayed(nextMatch, roundObject: roundObject, slots: slots, rotationIndex: rotationIndex, targetedStartDate: rotationStartDate, minimumTargetedEndDate: &minimumTargetedEndDate) { if canBePlayed && roundMatchCanBePlayed(nextMatch, roundObject: roundObject, slots: slots, rotationIndex: rotationIndex, targetedStartDate: rotationStartDate, minimumTargetedEndDate: &minimumTargetedEndDate) {
print("next match and this match can be played, returning true") print("next match and this match can be played, returning true")
@ -417,7 +417,7 @@ class MatchScheduler {
print("\(currentRotationSameRoundMatches) modulo \(currentRotationSameRoundMatches%2) same round match is even, index of round is not 0 and upper bracket. If it's not the last court available \(courtIndex) == \(courts.count - 1)") print("\(currentRotationSameRoundMatches) modulo \(currentRotationSameRoundMatches%2) same round match is even, index of round is not 0 and upper bracket. If it's not the last court available \(courtIndex) == \(courts.count - 1)")
if currentRotationSameRoundMatches%2 == 0 && roundObject.index != 0 && roundObject.loser == nil && courtIndex == courts.count - 1 { if currentRotationSameRoundMatches%2 == 0 && roundObject.index != 0 && roundObject.parent == nil && courtIndex == courts.count - 1 {
print("we return false") print("we return false")
return false return false
} }
@ -427,7 +427,7 @@ class MatchScheduler {
}) { }) {
print(first.roundObject!.roundTitle(), first.matchTitle(), courtIndex, rotationStartDate) print(first.roundObject!.roundTitle(), first.matchTitle(), courtIndex, rotationStartDate)
if first.roundObject!.loser == nil { if first.roundObject!.parent == nil {
if let roundIndex = matchPerRound[first.roundObject!.index] { if let roundIndex = matchPerRound[first.roundObject!.index] {
matchPerRound[first.roundObject!.index] = roundIndex + 1 matchPerRound[first.roundObject!.index] = roundIndex + 1
} else { } else {
@ -477,6 +477,7 @@ class MatchScheduler {
flattenedMatches.forEach({ flattenedMatches.forEach({
if (roundId == nil && matchId == nil) || $0.startDate?.isEarlierThan(startDate) == false { if (roundId == nil && matchId == nil) || $0.startDate?.isEarlierThan(startDate) == false {
$0.startDate = nil $0.startDate = nil
$0.removeCourt()
} }
}) })
@ -510,7 +511,7 @@ class MatchScheduler {
roundDispatch.timedMatches.forEach { matchSchedule in roundDispatch.timedMatches.forEach { matchSchedule in
if let match = flattenedMatches.first(where: { $0.id == matchSchedule.matchID }) { if let match = flattenedMatches.first(where: { $0.id == matchSchedule.matchID }) {
match.startDate = matchSchedule.startDate match.startDate = matchSchedule.startDate
match.setCourt(matchSchedule.courtIndex + 1) match.setCourt(matchSchedule.courtIndex)
} }
} }

@ -204,7 +204,10 @@ struct PlanningSettingsView: View {
matchScheduler.timeDifferenceLimit = timeDifferenceLimit matchScheduler.timeDifferenceLimit = timeDifferenceLimit
let matches = tournament.groupStages().flatMap({ $0._matches() }) let matches = tournament.groupStages().flatMap({ $0._matches() })
matches.forEach({ $0.startDate = nil }) matches.forEach({
$0.removeCourt()
$0.startDate = nil
})
var lastDate : Date = tournament.startDate var lastDate : Date = tournament.startDate
groupStages.chunked(into: groupStageCourtCount).forEach { groups in groupStages.chunked(into: groupStageCourtCount).forEach { groups in
@ -222,7 +225,7 @@ struct PlanningSettingsView: View {
match.startDate = matchStartDate match.startDate = matchStartDate
lastDate = matchStartDate.addingTimeInterval(Double(estimatedDuration) * 60) lastDate = matchStartDate.addingTimeInterval(Double(estimatedDuration) * 60)
} }
match.setCourt(matchSchedule.courtIndex + 1) match.setCourt(matchSchedule.courtIndex)
} }
} }
} }

Loading…
Cancel
Save