Prevent players playing one 1 event from getting drawn out
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
package nl.connectedit.swiss.domain.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import nl.connectedit.swiss.domain.EventType;
|
||||
@@ -91,4 +93,18 @@ public class Tournament extends AbstractEntity {
|
||||
var drawnOutPlayers = this.getDrawnOutPlayers();
|
||||
return drawnOutPlayers.size() == new HashSet<>(drawnOutPlayers).size();
|
||||
}
|
||||
|
||||
public List<Player> getPlayersPlayingOnlyOneEvent() {
|
||||
var playerEvents = new HashMap<Player, List<EventType>>();
|
||||
for (var registration : getRegistrations()) {
|
||||
if (!playerEvents.containsKey(registration.getPlayer())) {
|
||||
playerEvents.put(registration.getPlayer(), new ArrayList<>());
|
||||
}
|
||||
playerEvents.get(registration.getPlayer()).add(registration.getEvent().getType());
|
||||
}
|
||||
return playerEvents.entrySet().stream()
|
||||
.filter(entry -> entry.getValue().size() == 1)
|
||||
.map(Map.Entry::getKey)
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ public class TournamentDrawService {
|
||||
round.setName("Ronde 1");
|
||||
round.setGroup(group);
|
||||
do {
|
||||
round.setMatches(createMatchList(group, round));
|
||||
round.setMatches(createMatchList(tournament, group, round));
|
||||
} while (!tournament.hasPlayersDrawnOutMaxOnce());
|
||||
round.setStatus(Status.NOT_STARTED);
|
||||
}
|
||||
@@ -87,7 +87,7 @@ public class TournamentDrawService {
|
||||
return tournament;
|
||||
}
|
||||
|
||||
private List<Match> createMatchList(Group group, Round round) {
|
||||
private List<Match> createMatchList(Tournament tournament, Group group, Round round) {
|
||||
List<Match> matches;
|
||||
var drawCounter = 0;
|
||||
do {
|
||||
@@ -112,12 +112,18 @@ public class TournamentDrawService {
|
||||
match.setRound(round);
|
||||
matches.add(match);
|
||||
}
|
||||
} while (!drawIsValid(matches) || drawCounter == 1000);
|
||||
} while (!drawIsValid(tournament, matches, round) || drawCounter == 1000);
|
||||
|
||||
return matches;
|
||||
}
|
||||
|
||||
private boolean drawIsValid(List<Match> matches) {
|
||||
private boolean drawIsValid(Tournament tournament, List<Match> matches, Round round) {
|
||||
var playersNotToBeDrawnOut = tournament.getPlayersPlayingOnlyOneEvent();
|
||||
if (round.getDrawnOut() != null &&
|
||||
(playersNotToBeDrawnOut.contains(round.getDrawnOut().getPlayer1()) ||
|
||||
(round.getDrawnOut().getPlayer2() != null && playersNotToBeDrawnOut.contains(round.getDrawnOut().getPlayer2())))) {
|
||||
return false;
|
||||
}
|
||||
for (var match : matches) {
|
||||
var clubs = getClubsFromMatch(match);
|
||||
var distinctClubs = new HashSet<>(clubs).size();
|
||||
|
||||
@@ -67,11 +67,12 @@ public class TournamentPlayService {
|
||||
round.setStatus(Status.NOT_STARTED);
|
||||
|
||||
if (remainingTeams.size() % 2 == 1) {
|
||||
var drawnOutPlayers = tournament.getDrawnOutPlayers();
|
||||
var playersNotToBeDrawnOut = tournament.getDrawnOutPlayers();
|
||||
playersNotToBeDrawnOut.addAll(tournament.getPlayersPlayingOnlyOneEvent());
|
||||
var tryPosition = remainingTeams.size() - 1;
|
||||
do {
|
||||
var tryDrawOutTeam = remainingTeams.get(tryPosition);
|
||||
if (!drawnOutPlayers.contains(tryDrawOutTeam.getPlayer1()) && (tryDrawOutTeam.getPlayer2() == null || !drawnOutPlayers.contains(tryDrawOutTeam.getPlayer2()))) {
|
||||
if (!playersNotToBeDrawnOut.contains(tryDrawOutTeam.getPlayer1()) && (tryDrawOutTeam.getPlayer2() == null || !playersNotToBeDrawnOut.contains(tryDrawOutTeam.getPlayer2()))) {
|
||||
remainingTeams.remove(tryDrawOutTeam);
|
||||
round.setDrawnOut(tryDrawOutTeam);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user