mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-30 15:57:11 +00:00
fixed live time for getQuickRanks(); added several null checks for cases where competitors haven't started their legs yet
This commit is contained in:
1 parent
1a6663af45
commit
0dbfaba524
4 files changed
+32
-23
No files matched your search
+7
-3
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-13
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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();
|
||||||
|
|||||||
+6
-6
@@ -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;
|
||||||
|
|||||||
Reference in new issue
Block a user