From 0ad242561783cf99212b538ceb069960a8cc2bce Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 19 May 2015 16:01:19 +0200 Subject: [PATCH] also adapted gap chart to gap in own time --- .../domain/ranking/AbstractRankingMetric.java | 6 +++- ...MarkPassingWithTimePointAndCompetitor.java | 33 +++++++++++++++++++ .../domain/tracking/impl/TrackedRaceImpl.java | 4 ++- .../gwt/ui/server/SailingServiceImpl.java | 4 ++- 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100755 java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/ranking/AbstractRankingMetric.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/ranking/AbstractRankingMetric.java index eaad6c12937..91c20fefd03 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/ranking/AbstractRankingMetric.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/ranking/AbstractRankingMetric.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedLeg; @@ -362,7 +363,10 @@ public abstract class AbstractRankingMetric implements RankingMetric { ? getTrackedRace().getTrack(to).getEstimatedPosition(timePoint, /* extrapolate */ true) // not in the same leg; let "who" travel to the end of the leg : getTrackedRace().getApproximatePosition(currentLegWho.getLeg().getTo(), timePoint); - final Duration toEndOfLegOrTo = currentLegWho.getAverageVelocityMadeGood(timePoint, cache).getDuration( + final Speed currentVMG = currentLegWho.getVelocityMadeGood(timePoint, WindPositionMode.EXACT, cache); + final Speed averageVMG = currentLegWho.getAverageVelocityMadeGood(timePoint, cache); + final Speed vmg = Double.isNaN(averageVMG.getKnots()) ? currentVMG : averageVMG; + final Duration toEndOfLegOrTo = vmg.getDuration( currentLegWho.getTrackedLeg().getWindwardDistance( getTrackedRace().getTrack(who).getEstimatedPosition(timePoint, /* extrapolate */true), windwardPositionToReachInWhosCurrentLeg, timePoint, WindPositionMode.LEG_MIDDLE)); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java new file mode 100755 index 00000000000..8dfccfd3922 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java @@ -0,0 +1,33 @@ +package com.sap.sailing.domain.tracking.impl; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sse.common.TimePoint; + +public class DummyMarkPassingWithTimePointAndCompetitor implements MarkPassing { + private static final long serialVersionUID = -5494669910047887984L; + private final TimePoint timePoint; + private final Competitor competitor; + + public DummyMarkPassingWithTimePointAndCompetitor(TimePoint timePoint, Competitor competitor) { + super(); + this.timePoint = timePoint; + this.competitor = competitor; + } + + @Override + public TimePoint getTimePoint() { + return timePoint; + } + + @Override + public Waypoint getWaypoint() { + throw new UnsupportedOperationException("getWaypoint() not supported"); + } + + @Override + public Competitor getCompetitor() { + return competitor; + } +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 83c66cc6ef2..1073903a965 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1303,8 +1303,10 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public TrackedLegOfCompetitor getCurrentLeg(Competitor competitor, TimePoint timePoint) { + // If the mark passing that starts a leg happened exactly at timePoint, the MarkPassingByTimeComparator won't consider + // them equal because NavigableSet competitorMarkPassings = markPassingsForCompetitor.get(competitor); - DummyMarkPassingWithTimePointOnly markPassingTimePoint = new DummyMarkPassingWithTimePointOnly(timePoint); + DummyMarkPassingWithTimePointAndCompetitor markPassingTimePoint = new DummyMarkPassingWithTimePointAndCompetitor(timePoint, competitor); TrackedLegOfCompetitor result = null; if (!competitorMarkPassings.isEmpty()) { final Course course = getRace().getCourse(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 0643efe2fda..5d556c2aa56 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -417,6 +417,7 @@ import com.sap.sailing.xrr.structureimport.StructureImporter; import com.sap.sailing.xrr.structureimport.buildstructure.SetRacenumberFromSeries; import com.sap.sse.BuildVersion; import com.sap.sse.common.CountryCode; +import com.sap.sse.common.Duration; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; @@ -2719,7 +2720,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S break; case GAP_TO_LEADER_IN_SECONDS: if (trackedLeg != null) { - result = trackedLeg.getGapToLeader(timePoint, WindPositionMode.LEG_MIDDLE, cache).asSeconds(); + final Duration gapToLeaderInOwnTime = trackedLeg.getTrackedLeg().getTrackedRace().getRankingMetric().getGapToLeaderInOwnTime(competitor, timePoint, cache); + result = gapToLeaderInOwnTime == null ? null : gapToLeaderInOwnTime.asSeconds(); } break; case WINDWARD_DISTANCE_TO_OVERALL_LEADER: