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 65084d8084a..c67e1bcfb75 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties @@ -188,7 +188,7 @@ AbsRelativeBearingToNextMarkAfterManeuver=Abs. relative bearing to the next mark RatioBetweenDistanceSailedWithAndWithoutManeuver=Ratio between distance sailed with and without maneuver RatioBetweenDistanceSailedTowardMiddleAngleProjectionWithAndWithoutManeuver=Ratio between distance sailed toward middle angle projection with and without maneuver DurationLostByManeuver=Duration lost by maneuver -DurationLostByManeuverTowardMiddleAngleProjection=duration lost by maneuver toward middle angle projection +DurationLostByManeuverTowardMiddleAngleProjection=Duration lost by maneuver toward middle angle projection JibingCount=Jibing count TackingCount=Tacking count AbsTwaAtMaxTurningRate=Abs. TWA at max. turning rate @@ -198,4 +198,5 @@ PercentageOfMainCurveProgressUntilLowestSpeed=Percentage of main curve progress PercentageOfMainCurveProgressUntilHighestSpeed=Percentage of main curve progress until highest speed PercentageOfMainCurveProgressUntilMaxTurningRate=Percentage of main curve progress until max. turning rate speed AbsTwaAtManeuverMiddle=Abs. TWA at maneuver middle -GpsSamplingRate=GPS sampling rate \ No newline at end of file +GpsSamplingRate=GPS sampling rate +RaceDuration=Race duration \ 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 2ef0edf2761..82c4ad2377d 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties @@ -201,4 +201,5 @@ PercentageOfMainCurveProgressUntilHighestSpeed=Prozentualer Fortschritt der Haup PercentageOfMainCurveProgressUntilMaxTurningRate=Prozentualer Fortschritt der Hauptkurve bis zum Erreichen von max. Drehrate ManeuverTypeForCompleteManeuverCurve=Manövertyp für komplette Manöverkurve AbsTwaAtManeuverMiddle=Abs. TWA während Manövermitte -GpsSamplingRate=GPS-Samplingrate \ No newline at end of file +GpsSamplingRate=GPS-Samplingrate +RaceDuration=Renndauer \ 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 3fbcd143d7e..32c3e23ad15 100644 --- 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 @@ -4,6 +4,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Tack; import com.sap.sse.common.Distance; +import com.sap.sse.common.Duration; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.Speed; import com.sap.sse.datamining.annotations.Connector; @@ -14,74 +15,74 @@ import com.sap.sse.datamining.shared.impl.dto.ClusterDTO; public interface HasRaceOfCompetitorContext { @Connector(scanForStatistics=false) - public HasTrackedRaceContext getTrackedRaceContext(); + HasTrackedRaceContext getTrackedRaceContext(); @Connector(messageKey="Competitor") @Statistic(messageKey="") - public Competitor getCompetitor(); + Competitor getCompetitor(); @Dimension(messageKey="TackAtStart", ordinal=12) - public Tack getTackAtStart() throws NoWindException; + Tack getTackAtStart() throws NoWindException; @Dimension(messageKey="DistanceToStarboardSideAtStartOfCompetitor", ordinal=13) - public ClusterDTO getPercentageClusterForDistanceToStarboardSideAtStart(); + ClusterDTO getPercentageClusterForDistanceToStarboardSideAtStart(); @Dimension(messageKey="RelativeScoreInPercent", ordinal=14) - public ClusterDTO getPercentageClusterForRelativeScore(); + ClusterDTO getPercentageClusterForRelativeScore(); @Statistic(messageKey="DistanceAtStart", resultDecimals=2, ordinal=0) - public Distance getDistanceToStartLineAtStart(); + Distance getDistanceToStartLineAtStart(); @Statistic(messageKey="DistanceToStarboardSideAtStartOfCompetitor", resultDecimals=2, ordinal=1) - public Double getNormalizedDistanceToStarboardSideAtStartOfCompetitor(); + Double getNormalizedDistanceToStarboardSideAtStartOfCompetitor(); @Statistic(messageKey="DistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark", resultDecimals=2, ordinal=1) - public Pair getNormalizedDistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark(); + Pair getNormalizedDistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark(); @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLineAtStartOfRace", resultDecimals=2, ordinal=2) - public Distance getWindwardDistanceToAdvantageousLineEndAtStartofRace(); + Distance getWindwardDistanceToAdvantageousLineEndAtStartofRace(); @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLineAtStartOfCompetitor", resultDecimals=2, ordinal=2) - public Distance getWindwardDistanceToAdvantageousLineEndAtStartofCompetitor(); + Distance getWindwardDistanceToAdvantageousLineEndAtStartofCompetitor(); @Connector(messageKey="SpeedWhenStarting", ordinal=3) - public Speed getSpeedWhenStarting(); + Speed getSpeedWhenStarting(); @Connector(messageKey="SpeedTenSecondsBeforeStart", ordinal=4) - public Speed getSpeedTenSecondsBeforeStart(); + Speed getSpeedTenSecondsBeforeStart(); @Connector(messageKey="SpeedTenSecondsAfterStart", ordinal=5) - public Speed getSpeedTenSecondsAfterStartOfRace(); + Speed getSpeedTenSecondsAfterStartOfRace(); @Statistic(messageKey="RankThirtySecondsAfterStart", resultDecimals=2, ordinal=6) - public Double getRankThirtySecondsAfterStartOfRace(); + Double getRankThirtySecondsAfterStartOfRace(); @Statistic(messageKey="RankAfterHalfOfTheFirstLeg", resultDecimals=2, ordinal=7) - public Double getRankAfterHalfOfTheFirstLeg(); + Double getRankAfterHalfOfTheFirstLeg(); @Statistic(messageKey="RankAtFirstMark", resultDecimals=2, ordinal=8) - public Double getRankAtFirstMark(); + Double getRankAtFirstMark(); @Statistic(messageKey="RankGainsOrLossesBetweenFirstMarkAndFinish", resultDecimals=2, ordinal=9) - public Double getRankGainsOrLossesBetweenFirstMarkAndFinish(); + Double getRankGainsOrLossesBetweenFirstMarkAndFinish(); @Statistic(messageKey="NumberOfManeuvers", resultDecimals=0, ordinal=10) - public int getNumberOfManeuvers(); + int getNumberOfManeuvers(); @Statistic(messageKey="NumberOfTacks", resultDecimals=0, ordinal=11) - public int getNumberOfTacks(); + int getNumberOfTacks(); @Statistic(messageKey="NumberOfJibes", resultDecimals=0, ordinal=12) - public int getNumberOfJibes(); + int getNumberOfJibes(); @Statistic(messageKey="NumberOfPenaltyCircles", resultDecimals=0, ordinal=13) - public int getNumberOfPenaltyCircles(); + int getNumberOfPenaltyCircles(); @Statistic(messageKey="DistanceTraveled", resultDecimals=1) - public Distance getDistanceTraveled(); + Distance getDistanceTraveled(); @Statistic(messageKey="LineLengthAtStart", resultDecimals=1) - public Distance getLineLengthAtStart(); + Distance getLineLengthAtStart(); @Statistic(messageKey="AbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor", resultDecimals=2) Distance getAbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor(); @@ -94,4 +95,8 @@ public interface HasRaceOfCompetitorContext { @Statistic(messageKey="RelativeDistanceToAdvantageousEndOfLineAtStartOfRace", resultDecimals=2) Double getRelativeDistanceToAdvantageousEndOfLineAtStartOfRace(); + + @Statistic(messageKey="RaceDuration") + Duration getDuration(); + } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java index 138f4b7788f..b5a77441a5a 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java @@ -8,6 +8,7 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.Duration; import com.sap.sse.datamining.annotations.Connector; import com.sap.sse.datamining.annotations.Dimension; import com.sap.sse.datamining.annotations.Statistic; @@ -46,10 +47,13 @@ public interface HasTrackedRaceContext { @Dimension(messageKey="IsTracked", ordinal=9) public Boolean isTracked(); - @Statistic(messageKey="NumberOfCompetitorFixes", resultDecimals=0, ordinal=0) + @Statistic(messageKey="RaceDuration", ordinal=0) + public Duration getDuration(); + + @Statistic(messageKey="NumberOfCompetitorFixes", resultDecimals=0, ordinal=1) public int getNumberOfCompetitorFixes(); - @Statistic(messageKey="NumberOfMarkFixes", resultDecimals=0, ordinal=1) + @Statistic(messageKey="NumberOfMarkFixes", resultDecimals=0, ordinal=2) public int getNumberOfMarkFixes(); // Convenience methods for race dependent calculation to avoid code duplication 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 2227b229f0e..a49907755db 100644 --- 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 @@ -29,10 +29,12 @@ import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sse.common.Distance; +import com.sap.sse.common.Duration; import com.sap.sse.common.Speed; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; +import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.datamining.data.Cluster; import com.sap.sse.datamining.shared.impl.dto.ClusterDTO; @@ -357,4 +359,18 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { return distance / length; } + @Override + public Duration getDuration() { + Duration duration = null; + TrackedRace race = getTrackedRace(); + Course course = race.getRace().getCourse(); + MarkPassing startPassing = race.getMarkPassing(competitor, course.getFirstWaypoint()); + MarkPassing finishPassing = race.getMarkPassing(competitor, course.getLastWaypoint()); + if (startPassing != null && finishPassing != null) { + long durationMillis = finishPassing.getTimePoint().asMillis() - startPassing.getTimePoint().asMillis(); + duration = new MillisecondsDurationImpl(durationMillis); + } + return duration; + } + } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java index 89de0e2091e..445e93d1d39 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java @@ -17,8 +17,10 @@ import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; public class TrackedRaceWithContext implements HasTrackedRaceContext { @@ -113,6 +115,26 @@ public class TrackedRaceWithContext implements HasTrackedRaceContext { public Boolean isTracked() { return getTrackedRace().hasStarted(MillisecondsTimePoint.now()); } + + @Override + public Duration getDuration() { + Duration duration = null; + TrackedRace race = getTrackedRace(); + TimePoint start = race.getStartOfRace(); + if (start == null) { + start = race.getStartOfTracking(); + } + if (start != null) { + TimePoint end = race.getEndOfRace(); + if (end == null) { + end = race.getEndOfTracking(); + } + if (end != null) { + duration = new MillisecondsDurationImpl(end.asMillis() - start.asMillis()); + } + } + return duration; + } @Override public int getNumberOfCompetitorFixes() { diff --git a/java/com.sap.sse.datamining.ui/src/main/java/com/sap/sse/datamining/ui/client/selection/SuggestBoxStatisticProvider.java b/java/com.sap.sse.datamining.ui/src/main/java/com/sap/sse/datamining/ui/client/selection/SuggestBoxStatisticProvider.java index c06d793afd0..db03c0749f6 100644 --- a/java/com.sap.sse.datamining.ui/src/main/java/com/sap/sse/datamining/ui/client/selection/SuggestBoxStatisticProvider.java +++ b/java/com.sap.sse.datamining.ui/src/main/java/com/sap/sse/datamining/ui/client/selection/SuggestBoxStatisticProvider.java @@ -531,7 +531,7 @@ public class SuggestBoxStatisticProvider extends AbstractDataMiningComponent