refactored obtaining of ranking comparators to pass through RankingMetric

This commit is contained in:
Axel Uhl committed 2015-04-21 10:24:07 +02:00
1 parent 1cbd2646cc
commit b2d89790a1
5 files changed
+34 -8

No files matched your search

@@ -4,7 +4,6 @@ import java.util.Comparator;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
@@ -16,7 +15,7 @@ import com.sap.sailing.domain.tracking.impl.WindwardToGoComparator;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
public class OneDesignRankingMetric implements RankingMetric<Distance> {
public class OneDesignRankingMetric implements RankingMetric {
@Override
public Comparator<Competitor> getRaceRankingComparator(TrackedRace trackedRace, TimePoint timePoint, WindLegTypeAndLegBearingCache cache) {
return new RaceRankComparator(trackedRace, timePoint, cache);
@@ -32,7 +32,7 @@ import com.sap.sse.common.TimePoint;
*
* @param <T>
*/
public interface RankingMetric<T extends Comparable<T>> {
public interface RankingMetric {
default Comparator<Competitor> getRankingComparator(TrackedRace trackedRace, TimePoint timePoint) {
return getRaceRankingComparator(trackedRace, null, new NoCachingWindLegTypeAndLegBearingCache());
}
@@ -79,7 +79,4 @@ public interface RankingMetric<T extends Comparable<T>> {
* at <code>timePoint</code>.
*/
Duration getCorrectedTime(TrackedRace trackedRace, Competitor competitor, TimePoint timePoint, WindLegTypeAndLegBearingCache cache);
// TODO provide comparators per race / leg
// TODO add methods for corrected time and windward distance calculation
}
@@ -38,6 +38,7 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
import com.sap.sailing.domain.ranking.RankingMetric;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
@@ -64,6 +65,16 @@ public interface TrackedRace extends Serializable {
RaceDefinition getRace();
RegattaAndRaceIdentifier getRaceIdentifier();
/**
* Tells how ranks are to be assigned to the competitors at any time during the race. For one-design boat classes
* this will usually happen by projecting the competitors to the wind direction for upwind and downwind legs or to
* the leg's rhumb line for reaching legs, then comparing positions. For handicap races using a time-on-time,
* time-on-distance, combination thereof or a more complicated scheme such as ORC Performance Curve, the ranking
* process needs to take into account the competitor-specific correction factors defined in the measurement
* certificate.
*/
RankingMetric getRankingMetric();
/**
* Computes the estimated start time for this race (not to be confused with the {@link #getStartOfTracking()} time
@@ -117,7 +117,7 @@ public class TrackedLegImpl implements TrackedLeg {
// race may be updated while calculation is going on, but each individual calculation is properly
// synchronized, usually by read-write locks, so there is no major difference in synchronization issues
// an the asynchronous nature of how the data is being received
Collections.sort(rankedCompetitorList, new WindwardToGoComparator(this, timePoint, cache));
Collections.sort(rankedCompetitorList, getTrackedRace().getRankingMetric().getLegRankingComparator(this, timePoint, cache));
rankedCompetitorList = Collections.unmodifiableList(rankedCompetitorList);
synchronized (competitorTracksOrderedByRank) {
competitorTracksOrderedByRank.put(timePoint, rankedCompetitorList);
@@ -7,6 +7,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.ConcurrentModificationException;
import java.util.Date;
import java.util.HashMap;
@@ -102,6 +103,8 @@ import com.sap.sailing.domain.confidence.ConfidenceFactory;
import com.sap.sailing.domain.markpassingcalculation.MarkPassingCalculator;
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
import com.sap.sailing.domain.racelogtracking.DeviceMapping;
import com.sap.sailing.domain.ranking.OneDesignRankingMetric;
import com.sap.sailing.domain.ranking.RankingMetric;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.GPSTrackListener;
@@ -315,6 +318,16 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
* Caches wind requests for a few seconds to accelerate access in live mode
*/
private transient ShortTimeWindCache shortTimeWindCache;
/**
* Tells how ranks are to be assigned to the competitors at any time during the race. For one-design boat classes
* this will usually happen by projecting the competitors to the wind direction for upwind and downwind legs or to
* the leg's rhumb line for reaching legs, then comparing positions. For handicap races using a time-on-time,
* time-on-distance, combination thereof or a more complicated scheme such as ORC Performance Curve, the ranking
* process needs to take into account the competitor-specific correction factors defined in the measurement
* certificate.
*/
private final RankingMetric rankingMetric;
public TrackedRaceImpl(final TrackedRegatta trackedRegatta, RaceDefinition race,
final Iterable<Sideline> sidelines, final WindStore windStore, final GPSFixStore gpsFixStore,
@@ -322,6 +335,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
long millisecondsOverWhichToAverageSpeed, long delayForWindEstimationCacheInvalidation,
boolean useInternalMarkPassingAlgorithm) {
super(race, trackedRegatta, windStore, millisecondsOverWhichToAverageWind);
rankingMetric = new OneDesignRankingMetric(); // for now we can only do one-design classes; see bug 1018
raceStates = new WeakHashMap<>();
shortTimeWindCache = new ShortTimeWindCache(this, millisecondsOverWhichToAverageWind / 2);
locksForMarkPassings = new IdentityHashMap<>();
@@ -453,6 +467,11 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
}
}
@Override
public RankingMetric getRankingMetric() {
return rankingMetric;
}
private LinkedHashMap<TimePoint, NamedReentrantReadWriteLock> createCompetitorRankingsLockMap() {
return new LinkedHashMap<TimePoint, NamedReentrantReadWriteLock>() {
private static final long serialVersionUID = 6298801656693955386L;
@@ -1154,7 +1173,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
// RaceRankComparator requires course read lock
getRace().getCourse().lockForRead();
try {
RaceRankComparator comparator = new RaceRankComparator(this, timePoint, cache);
Comparator<Competitor> comparator = getRankingMetric().getRaceRankingComparator(this, timePoint, cache);
rankedCompetitors = new ArrayList<Competitor>();
for (Competitor c : getRace().getCompetitors()) {
rankedCompetitors.add(c);