mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-15 14:56:41 +00:00
migrated ride height from a double value to a Distance
Change-Id: I15c18f90df384b0241f2ec5ef7e223ded96561d9
This commit is contained in:
1 parent
02be736b12
commit
d8429d6766
16 files changed
+54
-38
No files matched your search
+3
-1
@@ -1,5 +1,7 @@
|
||||
package com.sap.sailing.domain.common.tracking;
|
||||
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
|
||||
/**
|
||||
* Specific {@link SensorFix} for bravo devices (http://www.bravosystems.es/).
|
||||
*
|
||||
@@ -12,5 +14,5 @@ public interface BravoFix extends SensorFix {
|
||||
*
|
||||
* @return the ride height
|
||||
*/
|
||||
double getRideHeight();
|
||||
Distance getRideHeight();
|
||||
}
|
||||
+4
-2
@@ -1,5 +1,7 @@
|
||||
package com.sap.sailing.domain.common.tracking.impl;
|
||||
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
import com.sap.sailing.domain.common.impl.MeterDistance;
|
||||
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
|
||||
@@ -32,8 +34,8 @@ public class BravoFixImpl implements BravoFix {
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getRideHeight() {
|
||||
return fix.get(BravoSensorDataMetadata.INSTANCE.rideHeightColumn);
|
||||
public Distance getRideHeight() {
|
||||
return new MeterDistance(fix.get(BravoSensorDataMetadata.INSTANCE.rideHeightColumn));
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -1129,7 +1129,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
public Distance getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -683,7 +683,7 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
public Distance getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -82,8 +82,8 @@ public class BravoFixTrackSerializationTest {
|
||||
assertRideHeight(track, testFixData.timePoint, testFixData.rideHeight);
|
||||
}
|
||||
|
||||
private void assertRideHeight(BravoFixTrack<Competitor> track, TimePoint timePoint, double expected) {
|
||||
assertEquals(expected, track.getRideHeight(timePoint), 0.0);
|
||||
private void assertRideHeight(BravoFixTrack<Competitor> track, TimePoint timePoint, double expectedRideHeightInMeters) {
|
||||
assertEquals(expectedRideHeightInMeters, track.getRideHeight(timePoint).getMeters(), 0.0);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
||||
+6
-3
@@ -1437,7 +1437,8 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
|
||||
} else {
|
||||
entryDTO.timeSinceLastPositionFixInSeconds = null;
|
||||
}
|
||||
entryDTO.averageRideHeightInMeters = trackedRace.getAverageRideHeight(competitor, timePoint);
|
||||
final Distance averageRideHeight = trackedRace.getAverageRideHeight(competitor, timePoint);
|
||||
entryDTO.averageRideHeightInMeters = averageRideHeight == null ? null : averageRideHeight.getMeters();
|
||||
}
|
||||
if (addLegDetails && trackedRace != null) {
|
||||
try {
|
||||
@@ -1722,11 +1723,13 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
|
||||
Double speedOverGroundInKnots;
|
||||
if (trackedLeg.hasFinishedLeg(timePoint)) {
|
||||
speedOverGroundInKnots = averageSpeedOverGround == null ? null : averageSpeedOverGround.getKnots();
|
||||
result.currentRideHeightInMeters = trackedLeg.getAverageRideHeight(timePoint);
|
||||
final Distance averageRideHeight = trackedLeg.getAverageRideHeight(timePoint);
|
||||
result.currentRideHeightInMeters = averageRideHeight == null ? null : averageRideHeight.getMeters();
|
||||
} else {
|
||||
final SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(timePoint);
|
||||
speedOverGroundInKnots = speedOverGround == null ? null : speedOverGround.getKnots();
|
||||
result.currentRideHeightInMeters = trackedLeg.getRideHeight(timePoint);
|
||||
final Distance rideHeight = trackedLeg.getRideHeight(timePoint);
|
||||
result.currentRideHeightInMeters = rideHeight == null ? null : rideHeight.getMeters();
|
||||
}
|
||||
result.currentSpeedOverGroundInKnots = speedOverGroundInKnots == null ? null : speedOverGroundInKnots;
|
||||
Distance distanceTraveled = trackedLeg.getDistanceTraveled(timePoint);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.sap.sailing.domain.tracking;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.WithID;
|
||||
@@ -22,7 +23,7 @@ public interface BravoFixTrack<ItemType extends WithID & Serializable> extends S
|
||||
* @return the ride height for the given {@link TimePoint} or <code>null</code> if the {@link TimePoint} is not in the range
|
||||
* where we have fixes for.
|
||||
*/
|
||||
Double getRideHeight(TimePoint timePoint);
|
||||
Distance getRideHeight(TimePoint timePoint);
|
||||
|
||||
/**
|
||||
* Calculates the average ride height for the given time range.
|
||||
@@ -34,5 +35,5 @@ public interface BravoFixTrack<ItemType extends WithID & Serializable> extends S
|
||||
* @return the average ride height for the given time range or <code>null</code> if there are no fixes in the given
|
||||
* time range.
|
||||
*/
|
||||
Double getAverageRideHeight(TimePoint from, TimePoint to);
|
||||
Distance getAverageRideHeight(TimePoint from, TimePoint to);
|
||||
}
|
||||
+2
-2
@@ -97,7 +97,7 @@ public interface TrackedLegOfCompetitor extends Serializable {
|
||||
* <code>timePoint</code>. If the competitor already completed the leg at <code>timePoint</code> and the respective
|
||||
* mark passing event was already received, the average ride height for the entire leg (and no further) is computed.
|
||||
*/
|
||||
Double getAverageRideHeight(TimePoint timePoint);
|
||||
Distance getAverageRideHeight(TimePoint timePoint);
|
||||
|
||||
/**
|
||||
* @return <code>null</code> if the competitor hasn't started this leg yet, otherwise the fix where the maximum speed was
|
||||
@@ -237,7 +237,7 @@ public interface TrackedLegOfCompetitor extends Serializable {
|
||||
* <code>timePoint</code>, returns the current ride height for this time point. If the competitor has already
|
||||
* finished the leg, the ride height at the time the competitor finished the leg is returned.
|
||||
*/
|
||||
Double getRideHeight(TimePoint at);
|
||||
Distance getRideHeight(TimePoint at);
|
||||
|
||||
/**
|
||||
* Computes the distance along the wind track to the wind-projected position of the race's overall leader. If leader
|
||||
|
||||
@@ -686,7 +686,7 @@ public interface TrackedRace extends Serializable, IsManagedByCache<SharedDomain
|
||||
Distance getAverageSignedCrossTrackError(Competitor competitor, TimePoint from, TimePoint to, boolean upwindOnly,
|
||||
boolean waitForLatestAnalysis) throws NoWindException;
|
||||
|
||||
public Double getAverageRideHeight(Competitor competitor, TimePoint timePoint);
|
||||
public Distance getAverageRideHeight(Competitor competitor, TimePoint timePoint);
|
||||
|
||||
WindStore getWindStore();
|
||||
|
||||
|
||||
+15
-10
@@ -1,10 +1,8 @@
|
||||
package com.sap.sailing.domain.tracking.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.OptionalDouble;
|
||||
import java.util.Spliterator;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
import com.sap.sailing.domain.tracking.BravoFixTrack;
|
||||
@@ -34,7 +32,7 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getRideHeight(TimePoint timePoint) {
|
||||
public Distance getRideHeight(TimePoint timePoint) {
|
||||
BravoFix fixAfter = getFirstFixAtOrAfter(timePoint);
|
||||
if (fixAfter != null && fixAfter.getTimePoint().compareTo(timePoint) == 0) {
|
||||
// exact match of timepoint -> no interpolation necessary
|
||||
@@ -54,17 +52,24 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(TimePoint from, TimePoint to) {
|
||||
public Distance getAverageRideHeight(TimePoint from, TimePoint to) {
|
||||
final Distance result;
|
||||
lockForRead();
|
||||
try {
|
||||
Spliterator<BravoFix> fixes = getFixes(from, true, to, true).spliterator();
|
||||
OptionalDouble average = StreamSupport.stream(fixes, false).mapToDouble(BravoFix::getRideHeight).average();
|
||||
if (average.isPresent()) {
|
||||
return average.getAsDouble();
|
||||
Distance sum = Distance.NULL;
|
||||
int count = 0;
|
||||
for (final BravoFix fix : getFixes(from, true, to, true)) {
|
||||
sum = sum.add(fix.getRideHeight());
|
||||
count++;
|
||||
}
|
||||
if (count > 0) {
|
||||
result = sum.scale(1./count);
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
} finally {
|
||||
unlockAfterRead();
|
||||
}
|
||||
return null;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+6
-4
@@ -183,7 +183,7 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(TimePoint timePoint) {
|
||||
public Distance getAverageRideHeight(TimePoint timePoint) {
|
||||
MarkPassing legStart = getMarkPassingForLegStart();
|
||||
if (legStart != null) {
|
||||
BravoFixTrack<Competitor> track = getTrackedRace()
|
||||
@@ -676,15 +676,17 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getRideHeight(TimePoint at) {
|
||||
public Distance getRideHeight(TimePoint at) {
|
||||
final Distance result;
|
||||
if (hasStartedLeg(at)) {
|
||||
TimePoint timePoint =hasFinishedLeg(at) ? getMarkPassingForLegEnd().getTimePoint() : at;
|
||||
BravoFixTrack<Competitor> track = getTrackedRace()
|
||||
.<BravoFix, BravoFixTrack<Competitor>> getSensorTrack(competitor, BravoFixTrack.TRACK_NAME);
|
||||
return track == null ? null : track.getRideHeight(timePoint);
|
||||
result = track == null ? null : track.getRideHeight(timePoint);
|
||||
} else {
|
||||
return null;
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-2
@@ -1539,8 +1539,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
final Double result;
|
||||
public Distance getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
final Distance result;
|
||||
BravoFixTrack<Competitor> track = getSensorTrack(competitor, BravoFixTrack.TRACK_NAME);
|
||||
final Leg firstLeg;
|
||||
final TrackedLegOfCompetitor firstTrackedLeg;
|
||||
|
||||
+1
-1
@@ -862,7 +862,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
public Distance getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -2941,7 +2941,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
final BravoFixTrack<Competitor> bravoFixTrack = trackedRace
|
||||
.<BravoFix, BravoFixTrack<Competitor>> getSensorTrack(competitor, BravoFixTrack.TRACK_NAME);
|
||||
if (bravoFixTrack != null) {
|
||||
result = bravoFixTrack.getRideHeight(timePoint);
|
||||
final Distance rideHeight = bravoFixTrack.getRideHeight(timePoint);
|
||||
result = rideHeight == null ? null : rideHeight.getMeters();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
+4
-4
@@ -19,12 +19,12 @@ public class BravoDataImportTest {
|
||||
|
||||
private final DoubleVectorFixImporter bravoDataImporter = new BravoDataImporterImpl();
|
||||
private int callbackCallCount = 0;
|
||||
private double sumRideHeight = 0.0;
|
||||
private double sumRideHeightInMeters = 0.0;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.callbackCallCount = 0;
|
||||
this.sumRideHeight = 0.0;
|
||||
this.sumRideHeightInMeters = 0.0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -51,12 +51,12 @@ public class BravoDataImportTest {
|
||||
bravoDataImporter.importFixes(importData.getInputStream(), (fixes, device) -> {
|
||||
for (DoubleVectorFix fix : fixes) {
|
||||
callbackCallCount++;
|
||||
sumRideHeight += new BravoFixImpl(fix).getRideHeight();
|
||||
sumRideHeightInMeters += new BravoFixImpl(fix).getRideHeight().getMeters();
|
||||
}
|
||||
}, "filename", "source");
|
||||
Assert.assertEquals(importData.expectedFixesCount, callbackCallCount);
|
||||
Assert.assertEquals(importData.expectedAverageRideHeight,
|
||||
callbackCallCount == 0 ? sumRideHeight : sumRideHeight / callbackCallCount, 0.00001);
|
||||
callbackCallCount == 0 ? sumRideHeightInMeters : sumRideHeightInMeters / callbackCallCount, 0.00001);
|
||||
}
|
||||
|
||||
private enum ImportData {
|
||||
|
||||
+1
-1
@@ -658,7 +658,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
public Distance getAverageRideHeight(Competitor competitor, TimePoint timePoint) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user