fixed live time for getQuickRanks(); added several null checks for cases where competitors haven't started their legs yet

This commit is contained in:
Axel Uhl committed 2015-05-29 14:17:58 +02:00
1 parent 1a6663af45
commit 0dbfaba524
4 files changed
+32 -23

No files matched your search

@@ -161,13 +161,17 @@ public abstract class AbstractRankingMetric implements RankingMetric {
final Duration result; final Duration result;
final TrackedLegOfCompetitor tloc = getTrackedRace().getTrackedLeg(competitor, getTimePoint()); final TrackedLegOfCompetitor tloc = getTrackedRace().getTrackedLeg(competitor, getTimePoint());
final Duration raceDurationAtTimePoint = getTrackedRace().getStartOfRace().until(getTimePoint()); final Duration raceDurationAtTimePoint = getTrackedRace().getStartOfRace().until(getTimePoint());
if (tloc.hasStartedLeg(getTimePoint())) { if (tloc != null && tloc.hasStartedLeg(getTimePoint())) {
final Competitor competitorFarthestAheadInLeg = getCompetitorFarthestAheadInLeg(leg, getTimePoint(), cache); final Competitor competitorFarthestAheadInLeg = getCompetitorFarthestAheadInLeg(leg, getTimePoint(), cache);
final TrackedLegOfCompetitor tlocOfCompetitorFarthestAheadInLeg = tloc.getTrackedLeg().getTrackedLeg(competitorFarthestAheadInLeg); final TrackedLegOfCompetitor tlocOfCompetitorFarthestAheadInLeg = tloc.getTrackedLeg().getTrackedLeg(competitorFarthestAheadInLeg);
final Duration predictedDurationFromTimePointToReachFarthestAheadInLeg = getPredictedDurationToReachWindwardPositionOf( final Duration predictedDurationFromTimePointToReachFarthestAheadInLeg = getPredictedDurationToReachWindwardPositionOf(
tloc, tlocOfCompetitorFarthestAheadInLeg, getTimePoint(), cache); tloc, tlocOfCompetitorFarthestAheadInLeg, getTimePoint(), cache);
final Duration cDurationFromRaceStartToReachFarthestInLeg = raceDurationAtTimePoint.plus(predictedDurationFromTimePointToReachFarthestAheadInLeg); if (predictedDurationFromTimePointToReachFarthestAheadInLeg == null) {
result = cDurationFromRaceStartToReachFarthestInLeg; result = null;
} else {
final Duration cDurationFromRaceStartToReachFarthestInLeg = raceDurationAtTimePoint.plus(predictedDurationFromTimePointToReachFarthestAheadInLeg);
result = cDurationFromRaceStartToReachFarthestInLeg;
}
} else { } else {
result = null; result = null;
} }
@@ -325,19 +325,23 @@ public class TimeOnTimeAndDistanceRankingMetric extends AbstractRankingMetric {
result = null; result = null;
} else { } else {
final Competitor farthestAheadOrEarliestLegFinisher = getCompetitorFarthestAheadInLeg(trackedLegOfCompetitor.getTrackedLeg(), timePoint, cache); final Competitor farthestAheadOrEarliestLegFinisher = getCompetitorFarthestAheadInLeg(trackedLegOfCompetitor.getTrackedLeg(), timePoint, cache);
final TrackedLegOfCompetitor tlocOfFarthestAhead = trackedLegOfCompetitor.getTrackedLeg().getTrackedLeg(farthestAheadOrEarliestLegFinisher); if (farthestAheadOrEarliestLegFinisher == null) {
final boolean farthestAheadAlreadyFinishedLeg = tlocOfFarthestAhead.hasFinishedLeg(timePoint); result = null;
final Distance windwardDistanceFarthestTraveledUntilFinishingLeg = getWindwardDistanceTraveled(farthestAheadOrEarliestLegFinisher, } else {
farthestAheadAlreadyFinishedLeg ? tlocOfFarthestAhead.getFinishTime() : timePoint, cache); final TrackedLegOfCompetitor tlocOfFarthestAhead = trackedLegOfCompetitor.getTrackedLeg().getTrackedLeg(farthestAheadOrEarliestLegFinisher);
// Consider all competitors, regardless of whether they have started the leg or not; a competitor in a previous final boolean farthestAheadAlreadyFinishedLeg = tlocOfFarthestAhead.hasFinishedLeg(timePoint);
// leg may well be the race leader. However, if a competitor has finished the leg already, use the finishing time final Distance windwardDistanceFarthestTraveledUntilFinishingLeg = getWindwardDistanceTraveled(farthestAheadOrEarliestLegFinisher,
// point for that competitor. farthestAheadAlreadyFinishedLeg ? tlocOfFarthestAhead.getFinishTime() : timePoint, cache);
// leader in the leg is now the competitor with the least corrected time to reach the competitor farthest ahead in the leg // Consider all competitors, regardless of whether they have started the leg or not; a competitor in a previous
final Competitor legLeader = rankingInfo.getLeaderInLegByCalculatedTime(trackedLegOfCompetitor.getTrackedLeg().getLeg(), cache); // leg may well be the race leader. However, if a competitor has finished the leg already, use the finishing time
result = getGapToCompetitorInOwnTime(trackedLegOfCompetitor.getCompetitor(), legLeader, // point for that competitor.
rankingInfo.getActualTimeFromRaceStartToReachFarthestAheadInLeg(trackedLegOfCompetitor.getCompetitor(), leg, cache), // leader in the leg is now the competitor with the least corrected time to reach the competitor farthest ahead in the leg
rankingInfo.getActualTimeFromRaceStartToReachFarthestAheadInLeg(legLeader, leg, cache), final Competitor legLeader = rankingInfo.getLeaderInLegByCalculatedTime(trackedLegOfCompetitor.getTrackedLeg().getLeg(), cache);
windwardDistanceFarthestTraveledUntilFinishingLeg); result = getGapToCompetitorInOwnTime(trackedLegOfCompetitor.getCompetitor(), legLeader,
rankingInfo.getActualTimeFromRaceStartToReachFarthestAheadInLeg(trackedLegOfCompetitor.getCompetitor(), leg, cache),
rankingInfo.getActualTimeFromRaceStartToReachFarthestAheadInLeg(legLeader, leg, cache),
windwardDistanceFarthestTraveledUntilFinishingLeg);
}
} }
return result; return result;
} }
@@ -2055,7 +2055,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
} }
rank++; rank++;
} }
final Iterable<Competitor> competitorsInOrderOfWindwardDistanceTraveledFarthestFirst = getService().getCompetitorInOrderOfWindwardDistanceTraveledFarthestFirst(trackedRace, timePoint); final Iterable<Competitor> competitorsInOrderOfWindwardDistanceTraveledFarthestFirst = getService()
.getCompetitorInOrderOfWindwardDistanceTraveledFarthestFirst(trackedRace, actualTimePoint);
competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst = convertToCompetitorDTOs(competitorsInOrderOfWindwardDistanceTraveledFarthestFirst); competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst = convertToCompetitorDTOs(competitorsInOrderOfWindwardDistanceTraveledFarthestFirst);
} else { } else {
competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst = Collections.emptyList(); competitorDTOsInOrderOfWindwardDistanceTraveledFarthestFirst = Collections.emptyList();
@@ -39,6 +39,7 @@ public class CompactRaceMapDataDTO implements IsSerializable {
this.boatPositionsByCompetitorIdAsString.put(e.getKey().getIdAsString(), e.getValue()); this.boatPositionsByCompetitorIdAsString.put(e.getKey().getIdAsString(), e.getValue());
} }
this.quickRanks = new ArrayList<CompactQuickRankDTO>(quickRanks == null ? 0 : Util.size(quickRanks.getQuickRanks())); this.quickRanks = new ArrayList<CompactQuickRankDTO>(quickRanks == null ? 0 : Util.size(quickRanks.getQuickRanks()));
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber = new LinkedHashMap<>();
Map<String, Integer> competitorIdAsStringToOneBasedLegNumber = new HashMap<>(); Map<String, Integer> competitorIdAsStringToOneBasedLegNumber = new HashMap<>();
if (quickRanks != null) { if (quickRanks != null) {
for (QuickRankDTO quickRank : quickRanks.getQuickRanks()) { for (QuickRankDTO quickRank : quickRanks.getQuickRanks()) {
@@ -46,12 +47,11 @@ public class CompactRaceMapDataDTO implements IsSerializable {
quickRank.legNumberOneBased)); quickRank.legNumberOneBased));
competitorIdAsStringToOneBasedLegNumber.put(quickRank.competitor.getIdAsString(), quickRank.legNumberOneBased); competitorIdAsStringToOneBasedLegNumber.put(quickRank.competitor.getIdAsString(), quickRank.legNumberOneBased);
} }
} for (CompetitorDTO competitorInOrderOfWindwardDistanceTraveled : quickRanks.getCompetitorsInOrderOfWindwardDistanceTraveledFarthestFirst()) {
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber = new LinkedHashMap<>(); this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber.put(
for (CompetitorDTO competitorInOrderOfWindwardDistanceTraveled : quickRanks.getCompetitorsInOrderOfWindwardDistanceTraveledFarthestFirst()) { competitorInOrderOfWindwardDistanceTraveled.getIdAsString(),
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber.put( competitorIdAsStringToOneBasedLegNumber.get(competitorInOrderOfWindwardDistanceTraveled.getIdAsString()));
competitorInOrderOfWindwardDistanceTraveled.getIdAsString(), }
competitorIdAsStringToOneBasedLegNumber.get(competitorInOrderOfWindwardDistanceTraveled.getIdAsString()));
} }
this.courseSidelines = courseSidelines; this.courseSidelines = courseSidelines;
this.coursePositions = coursePositions; this.coursePositions = coursePositions;