diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties index 71c86c746e2..fcf1931cdf4 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties @@ -272,4 +272,5 @@ CompetitorSailingDomainRetrieverChain=Competitors in Leaderboards SmoothedSpeed=Smoothed Speed RatioDistanceLongVsShortTack=Ratio distance long tack / short tack RatioDurationLongVsShortTack=Ratio duration long tack / short tack -Discarded=Discarded \ No newline at end of file +Discarded=Discarded +DurationFromRaceStartToFirstTack=Duration from race start to first tack \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties index fcf4f3fd7ba..f7e381a7515 100755 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties @@ -270,4 +270,5 @@ CompetitorSailingDomainRetrieverChain=Teilnehmer in Ranglisten SmoothedSpeed=Geglättete Geschwindigkeit RatioDistanceLongVsShortTack=Verhältnis gesegelte Distanz auf Streck- zu Holebug RatioDurationLongVsShortTack=Verhältnis gesegelte Dauer auf Streck- zu Holebug -Discarded=Gestrichen \ No newline at end of file +Discarded=Gestrichen +DurationFromRaceStartToFirstTack=Dauer vom Start der Wettfahrt bis zur ersten Wende \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java index 431cf1ecf05..a98c626713f 100755 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java @@ -143,6 +143,13 @@ public interface HasRaceOfCompetitorContext { @Statistic(messageKey="RaceDuration") Duration getDuration(); + /** + * The time between the start of the race and the {@link #getCompetitor() competitor}'s first tack; + * {@code null} if no tack is found for the competitor in the race. + */ + @Statistic(messageKey="DurationFromRaceStartToFirstTack") + Duration getDurationFromStartToFirstTack(); + @Statistic(messageKey="DistanceToStarboardSideAtStartOfRace", resultDecimals=2) public Double getRelativeDistanceToStarboardSideAtStartOfRace(); diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java index fc66865418c..78ffe08f45a 100755 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java @@ -36,6 +36,7 @@ import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindPositionMode; +import com.sap.sailing.domain.tracking.impl.TimedComparator; import com.sap.sse.common.Bearing; import com.sap.sse.common.Distance; import com.sap.sse.common.Duration; @@ -399,6 +400,26 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { return duration; } + @Override + public Duration getDurationFromStartToFirstTack() { + final TrackedRace race = getTrackedRace(); + final Duration result; + if (race.getStartOfRace() == null) { + result = null; + } else { + final Iterable maneuvers = race.getManeuvers(competitor, /* wait for latest */ false); + final List tacks = Util.asList(Util.filter(maneuvers, + m->m.getType() == ManeuverType.TACK && !m.getTimePoint().before(race.getStartOfRace()))); + if (tacks.isEmpty()) { + result = null; + } else { + tacks.sort(TimedComparator.INSTANCE); + result = race.getStartOfRace().until(tacks.get(0).getTimePoint()); + } + } + return result; + } + @Override public Double getRelativeDistanceToStarboardSideAtStartOfRace() { TrackedRace trackedRace = getTrackedRace(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html index 302569835ab..adf355c1201 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html @@ -12,6 +12,7 @@
  • No more tool tips for course area circles. They kept tool tips for lines (such as start/finish lines or course middle lines) from showing when hovering the mouse over them.
  • In Data Mining, race results now have a new dimension "Discarded" for grouping and filtering.
  • +
  • Races of competitors now have a new statistic in Data Mining: duration since start to first tack.
  • July 2024