From bc87b0670b5da6c2def6e307c970b8cd19a9b27e Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Fri, 4 May 2012 15:38:47 +0000 Subject: [PATCH] Having one common standings calculator for tournaments and leagues. --- .../competitive/CompetitiveMatchResult.java | 7 ++ .../{ => competitive}/PlayerStanding.java | 2 +- .../lotro/competitive/StandingsProducer.java | 101 +++++++++++++++ .../gempukku/lotro/db/DbLeagueMatchDAO.java | 8 +- .../com/gempukku/lotro/db/LeagueMatchDAO.java | 4 +- ...eagueMatch.java => LeagueMatchResult.java} | 6 +- .../lotro/league/CachedLeagueMatchDAO.java | 16 +-- .../lotro/league/ConstructedLeagueData.java | 2 +- .../com/gempukku/lotro/league/LeagueData.java | 2 +- .../gempukku/lotro/league/LeagueService.java | 119 +++--------------- .../league/NewConstructedLeagueData.java | 2 +- .../lotro/league/NewSealedLeagueData.java | 2 +- .../lotro/league/SealedLeagueData.java | 2 +- .../gempukku/lotro/tournament/Tournament.java | 118 ++--------------- .../lotro/tournament/TournamentMatch.java | 13 +- .../lotro/league/LeagueServiceTest.java | 18 +-- .../gempukku/lotro/server/LeagueResource.java | 2 +- 17 files changed, 183 insertions(+), 241 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/CompetitiveMatchResult.java rename gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/{ => competitive}/PlayerStanding.java (95%) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/StandingsProducer.java rename gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/{LeagueMatch.java => LeagueMatchResult.java} (63%) diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/CompetitiveMatchResult.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/CompetitiveMatchResult.java new file mode 100644 index 000000000..b6351f686 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/CompetitiveMatchResult.java @@ -0,0 +1,7 @@ +package com.gempukku.lotro.competitive; + +public interface CompetitiveMatchResult { + public String getWinner(); + + public String getLoser(); +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/PlayerStanding.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/PlayerStanding.java similarity index 95% rename from gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/PlayerStanding.java rename to gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/PlayerStanding.java index 4fa8e0545..defd95926 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/PlayerStanding.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/PlayerStanding.java @@ -1,4 +1,4 @@ -package com.gempukku.lotro; +package com.gempukku.lotro.competitive; public class PlayerStanding { private String _playerName; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/StandingsProducer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/StandingsProducer.java new file mode 100644 index 000000000..8d1e80628 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/competitive/StandingsProducer.java @@ -0,0 +1,101 @@ +package com.gempukku.lotro.competitive; + +import com.gempukku.util.DescComparator; +import com.gempukku.util.MultipleComparator; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +public class StandingsProducer { + private static Comparator LEAGUE_STANDING_COMPARATOR = + new MultipleComparator( + new DescComparator(new PointsComparator()), + new GamesPlayedComparator(), + new DescComparator(new OpponentsWinComparator())); + + + public static List produceStandings(Collection participants, Collection matches, + int pointsForWin, int pointsForLoss, Set playersWithByes) { + Map> playerOpponents = new HashMap>(); + Map playerWinCounts = new HashMap(); + Map playerLossCounts = new HashMap(); + + // Initialize the list + for (String playerName : participants) { + playerOpponents.put(playerName, new ArrayList()); + playerWinCounts.put(playerName, new AtomicInteger(0)); + playerLossCounts.put(playerName, new AtomicInteger(0)); + } + + for (CompetitiveMatchResult leagueMatch : matches) { + playerOpponents.get(leagueMatch.getWinner()).add(leagueMatch.getLoser()); + playerOpponents.get(leagueMatch.getLoser()).add(leagueMatch.getWinner()); + playerWinCounts.get(leagueMatch.getWinner()).incrementAndGet(); + playerLossCounts.get(leagueMatch.getLoser()).incrementAndGet(); + } + + List leagueStandings = new LinkedList(); + for (String playerName : participants) { + int points = playerWinCounts.get(playerName).intValue() * pointsForWin + playerLossCounts.get(playerName).intValue() * pointsForLoss; + int gamesPlayed = playerWinCounts.get(playerName).intValue() + playerLossCounts.get(playerName).intValue(); + + if (playersWithByes.contains(playerName)) + points += pointsForWin; + + PlayerStanding standing = new PlayerStanding(playerName, points, gamesPlayed); + List opponents = playerOpponents.get(playerName); + int opponentWins = 0; + int opponentGames = 0; + for (String opponent : opponents) { + opponentWins += playerWinCounts.get(opponent).intValue(); + opponentGames += playerWinCounts.get(opponent).intValue() + playerLossCounts.get(opponent).intValue(); + } + if (opponentGames != 0) + standing.setOpponentWin(opponentWins * 1f / opponentGames); + else + standing.setOpponentWin(0f); + leagueStandings.add(standing); + } + + Collections.sort(leagueStandings, LEAGUE_STANDING_COMPARATOR); + + int standing = 0; + int position = 1; + PlayerStanding lastStanding = null; + for (PlayerStanding leagueStanding : leagueStandings) { + if (lastStanding == null || LEAGUE_STANDING_COMPARATOR.compare(leagueStanding, lastStanding) != 0) + standing = position; + leagueStanding.setStanding(standing); + position++; + lastStanding = leagueStanding; + } + return leagueStandings; + + } + + private static class PointsComparator implements Comparator { + @Override + public int compare(PlayerStanding o1, PlayerStanding o2) { + return o1.getPoints() - o2.getPoints(); + } + } + + private static class GamesPlayedComparator implements Comparator { + @Override + public int compare(PlayerStanding o1, PlayerStanding o2) { + return o1.getGamesPlayed() - o2.getGamesPlayed(); + } + } + + private static class OpponentsWinComparator implements Comparator { + @Override + public int compare(PlayerStanding o1, PlayerStanding o2) { + final float diff = o1.getOpponentWin() - o2.getOpponentWin(); + if (diff < 0) + return -1; + if (diff > 0) + return 1; + return 0; + } + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueMatchDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueMatchDAO.java index abfc524fd..68e60a5b6 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueMatchDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueMatchDAO.java @@ -1,7 +1,7 @@ package com.gempukku.lotro.db; import com.gempukku.lotro.db.vo.League; -import com.gempukku.lotro.db.vo.LeagueMatch; +import com.gempukku.lotro.db.vo.LeagueMatchResult; import com.gempukku.lotro.league.LeagueSerieData; import java.sql.Connection; @@ -20,7 +20,7 @@ public class DbLeagueMatchDAO implements LeagueMatchDAO { } @Override - public Collection getLeagueMatches(League league) { + public Collection getLeagueMatches(League league) { try { Connection conn = _dbAccess.getDataSource().getConnection(); try { @@ -29,13 +29,13 @@ public class DbLeagueMatchDAO implements LeagueMatchDAO { statement.setString(1, league.getType()); ResultSet rs = statement.executeQuery(); try { - Set result = new HashSet(); + Set result = new HashSet(); while (rs.next()) { String winner = rs.getString(1); String loser = rs.getString(2); String serie = rs.getString(3); - result.add(new LeagueMatch(serie, winner, loser)); + result.add(new LeagueMatchResult(serie, winner, loser)); } return result; } finally { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueMatchDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueMatchDAO.java index 736457e03..256a97415 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueMatchDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueMatchDAO.java @@ -1,13 +1,13 @@ package com.gempukku.lotro.db; import com.gempukku.lotro.db.vo.League; -import com.gempukku.lotro.db.vo.LeagueMatch; +import com.gempukku.lotro.db.vo.LeagueMatchResult; import com.gempukku.lotro.league.LeagueSerieData; import java.util.Collection; public interface LeagueMatchDAO { - public Collection getLeagueMatches(League league); + public Collection getLeagueMatches(League league); public void addPlayedMatch(League league, LeagueSerieData leagueSeason, String winner, String loser); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/LeagueMatch.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/LeagueMatchResult.java similarity index 63% rename from gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/LeagueMatch.java rename to gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/LeagueMatchResult.java index 3290288ec..4ace576ff 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/LeagueMatch.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/vo/LeagueMatchResult.java @@ -1,11 +1,13 @@ package com.gempukku.lotro.db.vo; -public class LeagueMatch { +import com.gempukku.lotro.competitive.CompetitiveMatchResult; + +public class LeagueMatchResult implements CompetitiveMatchResult { private String _winner; private String _loser; private String _serieName; - public LeagueMatch(String serieName, String winner, String loser) { + public LeagueMatchResult(String serieName, String winner, String loser) { _serieName = serieName; _winner = winner; _loser = loser; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueMatchDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueMatchDAO.java index 3cc7c322a..432ea7d94 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueMatchDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueMatchDAO.java @@ -2,7 +2,7 @@ package com.gempukku.lotro.league; import com.gempukku.lotro.db.LeagueMatchDAO; import com.gempukku.lotro.db.vo.League; -import com.gempukku.lotro.db.vo.LeagueMatch; +import com.gempukku.lotro.db.vo.LeagueMatchResult; import java.util.Collection; import java.util.Collections; @@ -16,17 +16,17 @@ public class CachedLeagueMatchDAO implements LeagueMatchDAO { private LeagueMatchDAO _leagueMatchDAO; private ReadWriteLock _readWriteLock = new ReentrantReadWriteLock(); - private Map> _cachedMatches = new ConcurrentHashMap>(); + private Map> _cachedMatches = new ConcurrentHashMap>(); public CachedLeagueMatchDAO(LeagueMatchDAO leagueMatchDAO) { _leagueMatchDAO = leagueMatchDAO; } @Override - public Collection getLeagueMatches(League league) { + public Collection getLeagueMatches(League league) { _readWriteLock.readLock().lock(); try { - Collection leagueMatches = _cachedMatches.get(LeagueMapKeys.getLeagueMapKey(league)); + Collection leagueMatches = _cachedMatches.get(LeagueMapKeys.getLeagueMapKey(league)); if (leagueMatches == null) { _readWriteLock.readLock().unlock(); _readWriteLock.writeLock().lock(); @@ -43,11 +43,11 @@ public class CachedLeagueMatchDAO implements LeagueMatchDAO { } } - private Collection getLeagueMatchesInWriteLock(League league) { - Collection leagueMatches; + private Collection getLeagueMatchesInWriteLock(League league) { + Collection leagueMatches; leagueMatches = _cachedMatches.get(LeagueMapKeys.getLeagueMapKey(league)); if (leagueMatches == null) { - leagueMatches = new CopyOnWriteArraySet(_leagueMatchDAO.getLeagueMatches(league)); + leagueMatches = new CopyOnWriteArraySet(_leagueMatchDAO.getLeagueMatches(league)); _cachedMatches.put(LeagueMapKeys.getLeagueMapKey(league), leagueMatches); } return leagueMatches; @@ -57,7 +57,7 @@ public class CachedLeagueMatchDAO implements LeagueMatchDAO { public void addPlayedMatch(League league, LeagueSerieData leagueSerie, String winner, String loser) { _readWriteLock.writeLock().lock(); try { - LeagueMatch match = new LeagueMatch(leagueSerie.getName(), winner, loser); + LeagueMatchResult match = new LeagueMatchResult(leagueSerie.getName(), winner, loser); getLeagueMatchesInWriteLock(league).add(match); _leagueMatchDAO.addPlayedMatch(league, leagueSerie, winner, loser); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/ConstructedLeagueData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/ConstructedLeagueData.java index 9306bf3ab..d273fe095 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/ConstructedLeagueData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/ConstructedLeagueData.java @@ -1,8 +1,8 @@ package com.gempukku.lotro.league; import com.gempukku.lotro.DateUtils; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.Player; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueData.java index a2b23d57d..2a27d6aa4 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueData.java @@ -1,7 +1,7 @@ package com.gempukku.lotro.league; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.Player; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java index b9dedd5fb..55a2c943f 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java @@ -1,32 +1,24 @@ package com.gempukku.lotro.league; import com.gempukku.lotro.DateUtils; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; +import com.gempukku.lotro.competitive.StandingsProducer; import com.gempukku.lotro.db.LeagueDAO; import com.gempukku.lotro.db.LeagueMatchDAO; import com.gempukku.lotro.db.LeagueParticipationDAO; import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.db.vo.League; -import com.gempukku.lotro.db.vo.LeagueMatch; +import com.gempukku.lotro.db.vo.LeagueMatchResult; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.Player; -import com.gempukku.util.DescComparator; -import com.gempukku.util.MultipleComparator; import java.io.IOException; import java.sql.SQLException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; public class LeagueService { - private Comparator LEAGUE_STANDING_COMPARATOR = - new MultipleComparator( - new DescComparator(new PointsComparator()), - new GamesPlayedComparator(), - new DescComparator(new OpponentsWinComparator())); - private LeagueDAO _leagueDao; // Cached on this layer @@ -156,8 +148,8 @@ public class LeagueService { private void awardPrizesToPlayer(League league, LeagueSerieData serie, String player, boolean winner) { int count = 0; - Collection playerMatchesPlayedOn = getPlayerMatchesInSerie(league, serie, player); - for (LeagueMatch leagueMatch : playerMatchesPlayedOn) { + Collection playerMatchesPlayedOn = getPlayerMatchesInSerie(league, serie, player); + for (LeagueMatchResult leagueMatch : playerMatchesPlayedOn) { if (leagueMatch.getWinner().equals(player)) count++; } @@ -171,10 +163,10 @@ public class LeagueService { _collectionsManager.addItemsToPlayerCollection(player, new CollectionType("permanent", "My cards"), prize.getAll()); } - private Collection getPlayerMatchesInSerie(League league, LeagueSerieData serie, String player) { - final Collection allMatches = _leagueMatchDao.getLeagueMatches(league); - Set result = new HashSet(); - for (LeagueMatch match : allMatches) { + private Collection getPlayerMatchesInSerie(League league, LeagueSerieData serie, String player) { + final Collection allMatches = _leagueMatchDao.getLeagueMatches(league); + Set result = new HashSet(); + for (LeagueMatchResult match : allMatches) { if (match.getSerieName().equals(serie.getName()) && (match.getWinner().equals(player) || match.getLoser().equals(player))) result.add(match); } @@ -205,10 +197,10 @@ public class LeagueService { private List createLeagueSerieStandings(League league, LeagueSerieData leagueSerie) { final Collection playersParticipating = _leagueParticipationDAO.getUsersParticipating(league); - final Collection matches = _leagueMatchDao.getLeagueMatches(league); + final Collection matches = _leagueMatchDao.getLeagueMatches(league); - Set matchesInSerie = new HashSet(); - for (LeagueMatch match : matches) { + Set matchesInSerie = new HashSet(); + for (LeagueMatchResult match : matches) { if (match.getSerieName().equals(leagueSerie.getName())) matchesInSerie.add(match); } @@ -218,104 +210,29 @@ public class LeagueService { private List createLeagueStandings(League league) { final Collection playersParticipating = _leagueParticipationDAO.getUsersParticipating(league); - final Collection matches = _leagueMatchDao.getLeagueMatches(league); + final Collection matches = _leagueMatchDao.getLeagueMatches(league); return createStandingsForMatchesAndPoints(playersParticipating, matches); } - private List createStandingsForMatchesAndPoints(Collection playersParticipating, Collection matches) { - Map> playerOpponents = new HashMap>(); - Map playerWinCounts = new HashMap(); - Map playerLossCounts = new HashMap(); - - // Initialize the list - for (String playerName : playersParticipating) { - playerOpponents.put(playerName, new ArrayList()); - playerWinCounts.put(playerName, new AtomicInteger(0)); - playerLossCounts.put(playerName, new AtomicInteger(0)); - } - - for (LeagueMatch leagueMatch : matches) { - playerOpponents.get(leagueMatch.getWinner()).add(leagueMatch.getLoser()); - playerOpponents.get(leagueMatch.getLoser()).add(leagueMatch.getWinner()); - playerWinCounts.get(leagueMatch.getWinner()).incrementAndGet(); - playerLossCounts.get(leagueMatch.getLoser()).incrementAndGet(); - } - - List leagueStandings = new LinkedList(); - for (String playerName : playersParticipating) { - int points = playerWinCounts.get(playerName).intValue() * 2 + playerLossCounts.get(playerName).intValue(); - int gamesPlayed = playerWinCounts.get(playerName).intValue() + playerLossCounts.get(playerName).intValue(); - PlayerStanding standing = new PlayerStanding(playerName, points, gamesPlayed); - List opponents = playerOpponents.get(playerName); - int opponentWins = 0; - int opponentGames = 0; - for (String opponent : opponents) { - opponentWins += playerWinCounts.get(opponent).intValue(); - opponentGames += playerWinCounts.get(opponent).intValue() + playerLossCounts.get(opponent).intValue(); - } - if (opponentGames != 0) - standing.setOpponentWin(opponentWins * 1f / opponentGames); - else - standing.setOpponentWin(0f); - leagueStandings.add(standing); - } - - Collections.sort(leagueStandings, LEAGUE_STANDING_COMPARATOR); - - int standing = 0; - int position = 1; - PlayerStanding lastStanding = null; - for (PlayerStanding leagueStanding : leagueStandings) { - if (lastStanding == null || LEAGUE_STANDING_COMPARATOR.compare(leagueStanding, lastStanding) != 0) - standing = position; - leagueStanding.setStanding(standing); - position++; - lastStanding = leagueStanding; - } - return leagueStandings; + private List createStandingsForMatchesAndPoints(Collection playersParticipating, Collection matches) { + return StandingsProducer.produceStandings(playersParticipating, matches, 2, 1, Collections.emptySet()); } public boolean canPlayRankedGame(League league, LeagueSerieData season, String player) { int maxMatches = season.getMaxMatches(); - Collection playedInSeason = getPlayerMatchesInSerie(league, season, player); + Collection playedInSeason = getPlayerMatchesInSerie(league, season, player); if (playedInSeason.size() >= maxMatches) return false; return true; } public boolean canPlayRankedGameAgainst(League league, LeagueSerieData season, String playerOne, String playerTwo) { - Collection playedInSeason = getPlayerMatchesInSerie(league, season, playerOne); - for (LeagueMatch leagueMatch : playedInSeason) { + Collection playedInSeason = getPlayerMatchesInSerie(league, season, playerOne); + for (LeagueMatchResult leagueMatch : playedInSeason) { if (playerTwo.equals(leagueMatch.getWinner()) || playerTwo.equals(leagueMatch.getLoser())) return false; } return true; } - - private class PointsComparator implements Comparator { - @Override - public int compare(PlayerStanding o1, PlayerStanding o2) { - return o1.getPoints() - o2.getPoints(); - } - } - - private class GamesPlayedComparator implements Comparator { - @Override - public int compare(PlayerStanding o1, PlayerStanding o2) { - return o1.getGamesPlayed() - o2.getGamesPlayed(); - } - } - - private class OpponentsWinComparator implements Comparator { - @Override - public int compare(PlayerStanding o1, PlayerStanding o2) { - final float diff = o1.getOpponentWin() - o2.getOpponentWin(); - if (diff < 0) - return -1; - if (diff > 0) - return 1; - return 0; - } - } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewConstructedLeagueData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewConstructedLeagueData.java index 3697c0f5d..69ab86366 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewConstructedLeagueData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewConstructedLeagueData.java @@ -1,8 +1,8 @@ package com.gempukku.lotro.league; import com.gempukku.lotro.DateUtils; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.Player; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewSealedLeagueData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewSealedLeagueData.java index 41487c6b8..28bbe9c64 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewSealedLeagueData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/NewSealedLeagueData.java @@ -1,8 +1,8 @@ package com.gempukku.lotro.league; import com.gempukku.lotro.DateUtils; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.DefaultCardCollection; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/SealedLeagueData.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/SealedLeagueData.java index 29128d0a2..1b5cc7daf 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/SealedLeagueData.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/SealedLeagueData.java @@ -1,8 +1,8 @@ package com.gempukku.lotro.league; import com.gempukku.lotro.DateUtils; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.DefaultCardCollection; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java index e0fafad33..754a39510 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java @@ -1,22 +1,18 @@ package com.gempukku.lotro.tournament; -import com.gempukku.lotro.PlayerStanding; +import com.gempukku.lotro.competitive.PlayerStanding; +import com.gempukku.lotro.competitive.StandingsProducer; import com.gempukku.lotro.game.LotroFormat; import com.gempukku.lotro.logic.vo.LotroDeck; -import com.gempukku.util.DescComparator; -import com.gempukku.util.MultipleComparator; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; public class Tournament { - private Comparator STANDING_COMPARATOR = - new MultipleComparator( - new DescComparator(new PointsComparator()), - new GamesPlayedComparator(), - new DescComparator(new OpponentsWinComparator())); - private TournamentMatchDao _tournamentMatchDao; private Map _players; @@ -146,78 +142,13 @@ public class Tournament { } private void calculateCurrentStandings() { - Map playersStandings = new HashMap(); - for (String player : _players.keySet()) { - int points = 0; - int gamesPlayed = 0; - for (int i = 0; i < _currentRound; i++) { - if (_droppedPlayers[i] != null && _droppedPlayers[i].contains(player)) - break; - - TournamentMatch match = getPlayerMatch(i, player); - if (match != null) { - gamesPlayed++; - if (match.getWinner().equals(player)) - points++; - } else if (_currentRoundPairings.containsKey(player) || _currentRoundPairings.containsValue(player)) { - // Do nothing - } else { - // Bye - points++; - gamesPlayed++; - } - } - - playersStandings.put(player, new PlayerStanding(player, points, gamesPlayed)); + Set standingMatches = new HashSet(); + for (Set finishedMatchesInRound : _finishedMatches) { + if (finishedMatchesInRound != null) + standingMatches.addAll(finishedMatchesInRound); } - for (String player : _players.keySet()) { - int opponentPoints = 0; - int opponentGamesPlayed = 0; - for (int i = 0; i < _currentRound; i++) { - if (_droppedPlayers[i] != null && _droppedPlayers[i].contains(player)) - break; - TournamentMatch match = getPlayerMatch(i, player); - if (match != null) { - String opponent; - if (match.getPlayerOne().equals(player)) - opponent = match.getPlayerTwo(); - else - opponent = match.getPlayerOne(); - PlayerStanding opponentStanding = playersStandings.get(opponent); - opponentPoints += opponentStanding.getPoints(); - opponentGamesPlayed += opponentStanding.getGamesPlayed(); - } - } - float opponentWinPerc = opponentPoints * 1f / opponentGamesPlayed; - playersStandings.get(player).setOpponentWin(opponentWinPerc); - } - - List result = new ArrayList(playersStandings.values()); - - Collections.sort(result, STANDING_COMPARATOR); - - int standing = 0; - int position = 1; - PlayerStanding lastStanding = null; - for (PlayerStanding playerStanding : result) { - if (lastStanding == null || STANDING_COMPARATOR.compare(playerStanding, lastStanding) != 0) - standing = position; - playerStanding.setStanding(standing); - position++; - lastStanding = playerStanding; - } - - _currentStandings = Collections.unmodifiableList(result); - } - - private TournamentMatch getPlayerMatch(int roundIndex, String player) { - for (TournamentMatch tournamentMatch : _finishedMatches[roundIndex]) { - if (tournamentMatch.getPlayerOne().equals(player) - || tournamentMatch.getPlayerTwo().equals(player)) - return tournamentMatch; - } - return null; + _currentStandings = StandingsProducer.produceStandings(_players.keySet(), standingMatches, 1, 0, _playersWithByes); } private interface TournamentTask { @@ -238,31 +169,4 @@ public class Tournament { return _time + 1000 * 60 * 2; } } - - - private class PointsComparator implements Comparator { - @Override - public int compare(PlayerStanding o1, PlayerStanding o2) { - return o1.getPoints() - o2.getPoints(); - } - } - - private class GamesPlayedComparator implements Comparator { - @Override - public int compare(PlayerStanding o1, PlayerStanding o2) { - return o1.getGamesPlayed() - o2.getGamesPlayed(); - } - } - - private class OpponentsWinComparator implements Comparator { - @Override - public int compare(PlayerStanding o1, PlayerStanding o2) { - final float diff = o1.getOpponentWin() - o2.getOpponentWin(); - if (diff < 0) - return -1; - if (diff > 0) - return 1; - return 0; - } - } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentMatch.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentMatch.java index 58464cb36..a3c48060b 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentMatch.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentMatch.java @@ -1,6 +1,8 @@ package com.gempukku.lotro.tournament; -public class TournamentMatch { +import com.gempukku.lotro.competitive.CompetitiveMatchResult; + +public class TournamentMatch implements CompetitiveMatchResult { private String _playerOne; private String _playerTwo; private String _winner; @@ -21,10 +23,19 @@ public class TournamentMatch { return _playerTwo; } + @Override public String getWinner() { return _winner; } + @Override + public String getLoser() { + if (_playerOne.equals(_winner)) + return _playerTwo; + else + return _playerOne; + } + public int getRound() { return _round; } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/league/LeagueServiceTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/league/LeagueServiceTest.java index 1bc7d7a40..879f218df 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/league/LeagueServiceTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/league/LeagueServiceTest.java @@ -1,12 +1,12 @@ package com.gempukku.lotro.league; -import com.gempukku.lotro.PlayerStanding; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.db.LeagueDAO; import com.gempukku.lotro.db.LeagueMatchDAO; import com.gempukku.lotro.db.LeagueParticipationDAO; import com.gempukku.lotro.db.vo.League; -import com.gempukku.lotro.db.vo.LeagueMatch; +import com.gempukku.lotro.db.vo.LeagueMatchResult; import org.junit.Test; import org.mockito.Mockito; @@ -38,9 +38,9 @@ public class LeagueServiceTest { LeagueMatchDAO leagueMatchDAO = Mockito.mock(LeagueMatchDAO.class); - Set matches = new HashSet(); + Set matches = new HashSet(); - Mockito.when(leagueMatchDAO.getLeagueMatches(league)).thenReturn(new HashSet(matches)); + Mockito.when(leagueMatchDAO.getLeagueMatches(league)).thenReturn(new HashSet(matches)); LeagueParticipationDAO leagueParticipationDAO = Mockito.mock(LeagueParticipationDAO.class); CollectionsManager collectionsManager = Mockito.mock(CollectionsManager.class); @@ -91,10 +91,10 @@ public class LeagueServiceTest { LeagueMatchDAO leagueMatchDAO = Mockito.mock(LeagueMatchDAO.class); - Set matches = new HashSet(); - matches.add(new LeagueMatch(leagueSerie.getName(), "player1", "player2")); + Set matches = new HashSet(); + matches.add(new LeagueMatchResult(leagueSerie.getName(), "player1", "player2")); - Mockito.when(leagueMatchDAO.getLeagueMatches(league)).thenReturn(new HashSet(matches)); + Mockito.when(leagueMatchDAO.getLeagueMatches(league)).thenReturn(new HashSet(matches)); LeagueParticipationDAO leagueParticipationDAO = Mockito.mock(LeagueParticipationDAO.class); CollectionsManager collectionsManager = Mockito.mock(CollectionsManager.class); @@ -137,9 +137,9 @@ public class LeagueServiceTest { LeagueMatchDAO leagueMatchDAO = Mockito.mock(LeagueMatchDAO.class); - Set matches = new HashSet(); + Set matches = new HashSet(); - Mockito.when(leagueMatchDAO.getLeagueMatches(league)).thenReturn(new HashSet(matches)); + Mockito.when(leagueMatchDAO.getLeagueMatches(league)).thenReturn(new HashSet(matches)); LeagueParticipationDAO leagueParticipationDAO = Mockito.mock(LeagueParticipationDAO.class); Set players = new HashSet(); diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java index 5d03700b8..52662d3d2 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java @@ -1,7 +1,7 @@ package com.gempukku.lotro.server; import com.gempukku.lotro.DateUtils; -import com.gempukku.lotro.PlayerStanding; +import com.gempukku.lotro.competitive.PlayerStanding; import com.gempukku.lotro.db.vo.League; import com.gempukku.lotro.game.Player; import com.gempukku.lotro.game.formats.LotroFormatLibrary;