mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-16 10:48:47 +00:00
Merge branch 'bug6276' of https://github.com/eclipse-sailing-analytics/sailing-analytics into bug6276
This commit is contained in:
+5
@@ -109,6 +109,11 @@ public abstract class AbstractSailNumberCanonicalizerAndMatcher<CompetitorType>
|
||||
if (canonicalizedSailID != null) {
|
||||
result.put(canonicalizedSailID, competitor);
|
||||
}
|
||||
final String canonicalizedSailIDWithoutDefaultNationality = canonicalizeSailID(
|
||||
competitorIdentifyingText.trim(), /* defaultNationality */ null);
|
||||
if (canonicalizedSailIDWithoutDefaultNationality != null) {
|
||||
result.put(canonicalizedSailIDWithoutDefaultNationality, competitor);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
package com.sap.sailing.domain.common;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.CompetitorWithBoat;
|
||||
import com.sap.sailing.domain.base.SailNumberCanonicalizerAndMatcher;
|
||||
import com.sap.sailing.domain.base.impl.BoatClassImpl;
|
||||
import com.sap.sailing.domain.base.impl.BoatImpl;
|
||||
import com.sap.sailing.domain.base.impl.CompetitorWithBoatImpl;
|
||||
import com.sap.sailing.domain.base.impl.NationalityImpl;
|
||||
import com.sap.sailing.domain.base.impl.PersonImpl;
|
||||
import com.sap.sailing.domain.base.impl.TeamImpl;
|
||||
import com.sap.sse.common.Color;
|
||||
|
||||
public class SailNumberCanonicalizationTest {
|
||||
private SailNumberCanonicalizerAndMatcher canonicalizer = new SailNumberCanonicalizerAndMatcher();
|
||||
|
||||
@Test
|
||||
public void testSimpleSailNumberMatching() {
|
||||
assertEquals("GER123", canonicalizer.canonicalizeSailID("GER 123", /* defaultNationality */ null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSailNumberWithoutNationalityMatching() {
|
||||
assertEquals("117911", canonicalizer.canonicalizeSailID("117911", /* defaultNationality */ null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSailNumberWithoutNationalityMatchingAgainstCompetitor() {
|
||||
final CompetitorWithBoat competitor = new CompetitorWithBoatImpl(UUID.randomUUID(), "TestCompetitor",
|
||||
"TC", Color.BLACK, /* email */ null, /* flagImage */ null,
|
||||
new TeamImpl("TestTeam",
|
||||
Collections.singleton(new PersonImpl("TestPerson", new NationalityImpl("NED"),
|
||||
/* dateOfBirth */ null,
|
||||
/* description */ null)),
|
||||
/* coach */ null), /* timeOnTimeFactor */ 1.0,
|
||||
/* timeOnDistanceAllowancePerNauticalMile */ null, /* searchTag */ null,
|
||||
new BoatImpl(UUID.randomUUID(), "TestBoat", new BoatClassImpl(BoatClassMasterdata._12M), "117911"));
|
||||
final Map<String, Competitor> map = canonicalizer
|
||||
.canonicalizeLeaderboardSailIDs(Collections.singleton(competitor));
|
||||
assertSame(competitor, map.get("117911"));
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -10,7 +10,6 @@ import java.util.stream.Collectors;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.NauticalSide;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.WindSourceType;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.maneuverdetection.ApproximatedFixesCalculator;
|
||||
import com.sap.sailing.domain.maneuverdetection.IncrementalApproximatedFixesCalculator;
|
||||
@@ -258,8 +257,7 @@ public class IncrementalManeuverDetectorImpl extends ManeuverDetectorImpl implem
|
||||
// maneuver spot calculation => recalculate maneuvers of existing maneuver curve
|
||||
CompleteManeuverCurve maneuverCurve = currentExistingManeuverSpot.getManeuverCurve();
|
||||
WindMeasurement windMeasurement = currentExistingManeuverSpot.getWindMeasurement();
|
||||
Wind wind = trackedRace.getWind(windMeasurement.getPosition(), windMeasurement.getTimePoint(),
|
||||
/* exclude */ trackedRace.getWindSources(WindSourceType.MANEUVER_BASED_ESTIMATION));
|
||||
Wind wind = trackedRace.getWind(windMeasurement.getPosition(), windMeasurement.getTimePoint());
|
||||
List<Maneuver> maneuvers = determineManeuversFromManeuverCurve(maneuverCurve.getMainCurveBoundaries(),
|
||||
maneuverCurve.getManeuverCurveWithStableSpeedAndCourseBoundaries(), wind,
|
||||
maneuverCurve.getMarkPassing());
|
||||
|
||||
+1
-3
@@ -16,7 +16,6 @@ import com.sap.sailing.domain.common.NauticalSide;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.Tack;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.WindSourceType;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.maneuverdetection.ApproximatedFixesCalculator;
|
||||
import com.sap.sailing.domain.maneuverdetection.ManeuverDetector;
|
||||
@@ -332,8 +331,7 @@ public class ManeuverDetectorImpl extends AbstractManeuverDetectorImpl {
|
||||
}
|
||||
TimePoint maneuverTimePoint = maneuverCurve.getMainCurveBoundaries().getTimePoint();
|
||||
Position maneuverPosition = track.getEstimatedPosition(maneuverTimePoint, /* extrapolate */false);
|
||||
final Wind wind = trackedRace.getWind(maneuverPosition, maneuverTimePoint,
|
||||
/* exclude */ trackedRace.getWindSources(WindSourceType.MANEUVER_BASED_ESTIMATION));
|
||||
final Wind wind = trackedRace.getWind(maneuverPosition, maneuverTimePoint);
|
||||
List<Maneuver> maneuvers = determineManeuversFromManeuverCurve(maneuverCurve.getMainCurveBoundaries(),
|
||||
maneuverCurve.getManeuverCurveWithStableSpeedAndCourseBoundaries(), wind,
|
||||
maneuverCurve.getMarkPassing());
|
||||
|
||||
+1
-3
@@ -10,7 +10,6 @@ import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence;
|
||||
import com.sap.sailing.domain.base.Waypoint;
|
||||
import com.sap.sailing.domain.common.ManeuverType;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.WindSourceType;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.maneuverdetection.CompleteManeuverCurveWithEstimationData;
|
||||
import com.sap.sailing.domain.maneuverdetection.ManeuverCurveWithUnstableCourseAndSpeedWithEstimationData;
|
||||
@@ -75,8 +74,7 @@ public class ManeuverDetectorWithEstimationDataSupportDecoratorImpl
|
||||
TimePoint maneuverTimePoint = maneuverCurve.getMainCurveBoundaries().getTimePoint();
|
||||
Position maneuverPosition = maneuverDetector.track.getEstimatedPosition(maneuverTimePoint,
|
||||
/* extrapolate */false);
|
||||
Wind wind = maneuverDetector.trackedRace.getWind(maneuverPosition, maneuverTimePoint,
|
||||
/* exclude */ maneuverDetector.trackedRace.getWindSources(WindSourceType.MANEUVER_BASED_ESTIMATION));
|
||||
Wind wind = maneuverDetector.trackedRace.getWind(maneuverPosition, maneuverTimePoint);
|
||||
maneuvers
|
||||
.addAll(maneuverDetector.determineManeuversFromManeuverCurve(maneuverCurve.getMainCurveBoundaries(),
|
||||
maneuverCurve.getManeuverCurveWithStableSpeedAndCourseBoundaries(), wind,
|
||||
|
||||
+1
-1
@@ -328,7 +328,7 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor {
|
||||
projectToBearing = cache.getLegBearing(getTrackedLeg(), at);
|
||||
}
|
||||
if (speed.getBearing() != null && projectToBearing != null) {
|
||||
//cos becomes negative after > 90 from leg direction
|
||||
// cos becomes negative after > 90 from leg direction
|
||||
final double cos = Math.cos(speed.getBearing().getRadians() - projectToBearing.getRadians());
|
||||
result = new KnotSpeedWithBearingImpl(speed.getKnots() * cos, projectToBearing);
|
||||
} else {
|
||||
|
||||
+1
@@ -10,6 +10,7 @@
|
||||
<ul class="bulletList">
|
||||
<li>Added RS700 boat class data.</li>
|
||||
<li>Improved performance and smoothness of boat animation on map.</li>
|
||||
<li>VMG can now become negative.</li>
|
||||
</ul>
|
||||
<h5 class="articleSubheadline">April 2026</h5>
|
||||
<ul class="bulletList">
|
||||
|
||||
+2
-2
@@ -79,7 +79,7 @@ public class QuickRanksLiveCache {
|
||||
@Override
|
||||
public QuickRanksDTO computeCacheUpdate(RegattaAndRaceIdentifier key,
|
||||
CalculateOrPurge updateInterval) throws Exception {
|
||||
final TrackedRegatta cpuMeter = service.getTrackedRace(key).getTrackedRegatta();
|
||||
final TrackedRegatta cpuMeter = service.getService().getTrackedRace(key).getTrackedRegatta();
|
||||
return cpuMeter.callWithCPUMeterWithException(()->{
|
||||
logger.fine("Computing cache update for live QuickRanks of race "+key);
|
||||
final QuickRanksDTO quickRanks;
|
||||
@@ -137,7 +137,7 @@ public class QuickRanksLiveCache {
|
||||
+ "; re-computing");
|
||||
}
|
||||
if (result == null) {
|
||||
final TrackedRace trackedRace = service.getExistingTrackedRace(raceIdentifier);
|
||||
final TrackedRace trackedRace = service.getService().getExistingTrackedRace(raceIdentifier);
|
||||
if (trackedRace != null) {
|
||||
trackedRace.addListener(new Listener(raceIdentifier)); // register for all changes that may affect the quick ranks
|
||||
cache.triggerUpdate(raceIdentifier, CalculateOrPurge.CALCULATE);
|
||||
|
||||
Reference in New Issue
Block a user