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;
|
package nl.connectedit.swiss.domain.entity;
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import nl.connectedit.swiss.domain.EventType;
|
import nl.connectedit.swiss.domain.EventType;
|
||||||
@@ -91,4 +93,18 @@ public class Tournament extends AbstractEntity {
|
|||||||
var drawnOutPlayers = this.getDrawnOutPlayers();
|
var drawnOutPlayers = this.getDrawnOutPlayers();
|
||||||
return drawnOutPlayers.size() == new HashSet<>(drawnOutPlayers).size();
|
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.setName("Ronde 1");
|
||||||
round.setGroup(group);
|
round.setGroup(group);
|
||||||
do {
|
do {
|
||||||
round.setMatches(createMatchList(group, round));
|
round.setMatches(createMatchList(tournament, group, round));
|
||||||
} while (!tournament.hasPlayersDrawnOutMaxOnce());
|
} while (!tournament.hasPlayersDrawnOutMaxOnce());
|
||||||
round.setStatus(Status.NOT_STARTED);
|
round.setStatus(Status.NOT_STARTED);
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ public class TournamentDrawService {
|
|||||||
return tournament;
|
return tournament;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Match> createMatchList(Group group, Round round) {
|
private List<Match> createMatchList(Tournament tournament, Group group, Round round) {
|
||||||
List<Match> matches;
|
List<Match> matches;
|
||||||
var drawCounter = 0;
|
var drawCounter = 0;
|
||||||
do {
|
do {
|
||||||
@@ -112,12 +112,18 @@ public class TournamentDrawService {
|
|||||||
match.setRound(round);
|
match.setRound(round);
|
||||||
matches.add(match);
|
matches.add(match);
|
||||||
}
|
}
|
||||||
} while (!drawIsValid(matches) || drawCounter == 1000);
|
} while (!drawIsValid(tournament, matches, round) || drawCounter == 1000);
|
||||||
|
|
||||||
return matches;
|
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) {
|
for (var match : matches) {
|
||||||
var clubs = getClubsFromMatch(match);
|
var clubs = getClubsFromMatch(match);
|
||||||
var distinctClubs = new HashSet<>(clubs).size();
|
var distinctClubs = new HashSet<>(clubs).size();
|
||||||
|
|||||||
@@ -67,11 +67,12 @@ public class TournamentPlayService {
|
|||||||
round.setStatus(Status.NOT_STARTED);
|
round.setStatus(Status.NOT_STARTED);
|
||||||
|
|
||||||
if (remainingTeams.size() % 2 == 1) {
|
if (remainingTeams.size() % 2 == 1) {
|
||||||
var drawnOutPlayers = tournament.getDrawnOutPlayers();
|
var playersNotToBeDrawnOut = tournament.getDrawnOutPlayers();
|
||||||
|
playersNotToBeDrawnOut.addAll(tournament.getPlayersPlayingOnlyOneEvent());
|
||||||
var tryPosition = remainingTeams.size() - 1;
|
var tryPosition = remainingTeams.size() - 1;
|
||||||
do {
|
do {
|
||||||
var tryDrawOutTeam = remainingTeams.get(tryPosition);
|
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);
|
remainingTeams.remove(tryDrawOutTeam);
|
||||||
round.setDrawnOut(tryDrawOutTeam);
|
round.setDrawnOut(tryDrawOutTeam);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user