From b36f652a4454649649f00d7d38ec968e834480e0 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Fri, 20 Oct 2017 10:15:04 +0200 Subject: [PATCH] Moved away from custom average speed computation and now being in line with calculation used by LeaderboardPanel --- .../SailingDashboardsGWT sdm.launch | 2 +- .../SailingDashboardsGWT.launch | 4 +-- .../domain/test/mock/MockedTrackedRace.java | 5 +++ ...ockedTrackedRaceWithStartTimeAndRanks.java | 5 +++ .../impl/AbstractSimpleLeaderboardImpl.java | 34 +++++-------------- .../sailing/domain/tracking/TrackedRace.java | 8 +++++ .../domain/tracking/impl/TrackedRaceImpl.java | 20 +++++++++++ .../gwt/ui/test/MockedTrackedRace.java | 6 +++- .../SailingGWT sdm.launch | 2 +- java/com.sap.sailing.gwt.ui/SailingGWT.launch | 4 +-- ...ingServer (No Proxy, Jetty on 8889).launch | 2 +- .../server/masterdata/DummyTrackedRace.java | 5 +++ .../sailing/xmlexport/LeaderboardData.java | 2 +- .../Security UI sdm.launch | 2 +- .../Security UI.launch | 4 +-- 15 files changed, 68 insertions(+), 37 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch index c6adf7bec2d..f29b76fe2ce 100644 --- a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch +++ b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch @@ -41,5 +41,5 @@ - + diff --git a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch index 1107e49c502..b0f7c71b37e 100644 --- a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch +++ b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch @@ -38,7 +38,7 @@ - + - + diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index baa80fa589a..70c5e21cd04 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -1150,4 +1150,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { String trackName) { return Collections.emptySet(); } + + @Override + public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { + return null; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 2a0d856e3d1..05132e8622e 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -702,4 +702,9 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { String trackName) { return Collections.emptySet(); } + + @Override + public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java index 1ff7b0f376b..b9141f4552d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java @@ -25,9 +25,11 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.domain.common.Mile; import com.sap.sailing.domain.common.NoWindError; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Speed; +import com.sap.sailing.domain.common.impl.KnotSpeedImpl; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher; @@ -40,6 +42,7 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.util.impl.RaceColumnListeners; +import com.sap.sse.common.Duration; import com.sap.sse.common.ObscuringIterable; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -789,31 +792,12 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW @Override public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { - Speed result = null; - for (TrackedRace trackedRace : getTrackedRaces()) { - if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) { - NavigableSet markPassings = trackedRace.getMarkPassings(competitor); - if (!markPassings.isEmpty()) { - TimePoint from = markPassings.first().getTimePoint(); - TimePoint to; - if (timePoint.after(markPassings.last().getTimePoint()) && - markPassings.last().getWaypoint() == trackedRace.getRace().getCourse().getLastWaypoint()) { - // stop counting when competitor finished the race - to = markPassings.last().getTimePoint(); - } else { - if (markPassings.last().getWaypoint() != trackedRace.getRace().getCourse().getLastWaypoint() && - timePoint.after(markPassings.last().getTimePoint())) { - result = null; - break; - } - to = timePoint; - } - Distance distanceTraveled = trackedRace.getDistanceTraveled(competitor, timePoint); - if (distanceTraveled != null) { - result = distanceTraveled.inTime(to.asMillis()-from.asMillis()); - } - } - } + Speed result = null; + final Duration totalTimeSailed = this.getTotalTimeSailed(competitor, timePoint); + final Distance totalDistanceSailed = this.getTotalDistanceTraveled(competitor, timePoint); + if (totalDistanceSailed != null && totalTimeSailed != null) { + result = new KnotSpeedImpl(totalDistanceSailed.getMeters() / + totalTimeSailed.asSeconds() / Mile.METERS_PER_NAUTICAL_MILE * 3600.0); } return result; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 19cf1f6dc63..d6d114e47ba 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -1012,4 +1012,12 @@ public interface TrackedRace extends Serializable, IsManagedByCache getAttachedRaceLogs(); + /** + * Computes the average speed over ground for a {@link Competitor} based on times and distances + * for all finished {@link TrackedLegOfCompetitor}s. + * + * @param timePoint time point up and until to compute the speed + */ + Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint); + } 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 dcf53b30598..a93c22b0f4c 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 @@ -74,6 +74,7 @@ import com.sap.sailing.domain.common.CourseChange; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.ManeuverType; +import com.sap.sailing.domain.common.Mile; import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Position; @@ -4189,4 +4190,23 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl public Iterable getAttachedRaceLogs() { return new HashSet<>(attachedRaceLogs.values()); } + + @Override + public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { + Speed result = null; + Duration totalTimeSailedInRace = Duration.NULL; + Distance totalDistanceSailedInRace = Distance.NULL; + for (TrackedLeg legGeneral : getTrackedLegs()) { + TrackedLegOfCompetitor leg = legGeneral.getTrackedLeg(competitor); + if (leg != null && leg.getTime(timePoint) != null) { + totalDistanceSailedInRace.add(leg.getDistanceTraveled(timePoint)); + totalTimeSailedInRace.plus(leg.getTime(timePoint)); + } + } + if (!totalTimeSailedInRace.equals(Duration.NULL) && !totalDistanceSailedInRace.equals(Distance.NULL)) { + result = new KnotSpeedImpl(totalDistanceSailedInRace.getMeters() / + totalTimeSailedInRace.asSeconds() / Mile.METERS_PER_NAUTICAL_MILE * 3600.0); + } + return result; + } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 58af534d869..7337703c9d7 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -720,7 +720,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public boolean isUsingMarkPassingCalculator() { - // TODO Auto-generated method stub return false; } @@ -881,4 +880,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { String trackName) { return Collections.emptySet(); } + + @Override + public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { + return null; + } } diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 54e1704423a..0e9d9decea6 100755 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -62,5 +62,5 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index 3ec300f1256..3dd4667c212 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -58,7 +58,7 @@ - + - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index cb56815492e..cb7244afad0 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index e98021cbaf9..7a632430fa0 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -683,4 +683,9 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { String trackName) { return Collections.emptySet(); } + + @Override + public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { + return null; + } } diff --git a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java index 9fc2bcefcd1..b8b8b8e72a8 100644 --- a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java +++ b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java @@ -591,7 +591,7 @@ public class LeaderboardData extends ExportAction { } addNamedElementWithValue(competitorRaceDataElement, "distance_traveled_in_meters", distanceTraveledInThisRace == null ? 0.0 : distanceTraveledInThisRace.getMeters()); addNamedElementWithValue(competitorRaceDataElement, "distance_traveled_including_non_finished_legs_in_meters", getDistanceTraveled(race, competitor, race.getEndOfRace(), /*alsoReturnDistanceIfCompetitorHasNotFinishedRace*/ true).getMeters()); - Speed averageSpeedOverGround = leaderboard.getAverageSpeedOverGround(competitor, race.getEndOfRace()); + Speed averageSpeedOverGround = race.getAverageSpeedOverGround(competitor, race.getEndOfRace()); addNamedElementWithValue(competitorRaceDataElement, "average_speed_over_ground_in_knots", averageSpeedOverGround == null ? 0.0 : averageSpeedOverGround.getKnots()); addNamedElementWithValue(competitorRaceDataElement, "final_race_rank", ++raceRank); TrackedLegOfCompetitor trackedLegOfCompetitor = race.getTrackedLeg(competitor, race.getRace().getCourse().getFirstLeg()); diff --git a/java/com.sap.sse.security.ui/Security UI sdm.launch b/java/com.sap.sse.security.ui/Security UI sdm.launch index 633ad54780f..a4943911e8a 100644 --- a/java/com.sap.sse.security.ui/Security UI sdm.launch +++ b/java/com.sap.sse.security.ui/Security UI sdm.launch @@ -50,5 +50,5 @@ - + diff --git a/java/com.sap.sse.security.ui/Security UI.launch b/java/com.sap.sse.security.ui/Security UI.launch index 607b86530a3..aeb2f6027c7 100644 --- a/java/com.sap.sse.security.ui/Security UI.launch +++ b/java/com.sap.sse.security.ui/Security UI.launch @@ -47,7 +47,7 @@ - + - +