fixed a few performance issues with leaderboard computation

This commit is contained in:
Axel Uhl committed 2012-06-17 01:42:53 +02:00
1 parent f67ad453be
commit 15edc88887
2 files changed
+22 -12

No files matched your search

@@ -63,6 +63,12 @@ public abstract class AbstractLeaderboardImpl implements Leaderboard, RaceColumn
private final Comparator<Integer> scoreComparator;
private Set<RaceColumnListener> raceColumnListeners;
/**
* Cache for the combined competitors of this leaderboard; taken from the {@link TrackedRace#getRace() races of the
* tracked races} associated with this leaderboard. Updated when the set of tracked races changes.
*/
private transient Iterable<Competitor> competitorsCache;
/**
* A leaderboard entry representing a snapshot of a cell at a given time point for a single race/competitor.
@@ -172,14 +178,17 @@ public abstract class AbstractLeaderboardImpl implements Leaderboard, RaceColumn
}
@Override
public Iterable<Competitor> getCompetitors() {
Set<Competitor> result = new HashSet<Competitor>();
for (TrackedRace r : getTrackedRaces()) {
for (Competitor c : r.getRace().getCompetitors()) {
result.add(c);
public synchronized Iterable<Competitor> getCompetitors() {
if (competitorsCache == null) {
Set<Competitor> result = new HashSet<Competitor>();
for (TrackedRace r : getTrackedRaces()) {
for (Competitor c : r.getRace().getCompetitors()) {
result.add(c);
}
}
competitorsCache = result;
}
return result;
return competitorsCache;
}
@Override
@@ -254,8 +263,7 @@ public abstract class AbstractLeaderboardImpl implements Leaderboard, RaceColumn
return getScoreCorrection().getCorrectedScore(getTrackedRank(competitor, raceColumn, timePoint), competitor,
raceColumn, timePoint, Util.size(getCompetitors())).getCorrectedScore();
}
@Override
public MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) {
return raceColumn.getTrackedRace(competitor) == null ? MaxPointsReason.NONE : getScoreCorrection()
@@ -457,11 +465,13 @@ public abstract class AbstractLeaderboardImpl implements Leaderboard, RaceColumn
@Override
public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) {
notifyListenersAboutTrackedRaceLinked(raceColumn, fleet, trackedRace);
competitorsCache = null;
}
@Override
public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) {
notifyListenersAboutTrackedRaceUnlinked(raceColumn, fleet, trackedRace);
competitorsCache = null;
}
private void notifyListenersAboutTrackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) {
@@ -423,13 +423,13 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
entryDTO.legDetails.add(legEntry);
}
final Distance windwardDistanceToOverallLeader = trackedRace == null ? null : trackedRace.getWindwardDistanceToOverallLeader(competitor, timePoint);
entryDTO.windwardDistanceToOverallLeaderInMeters = windwardDistanceToOverallLeader == null ? null : windwardDistanceToOverallLeader.getMeters();
final Distance averageCrossTrackError = trackedRace == null ? null : trackedRace.getAverageCrossTrackError(competitor, timePoint);
entryDTO.averageCrossTrackErrorInMeters = averageCrossTrackError == null ? null : averageCrossTrackError.getMeters();
}
final Fleet fleet = entry.getFleet();
entryDTO.fleet = fleet == null ? null : createFleetDTO(fleet);
final Distance windwardDistanceToOverallLeader = trackedRace == null ? null : trackedRace.getWindwardDistanceToOverallLeader(competitor, timePoint);
entryDTO.windwardDistanceToOverallLeaderInMeters = windwardDistanceToOverallLeader == null ? null : windwardDistanceToOverallLeader.getMeters();
final Distance averageCrossTrackError = trackedRace == null ? null : trackedRace.getAverageCrossTrackError(competitor, timePoint);
entryDTO.averageCrossTrackErrorInMeters = averageCrossTrackError == null ? null : averageCrossTrackError.getMeters();
return entryDTO;
}