This commit is contained in:
Masha Kashirina
2026-07-30 12:38:58 +02:00
8 changed files with 63 additions and 12 deletions
@@ -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;
}
@@ -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"));
}
}
@@ -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());
@@ -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());
@@ -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,
@@ -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 {
@@ -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">
@@ -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);