From 656e82a919ec5876603c5a66212e47839e002aa2 Mon Sep 17 00:00:00 2001 From: Lisa Date: Fri, 8 Dec 2023 10:11:08 +0100 Subject: [PATCH] bug5932: modifying bravo to gps --- .../data/HasGPSFixTrackContext.java | 22 ++++++ .../data/HasTackTypeSegmentContext.java | 2 +- .../TackTypeSegmentRetrievalProcessor.java | 66 +++++++++--------- .../impl/data/GPSFixTrackWithContext.java | 69 +++++++++++++++++++ .../impl/data/TackTypeSegmentWithContext.java | 18 ++--- .../domain/common/tracking/BravoFix.java | 2 - .../common/tracking/impl/BravoFixImpl.java | 6 -- .../impl/DynamicGPSFixMovingTrackImpl.java | 1 - 8 files changed, 135 insertions(+), 51 deletions(-) create mode 100644 java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixTrackContext.java create mode 100644 java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixTrackWithContext.java diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixTrackContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixTrackContext.java new file mode 100644 index 00000000000..7fb1910300a --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixTrackContext.java @@ -0,0 +1,22 @@ +package com.sap.sailing.datamining.data; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.GPSFixTrack; +import com.sap.sse.common.Distance; +import com.sap.sse.common.Duration; +import com.sap.sse.datamining.annotations.Connector; +import com.sap.sse.datamining.annotations.Statistic; + +public interface HasGPSFixTrackContext { + @Connector(scanForStatistics=false) + HasRaceOfCompetitorContext getRaceOfCompetitorContext(); + + GPSFixTrack getGPSFixTrack(); + + @Statistic(messageKey="timeSpentOnTackType", resultDecimals=1) + Duration getTimeSpentTackType(); + + @Statistic(messageKey="TackTypeDistance", resultDecimals=1) + Distance getDistanceSpentTackType(); +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTackTypeSegmentContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTackTypeSegmentContext.java index 013b41de8ce..62538760175 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTackTypeSegmentContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTackTypeSegmentContext.java @@ -9,7 +9,7 @@ import com.sap.sse.datamining.annotations.Statistic; public interface HasTackTypeSegmentContext { @Connector(scanForStatistics=false) - HasBravoFixTrackContext getBravoFixTrackContext(); + HasGPSFixTrackContext getGPSFixTrackContext(); TimePoint getStartOfTackTypeSegment(); diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TackTypeSegmentRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TackTypeSegmentRetrievalProcessor.java index bd889055a0b..77dba6c1014 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TackTypeSegmentRetrievalProcessor.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TackTypeSegmentRetrievalProcessor.java @@ -7,13 +7,15 @@ import java.util.concurrent.ExecutorService; import com.sap.sailing.datamining.data.HasTackTypeSegmentContext; import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext; -import com.sap.sailing.datamining.impl.data.BravoFixTrackWithContext; import com.sap.sailing.datamining.impl.data.TackTypeSegmentWithContext; import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.NoWindException; -import com.sap.sailing.domain.common.tracking.BravoFix; -import com.sap.sailing.domain.tracking.BravoFixTrack; +import com.sap.sailing.domain.common.TackType; +import com.sap.sailing.domain.common.tracking.GPSFix; +import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.datamining.impl.data.GPSFixTrackWithContext; +import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.TimePoint; @@ -46,44 +48,44 @@ public class TackTypeSegmentRetrievalProcessor extends AbstractRetrievalProcesso } else { end = endOfRace; } - final BravoFixTrack bravoFixTrack = trackedRace.getSensorTrack(element.getCompetitor(), BravoFixTrack.TRACK_NAME); - if (bravoFixTrack != null) { - boolean isTackType = false; + final GPSFixTrack gpsFixTrack = trackedRace.getTrack(element.getCompetitor()); + if (gpsFixTrack != null) { + TackType lastTackType = null; + TackType currentFixTackType = null; TimePoint last = null; TimePoint startOfSegment = null; - bravoFixTrack.lockForRead(); + gpsFixTrack.lockForRead(); try { - for (final BravoFix bravoFix : bravoFixTrack.getFixes(startOfRace, /* fromInclusive */ true, end, /* toInclusive */ false)) { + for (final GPSFix gpsFix : gpsFixTrack.getFixes(startOfRace, /* fromInclusive */ true, end, /* toInclusive */ false)) { //SCHLEIFE die durch alle gps fixes des rennen geht if (isAborted()) { break; } - TrackedLegOfCompetitor trackedLegComp = element.getTrackedRaceContext().getTrackedRace().getTrackedLeg(element.getCompetitor(), bravoFix.getTimePoint()); - boolean currentFixIsTackType; + TrackedLegOfCompetitor trackedLegComp = element.getTrackedRaceContext().getTrackedRace().getTrackedLeg(element.getCompetitor(), gpsFix.getTimePoint()); try { - currentFixIsTackType = (bravoFix.isTackType(trackedLegComp.getTackType(bravoFix.getTimePoint()))); + currentFixTackType = trackedLegComp.getTackType(gpsFix.getTimePoint()); } catch (NoWindException e) { - currentFixIsTackType=false; + currentFixTackType=null; } - if (currentFixIsTackType != isTackType) { - if (currentFixIsTackType) { - startOfSegment = bravoFix.getTimePoint(); + if (currentFixTackType != lastTackType) { //wenn Veränderung des TT: + if (settings.getMinimumTackTypeSegmentDuration() == null || startOfSegment.until(last) //wenn zu kleine segment dann: + .compareTo(settings.getMinimumTackTypeSegmentDuration()) >= 0) { + addOrMergeTackTypeSegment(element, tackTypeSegments, gpsFixTrack, startOfSegment, + last /* don't include the last interval ending at the non-TackType fix */); + } //wenn next abschnitt nicht null TT ist: + if (currentFixTackType != null) { // immer wenn TT sich ändert start UND ende, außer null + startOfSegment = gpsFix.getTimePoint(); } else { - if (settings.getMinimumTackTypeSegmentDuration() == null || - startOfSegment.until(last).compareTo(settings.getMinimumTackTypeSegmentDuration()) >= 0) { - addOrMergeTackTypeSegment(element, tackTypeSegments, bravoFixTrack, startOfSegment, - last /* don't include the last interval ending at the non-TackType fix */); - } startOfSegment = null; - } - isTackType = currentFixIsTackType; + } //veränderter TT wird aktualisiert + lastTackType = currentFixTackType; } - last = bravoFix.getTimePoint(); + last = gpsFix.getTimePoint(); } } finally { - bravoFixTrack.unlockAfterRead(); + gpsFixTrack.unlockAfterRead(); } - if (isTackType) { - addOrMergeTackTypeSegment(element, tackTypeSegments, bravoFixTrack, startOfSegment, end); + if (currentFixTackType == lastTackType && currentFixTackType!= null) { + addOrMergeTackTypeSegment(element, tackTypeSegments, gpsFixTrack, startOfSegment, end); } } } @@ -91,26 +93,26 @@ public class TackTypeSegmentRetrievalProcessor extends AbstractRetrievalProcesso } private void addOrMergeTackTypeSegment(HasRaceOfCompetitorContext element, - List tackTypeSegments, final BravoFixTrack bravoFixTrack, + List tackTypeSegments, final GPSFixTrack gpsFixTrack, TimePoint startOfSegment, TimePoint endOfSegment) { if (tackTypeSegments.isEmpty() || settings.getMinimumDurationBetweenAdjacentTackTypeSegments() == null) { - tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, bravoFixTrack)); + tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, gpsFixTrack)); } else { final HasTackTypeSegmentContext previousSegment = tackTypeSegments.get(tackTypeSegments.size()-1); final TimePoint previousEnd = previousSegment.getEndOfTackTypeSegment(); if (previousEnd.until(startOfSegment).compareTo(settings.getMinimumDurationBetweenAdjacentTackTypeSegments()) < 0) { // merge: - tackTypeSegments.set(tackTypeSegments.size()-1, createTackTypeSegment(previousSegment.getStartOfTackTypeSegment(), endOfSegment, element, bravoFixTrack)); + tackTypeSegments.set(tackTypeSegments.size()-1, createTackTypeSegment(previousSegment.getStartOfTackTypeSegment(), endOfSegment, element, gpsFixTrack)); } else { // add; duration between the segments is large enough - tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, bravoFixTrack)); + tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, gpsFixTrack)); } } } private HasTackTypeSegmentContext createTackTypeSegment(TimePoint startOfSegment, TimePoint endOfSegment, - HasRaceOfCompetitorContext raceOfCompetitorContext, BravoFixTrack bravoFixTrack) { - return new TackTypeSegmentWithContext(new BravoFixTrackWithContext(raceOfCompetitorContext, bravoFixTrack), startOfSegment, endOfSegment); + HasRaceOfCompetitorContext raceOfCompetitorContext, GPSFixTrack gpsFixTrack) { + return new TackTypeSegmentWithContext(new GPSFixTrackWithContext(raceOfCompetitorContext, gpsFixTrack), startOfSegment, endOfSegment); } } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixTrackWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixTrackWithContext.java new file mode 100644 index 00000000000..48a773927db --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixTrackWithContext.java @@ -0,0 +1,69 @@ +package com.sap.sailing.datamining.impl.data; + +import com.sap.sailing.datamining.data.HasGPSFixTrackContext; +import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.GPSFixTrack; +import com.sap.sse.common.Distance; +import com.sap.sse.common.Duration; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +public class GPSFixTrackWithContext implements HasGPSFixTrackContext { + + private final HasRaceOfCompetitorContext raceOfCompetitorContext; + + private final GPSFixTrack gpsFixTrack; + + public GPSFixTrackWithContext(HasRaceOfCompetitorContext raceOfCompetitorContext, GPSFixTrack gpsFixTrack) { + this.raceOfCompetitorContext = raceOfCompetitorContext; + this.gpsFixTrack = gpsFixTrack; + } + + @Override + public HasRaceOfCompetitorContext getRaceOfCompetitorContext() { + return raceOfCompetitorContext; + } + + @Override + public GPSFixTrack getGPSFixTrack() { + return gpsFixTrack; + } + + @Override + public Duration getTimeSpentTackType() { + if(getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace() != null) { + final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace(); + final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace(); + final TimePoint end; + if (endOfRace == null) { + final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking(); + end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking; + } else { + end = endOfRace; + } + return gpsFixTrack.getTimeSpentTackType(startOfRace, end); + } + return null; + } + + @Override + public Distance getDistanceSpentTackType() { + if(getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace() != null) { + final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace(); + final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace(); + final TimePoint end; + if (endOfRace == null) { + final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking(); + end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking; + } else { + end = endOfRace; + } + return gpsFixTrack.getDistanceSpentTackType( + startOfRace, + end); + } + return null; + } +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TackTypeSegmentWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TackTypeSegmentWithContext.java index b0f7cb7a430..13257cfe451 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TackTypeSegmentWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TackTypeSegmentWithContext.java @@ -2,7 +2,7 @@ package com.sap.sailing.datamining.impl.data; import java.text.SimpleDateFormat; -import com.sap.sailing.datamining.data.HasBravoFixTrackContext; +import com.sap.sailing.datamining.data.HasGPSFixTrackContext; import com.sap.sailing.datamining.data.HasTackTypeSegmentContext; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.tracking.GPSFixMoving; @@ -13,28 +13,28 @@ import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; public class TackTypeSegmentWithContext implements HasTackTypeSegmentContext { - private final HasBravoFixTrackContext bravoFixTrackContext; + private final HasGPSFixTrackContext gpsFixTrackContext; private final TimePoint startOfTackTypeSegment; private final TimePoint endOfTackTypeSegment; private static final SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); - public TackTypeSegmentWithContext(HasBravoFixTrackContext bravoFixTrackContext, TimePoint startOfTackTypeSegment, + public TackTypeSegmentWithContext(GPSFixTrackWithContext gpsFixTrackWithContext, TimePoint startOfTackTypeSegment, TimePoint endOfTackTypeSegment) { super(); - this.bravoFixTrackContext = bravoFixTrackContext; + this.gpsFixTrackContext = gpsFixTrackWithContext; this.startOfTackTypeSegment = startOfTackTypeSegment; this.endOfTackTypeSegment = endOfTackTypeSegment; } @Override public String getName() { - return bravoFixTrackContext.getRaceOfCompetitorContext().getCompetitor().getName() + "@" + return gpsFixTrackContext.getRaceOfCompetitorContext().getCompetitor().getName() + "@" + TIMEPOINT_FORMATTER.format(startOfTackTypeSegment.asDate()); } @Override - public HasBravoFixTrackContext getBravoFixTrackContext() { - return bravoFixTrackContext; + public HasGPSFixTrackContext getGPSFixTrackContext() { + return gpsFixTrackContext; } @Override @@ -63,10 +63,10 @@ public class TackTypeSegmentWithContext implements HasTackTypeSegmentContext { } private Competitor getCompetitor() { - return getBravoFixTrackContext().getRaceOfCompetitorContext().getCompetitor(); + return getGPSFixTrackContext().getRaceOfCompetitorContext().getCompetitor(); } private TrackedRace getTrackedRace() { - return getBravoFixTrackContext().getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace(); + return getGPSFixTrackContext().getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace(); } } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoFix.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoFix.java index aa23aef13dd..2112d7ff276 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoFix.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoFix.java @@ -1,6 +1,5 @@ package com.sap.sailing.domain.common.tracking; -import com.sap.sailing.domain.common.TackType; import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sse.common.Bearing; import com.sap.sse.common.Distance; @@ -41,7 +40,6 @@ public interface BravoFix extends SensorFix { * for a fix to be considered foiling. */ boolean isFoiling(Distance minimumRideHeight); - boolean isTackType(TackType tackType); @Statistic(messageKey="pitch", resultDecimals=1) Bearing getPitch(); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java index a87d5c93fe1..46c254cc8ab 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java @@ -1,6 +1,5 @@ package com.sap.sailing.domain.common.tracking.impl; -import com.sap.sailing.domain.common.TackType; import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata; import com.sap.sailing.domain.common.sensordata.ColumnMetadata; @@ -74,9 +73,4 @@ public class BravoFixImpl extends SensorFixImpl implements BravoFix { final Double bearingDeg = fix.get(BravoSensorDataMetadata.HEEL.getColumnIndex()); return bearingDeg == null ? null : new DegreeBearingImpl(bearingDeg); } - - @Override - public boolean isTackType(TackType tackType) { - return TackType.LONGTACK == tackType; - } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicGPSFixMovingTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicGPSFixMovingTrackImpl.java index 5eec9f82271..486966c7ae8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicGPSFixMovingTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicGPSFixMovingTrackImpl.java @@ -275,5 +275,4 @@ public class DynamicGPSFixMovingTrackImpl extends GPSFixTrackImpl