mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-21 21:25:38 +00:00
bug6092: interims commit, compilable but not done yet
This commit is contained in:
+6
-1
@@ -2,6 +2,7 @@ package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.base.Boat;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.Speed;
|
||||
@@ -18,10 +19,14 @@ import com.sap.sse.datamining.shared.impl.dto.ClusterDTO;
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public interface AbstractHasTrackedLegSliceOfCompetitorContext extends HasWindOnTrackedLeg, HasSomethingOfCompetitorContextWithTrackedRaceContext {
|
||||
public interface AbstractHasTrackedLegSliceOfCompetitorContext extends HasSomethingOfCompetitorContextWithTrackedRaceContext {
|
||||
@Connector(scanForStatistics=false)
|
||||
HasTrackedLegContext getTrackedLegContext();
|
||||
|
||||
default TrackedRace getTrackedRace() {
|
||||
return getTrackedLegContext().getTrackedRaceContext().getTrackedRace();
|
||||
}
|
||||
|
||||
TrackedLegOfCompetitor getTrackedLegOfCompetitor();
|
||||
|
||||
default HasTrackedRaceContext getTrackedRaceContext() {
|
||||
|
||||
+1
-7
@@ -2,14 +2,13 @@ package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
import com.sap.sse.common.Bearing;
|
||||
import com.sap.sse.common.Speed;
|
||||
import com.sap.sse.datamining.annotations.Connector;
|
||||
import com.sap.sse.datamining.annotations.Statistic;
|
||||
|
||||
public interface HasBravoFixContext {
|
||||
public interface HasBravoFixContext extends HasWindOnTrackedLegOfCompetitor {
|
||||
@Connector(scanForStatistics=false)
|
||||
HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext();
|
||||
|
||||
@@ -19,11 +18,6 @@ public interface HasBravoFixContext {
|
||||
@Connector(messageKey="")
|
||||
SpeedWithBearing getSpeed();
|
||||
|
||||
@Connector(messageKey="Wind")
|
||||
default Wind getWind() {
|
||||
return getTrackedLegOfCompetitorContext().getWind();
|
||||
}
|
||||
|
||||
@Statistic(messageKey="TrueWindAngle")
|
||||
Bearing getTrueWindAngle() throws NoWindException;
|
||||
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import com.sap.sse.datamining.annotations.Connector;
|
||||
import com.sap.sse.datamining.annotations.Dimension;
|
||||
import com.sap.sse.datamining.annotations.Statistic;
|
||||
|
||||
public interface HasGPSFixContext {
|
||||
public interface HasGPSFixContext extends HasWindOnTrackedLegOfCompetitor {
|
||||
@Connector(scanForStatistics = false)
|
||||
HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext();
|
||||
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import com.sap.sse.datamining.annotations.Connector;
|
||||
import com.sap.sse.datamining.annotations.Dimension;
|
||||
import com.sap.sse.datamining.annotations.Statistic;
|
||||
|
||||
public interface HasManeuverContext extends HasManeuver, HasTrackedLegOfCompetitor {
|
||||
public interface HasManeuverContext extends HasManeuver, HasTrackedLegOfCompetitor, HasWindOnTrackedLegOfCompetitor {
|
||||
@Connector(scanForStatistics = false)
|
||||
HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext();
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import com.sap.sse.datamining.annotations.Connector;
|
||||
import com.sap.sse.datamining.annotations.Dimension;
|
||||
import com.sap.sse.datamining.annotations.Statistic;
|
||||
|
||||
public interface HasMarkPassingContext extends HasManeuver {
|
||||
public interface HasMarkPassingContext extends HasManeuver, HasWindOnTrackedLegOfCompetitor {
|
||||
@Connector(scanForStatistics=false)
|
||||
HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext();
|
||||
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import com.sap.sse.datamining.annotations.Dimension;
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public interface HasTrackedLegSliceOfCompetitorContext extends AbstractHasTrackedLegSliceOfCompetitorContext {
|
||||
public interface HasTrackedLegSliceOfCompetitorContext extends TerminalHasTrackedLegSliceOfCompetitorContext {
|
||||
/**
|
||||
* one-based; e.g., if there are ten slices, they have slice numbers 1..10
|
||||
*/
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.datamining.annotations.Dimension;
|
||||
|
||||
public interface HasWindOnTrackedLeg extends HasTrackedLegOfCompetitor, HasWind {
|
||||
public interface HasWindOnTrackedLegOfCompetitor extends HasTrackedLegOfCompetitor, HasWind {
|
||||
default Wind getWind() {
|
||||
if (getWindInternal() == null) {
|
||||
setWindInternal(getTrackedRace().getWind(getPosition(), getTimePoint()));
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
/**
|
||||
* A terminal type on a retriever chain that is especially not use to extend the chain leading to other types that
|
||||
* implement {@link HasWindOnTrackedLegOfCompetitor}. This would otherwise duplicate the wind-based dimensions where the
|
||||
* finer-grained objects reached at the end of the chain should know better about their position, time point and wind
|
||||
* than the leg as such.
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public interface TerminalHasTrackedLegSliceOfCompetitorContext
|
||||
extends AbstractHasTrackedLegSliceOfCompetitorContext, HasWindOnTrackedLegOfCompetitor {
|
||||
@Override
|
||||
default TrackedRace getTrackedRace() {
|
||||
return AbstractHasTrackedLegSliceOfCompetitorContext.super.getTrackedRace();
|
||||
}
|
||||
}
|
||||
+1
-4
@@ -7,7 +7,6 @@ import java.util.concurrent.ExecutorService;
|
||||
import com.sap.sailing.datamining.data.HasBravoFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.BravoFixWithContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithSpecificTimePointWithContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
import com.sap.sailing.domain.tracking.BravoFixTrack;
|
||||
@@ -37,9 +36,7 @@ public class BravoFixRetrievalProcessor extends AbstractRetrievalProcessor<HasTr
|
||||
if (isAborted()) {
|
||||
break;
|
||||
}
|
||||
BravoFixWithContext gpsFixWithContext = new BravoFixWithContext(
|
||||
new TrackedLegOfCompetitorWithSpecificTimePointWithContext(
|
||||
element.getTrackedLegContext(), element.getTrackedLegOfCompetitor(), bravoFix.getTimePoint()), bravoFix);
|
||||
BravoFixWithContext gpsFixWithContext = new BravoFixWithContext(element, bravoFix);
|
||||
bravoFixesWithContext.add(gpsFixWithContext);
|
||||
}
|
||||
} finally {
|
||||
|
||||
+1
-3
@@ -7,7 +7,6 @@ import java.util.concurrent.ExecutorService;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.GPSFixWithContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithSpecificTimePointWithContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
@@ -36,8 +35,7 @@ public class GPSFixRetrievalProcessor extends AbstractRetrievalProcessor<HasTrac
|
||||
if (isAborted()) {
|
||||
break;
|
||||
}
|
||||
final HasGPSFixContext gpsFixWithContext = new GPSFixWithContext(new TrackedLegOfCompetitorWithSpecificTimePointWithContext(
|
||||
element.getTrackedLegContext(), element.getTrackedLegOfCompetitor(), gpsFix.getTimePoint()), gpsFix);
|
||||
final HasGPSFixContext gpsFixWithContext = new GPSFixWithContext(element, gpsFix);
|
||||
gpsFixesWithContext.add(gpsFixWithContext);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-3
@@ -7,7 +7,6 @@ import java.util.concurrent.ExecutorService;
|
||||
import com.sap.sailing.datamining.data.HasManeuverContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.ManeuverWithContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithSpecificTimePointWithContext;
|
||||
import com.sap.sailing.datamining.shared.ManeuverSettings;
|
||||
import com.sap.sailing.domain.base.Waypoint;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
@@ -53,8 +52,7 @@ public class ManeuverRetrievalProcessor
|
||||
}
|
||||
|
||||
if (currentManeuver != null) {
|
||||
ManeuverWithContext maneuverWithContext = new ManeuverWithContext(new TrackedLegOfCompetitorWithSpecificTimePointWithContext(
|
||||
element.getTrackedLegContext(), element.getTrackedLegOfCompetitor(), currentManeuver.getTimePoint()), currentManeuver,
|
||||
ManeuverWithContext maneuverWithContext = new ManeuverWithContext(element, currentManeuver,
|
||||
settings.isMainCurveAnalysis(), previousManeuver, nextManeuver);
|
||||
if (isManeuverCompliantWithSettings(previousManeuver, maneuverWithContext, nextManeuver)) {
|
||||
maneuversWithContext.add(maneuverWithContext);
|
||||
|
||||
+1
-3
@@ -7,7 +7,6 @@ import java.util.concurrent.ExecutorService;
|
||||
import com.sap.sailing.datamining.data.HasMarkPassingContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.MarkPassingWithContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithSpecificTimePointWithContext;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.tracking.Maneuver;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
@@ -35,8 +34,7 @@ public class MarkPassingRetrievalProcessor extends AbstractRetrievalProcessor<Ha
|
||||
break;
|
||||
}
|
||||
if (maneuver.isMarkPassing()) {
|
||||
maneuversWithContext.add(new MarkPassingWithContext(new TrackedLegOfCompetitorWithSpecificTimePointWithContext(
|
||||
element.getTrackedLegContext(), element.getTrackedLegOfCompetitor(), maneuver.getTimePoint()), maneuver));
|
||||
maneuversWithContext.add(new MarkPassingWithContext(element, maneuver));
|
||||
}
|
||||
}
|
||||
} catch (NoWindException e) {
|
||||
|
||||
+12
-47
@@ -20,8 +20,6 @@ import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.common.ManeuverType;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache;
|
||||
import com.sap.sailing.domain.tracking.BravoFixTrack;
|
||||
@@ -46,8 +44,6 @@ import com.sap.sse.datamining.shared.impl.dto.ClusterDTO;
|
||||
* windward distance in the leg.
|
||||
*/
|
||||
public abstract class AbstractTrackedLegSliceOfCompetitorWithContext implements AbstractHasTrackedLegSliceOfCompetitorContext {
|
||||
private static final long serialVersionUID = 5944904146286262768L;
|
||||
|
||||
private static final long DEFAULT_NUMBER_OF_SLICES = 10;
|
||||
|
||||
private final HasTrackedLegContext trackedLegContext;
|
||||
@@ -60,7 +56,6 @@ public abstract class AbstractTrackedLegSliceOfCompetitorWithContext implements
|
||||
private boolean isRankAtSliceStartInitialized;
|
||||
private Integer rankAtSliceFinish;
|
||||
private boolean isRankAtSliceFinishInitialized;
|
||||
private Wind wind;
|
||||
private int sliceNumber;
|
||||
|
||||
public AbstractTrackedLegSliceOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor, TackTypeSegmentsDataMiningSettings settings, int sliceNumber) {
|
||||
@@ -98,6 +93,17 @@ public abstract class AbstractTrackedLegSliceOfCompetitorWithContext implements
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Picks the time point that is in the middle between the time point when the competitor entered
|
||||
* the leg and the time point the competitor finished the leg. If no leg start/finish time exists
|
||||
* for the competitor, start/end of race and then start/end of tracking are used as fall-back values.
|
||||
*/
|
||||
public TimePoint getTimePoint() {
|
||||
final TrackedLeg trackedLeg = getTrackedLegContext().getTrackedLeg();
|
||||
final TrackedRace trackedRace = trackedLeg.getTrackedRace();
|
||||
return getTimePointBetweenLegSliceStartAndLegFinish(trackedRace);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasTrackedLegContext getTrackedLegContext() {
|
||||
@@ -359,31 +365,7 @@ public abstract class AbstractTrackedLegSliceOfCompetitorWithContext implements
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Wind getWindInternal() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindInternal(Wind wind) {
|
||||
this.wind = wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Position getPosition() {
|
||||
final TrackedLeg trackedLeg = getTrackedLegContext().getTrackedLeg();
|
||||
final TrackedRace trackedRace = trackedLeg.getTrackedRace();
|
||||
final TimePoint timepoint = getTimePointBetweenLegSliceStartAndLegFinish(trackedRace);
|
||||
final Position result;
|
||||
if (timepoint == null) {
|
||||
result = null;
|
||||
} else {
|
||||
result = trackedLeg.getMiddleOfLeg(timepoint);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private TimePoint getTimePointBetweenLegSliceStartAndLegFinish(final TrackedRace trackedRace) {
|
||||
protected TimePoint getTimePointBetweenLegSliceStartAndLegFinish(final TrackedRace trackedRace) {
|
||||
final TimePoint competitorLegSliceStartTime = getSliceStartTime();
|
||||
final TimePoint competitorLegSliceEndTime = getSliceFinishTime();
|
||||
final TimePoint startTime = competitorLegSliceStartTime != null ? competitorLegSliceStartTime :
|
||||
@@ -394,23 +376,6 @@ public abstract class AbstractTrackedLegSliceOfCompetitorWithContext implements
|
||||
return timepoint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Picks the time point that is in the middle between the time point when the competitor entered
|
||||
* the leg and the time point the competitor finished the leg. If no leg start/finish time exists
|
||||
* for the competitor, start/end of race and then start/end of tracking are used as fall-back values.
|
||||
*/
|
||||
@Override
|
||||
public TimePoint getTimePoint() {
|
||||
final TrackedLeg trackedLeg = getTrackedLegContext().getTrackedLeg();
|
||||
final TrackedRace trackedRace = trackedLeg.getTrackedRace();
|
||||
return getTimePointBetweenLegSliceStartAndLegFinish(trackedRace);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractHasTrackedLegSliceOfCompetitorContext getTrackedLegOfCompetitorContext() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getNumberOfManeuvers() {
|
||||
return getNumberOfJibes() + getNumberOfTacks();
|
||||
|
||||
+24
-2
@@ -3,6 +3,7 @@ package com.sap.sailing.datamining.impl.data;
|
||||
import com.sap.sailing.datamining.data.HasBravoFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
@@ -18,10 +19,14 @@ import com.sap.sse.common.TimePoint;
|
||||
* Equality is based on the {@link #getBravoFix() Bravo fix} only.
|
||||
*/
|
||||
public class BravoFixWithContext implements HasBravoFixContext {
|
||||
private static final long serialVersionUID = 3452314555495774433L;
|
||||
|
||||
private final HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext;
|
||||
|
||||
private final BravoFix bravoFix;
|
||||
|
||||
private Wind wind;
|
||||
|
||||
public BravoFixWithContext(HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext, BravoFix bravoFix) {
|
||||
this.trackedLegOfCompetitorContext = trackedLegOfCompetitorContext;
|
||||
this.bravoFix = bravoFix;
|
||||
@@ -59,6 +64,21 @@ public class BravoFixWithContext implements HasBravoFixContext {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Wind getWindInternal() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindInternal(Wind wind) {
|
||||
this.wind = wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Position getPosition() {
|
||||
return getTrackedRace().getTrack(getCompetitor()).getEstimatedPosition(getTimePoint(), /* extrapolate */ true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext() {
|
||||
return trackedLegOfCompetitorContext;
|
||||
@@ -69,11 +89,13 @@ public class BravoFixWithContext implements HasBravoFixContext {
|
||||
return bravoFix;
|
||||
}
|
||||
|
||||
private TimePoint getTimePoint() {
|
||||
@Override
|
||||
public TimePoint getTimePoint() {
|
||||
return getBravoFix().getTimePoint();
|
||||
}
|
||||
|
||||
private TrackedRace getTrackedRace() {
|
||||
@Override
|
||||
public TrackedRace getTrackedRace() {
|
||||
return getTrackedLegOfCompetitorContext().getTrackedRace();
|
||||
}
|
||||
|
||||
|
||||
+23
-2
@@ -5,8 +5,10 @@ import java.util.function.BiFunction;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.TackType;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
@@ -20,8 +22,10 @@ import com.sap.sse.common.TimePoint;
|
||||
* Equality is based on the {@link #getGPSFix() GPS fix} only.
|
||||
*/
|
||||
public class GPSFixWithContext implements HasGPSFixContext {
|
||||
private static final long serialVersionUID = -2808861038064003352L;
|
||||
private final HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext;
|
||||
private final GPSFixMoving gpsFix;
|
||||
private Wind wind;
|
||||
|
||||
public GPSFixWithContext(HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext, GPSFixMoving gpsFix) {
|
||||
this.trackedLegOfCompetitorContext = trackedLegOfCompetitorContext;
|
||||
@@ -53,11 +57,28 @@ public class GPSFixWithContext implements HasGPSFixContext {
|
||||
return true;
|
||||
}
|
||||
|
||||
private TimePoint getTimePoint() {
|
||||
@Override
|
||||
public TimePoint getTimePoint() {
|
||||
return getGPSFix().getTimePoint();
|
||||
}
|
||||
|
||||
private TrackedRace getTrackedRace() {
|
||||
@Override
|
||||
public Wind getWindInternal() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindInternal(Wind wind) {
|
||||
this.wind = wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Position getPosition() {
|
||||
return getGPSFix().getPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace() {
|
||||
return getTrackedLegOfCompetitorContext().getTrackedRace();
|
||||
}
|
||||
|
||||
|
||||
+11
@@ -33,6 +33,7 @@ public class ManeuverWithContext implements HasManeuverContext {
|
||||
private final double directionChangeInDegreesForAnalysis;
|
||||
private final Maneuver previousManeuver;
|
||||
private final Maneuver nextManeuver;
|
||||
private Wind wind;
|
||||
|
||||
public ManeuverWithContext(HasTrackedLegOfCompetitorContext trackedLegOfCompetitor, Maneuver maneuver,
|
||||
boolean mainCurveAnalysis, Maneuver previousManeuver, Maneuver nextManeuver) {
|
||||
@@ -72,6 +73,16 @@ public class ManeuverWithContext implements HasManeuverContext {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Wind getWindInternal() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindInternal(Wind wind) {
|
||||
this.wind = wind;
|
||||
}
|
||||
|
||||
public TimePoint getTimePointBeforeForAnalysis() {
|
||||
return timePointBeforeForAnalysis;
|
||||
}
|
||||
|
||||
+12
@@ -5,6 +5,7 @@ import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Waypoint;
|
||||
import com.sap.sailing.domain.common.NauticalSide;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.tracking.Maneuver;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
@@ -20,6 +21,7 @@ public class MarkPassingWithContext implements HasMarkPassingContext {
|
||||
|
||||
private Double absoluteRank;
|
||||
private boolean rankHasBeenInitialized;
|
||||
private Wind wind;
|
||||
|
||||
public MarkPassingWithContext(HasTrackedLegOfCompetitorContext trackedLegOfCompetitor, Maneuver markPassingManeuver) {
|
||||
this.trackedLegOfCompetitor = trackedLegOfCompetitor;
|
||||
@@ -51,6 +53,16 @@ public class MarkPassingWithContext implements HasMarkPassingContext {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Wind getWindInternal() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindInternal(Wind wind) {
|
||||
this.wind = wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext() {
|
||||
return trackedLegOfCompetitor;
|
||||
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.AbstractHasTrackedLegSliceOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.TerminalHasTrackedLegSliceOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
/**
|
||||
* Abstract base class of those tracked legs of competitor in Data Mining that are returned as terminal
|
||||
* objects of a retriever chain and are not extended for a drill-down to more fine-grained objects. This
|
||||
* allows us to specify average wind, position and time point data for the competitor's leg and not duplicate
|
||||
* those dimensions for subordinate fine-grained objects such as GPS fixes or maneuvers.
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public abstract class TerminalAbstractTrackedLegSliceOfCompetitorWithContext extends
|
||||
AbstractTrackedLegSliceOfCompetitorWithContext implements TerminalHasTrackedLegSliceOfCompetitorContext {
|
||||
|
||||
private static final long serialVersionUID = 8362729373776291159L;
|
||||
private Wind wind;
|
||||
|
||||
public TerminalAbstractTrackedLegSliceOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor, TackTypeSegmentsDataMiningSettings settings, int sliceNumber) {
|
||||
super(trackedLegContext, trackedLegOfCompetitor, settings, sliceNumber);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractHasTrackedLegSliceOfCompetitorContext getTrackedLegOfCompetitorContext() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Wind getWindInternal() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindInternal(Wind wind) {
|
||||
this.wind = wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Position getPosition() {
|
||||
final TrackedLeg trackedLeg = getTrackedLegContext().getTrackedLeg();
|
||||
final TrackedRace trackedRace = trackedLeg.getTrackedRace();
|
||||
final TimePoint timepoint = getTimePointBetweenLegSliceStartAndLegFinish(trackedRace);
|
||||
final Position result;
|
||||
if (timepoint == null) {
|
||||
result = null;
|
||||
} else {
|
||||
result = trackedLeg.getMiddleOfLeg(timepoint);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
-2
@@ -14,8 +14,6 @@ import com.sap.sse.common.TimePoint;
|
||||
* special case of the entire leg. Start and finish times of this "slice" equal the start/finish times of the competitor in the leg.
|
||||
*/
|
||||
public class TrackedLegOfCompetitorWithContext extends AbstractTrackedLegSliceOfCompetitorWithContext implements HasTrackedLegOfCompetitorContext {
|
||||
private static final long serialVersionUID = 5944904146286262768L;
|
||||
|
||||
public TrackedLegOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor, TackTypeSegmentsDataMiningSettings settings) {
|
||||
super(trackedLegContext, trackedLegOfCompetitor, settings, 1);
|
||||
}
|
||||
|
||||
-76
@@ -1,76 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
/**
|
||||
* While a {@link TrackedLegOfCompetitorWithContext} considers as the time point for various calculations such as for
|
||||
* {@link #getTack()} the middle of the leg, or for time ranges the entire duration of the leg, this subtype focuses the
|
||||
* calculations to a specific time point that is assumed to be within the leg, such as the time point of a single
|
||||
* specific GPS fix or a maneuver. Values calculated for the leg's entire time range will instead be calculated from the
|
||||
* leg's start to the time point specified for this object here.
|
||||
* <p>
|
||||
*
|
||||
* Equality is based on the {@link #getTrackedLegOfCompetitor() tracked leg of the competitor} and the
|
||||
* {@link #getTimePoint() time point}.
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public class TrackedLegOfCompetitorWithSpecificTimePointWithContext extends TrackedLegOfCompetitorWithContext {
|
||||
private static final long serialVersionUID = -6512942220185977262L;
|
||||
private final TimePoint timePoint;
|
||||
|
||||
public TrackedLegOfCompetitorWithSpecificTimePointWithContext(HasTrackedLegContext trackedLegContext,
|
||||
TrackedLegOfCompetitor trackedLegOfCompetitor, TimePoint timePoint) {
|
||||
super(trackedLegContext, trackedLegOfCompetitor, TackTypeSegmentsDataMiningSettings.createDefaultSettings());
|
||||
this.timePoint = timePoint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((timePoint == null) ? 0 : timePoint.hashCode());
|
||||
result = prime * result + ((getTrackedLegOfCompetitor() == null) ? 0 : getTrackedLegOfCompetitor().hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
TrackedLegOfCompetitorWithSpecificTimePointWithContext other = (TrackedLegOfCompetitorWithSpecificTimePointWithContext) obj;
|
||||
if (timePoint == null) {
|
||||
if (other.timePoint != null)
|
||||
return false;
|
||||
} else if (!timePoint.equals(other.timePoint))
|
||||
return false;
|
||||
if (getTrackedLegOfCompetitor() == null) {
|
||||
if (other.getTrackedLegOfCompetitor() != null)
|
||||
return false;
|
||||
} else if (!getTrackedLegOfCompetitor().equals(other.getTrackedLegOfCompetitor()))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <R> R getSomethingForLegTrackingInterval(BiFunction<TimePoint, TimePoint, R> resultSupplier) {
|
||||
final TimePoint startTime = getTrackedLegOfCompetitor().getStartTime();
|
||||
final TimePoint finishTime = getTimePoint();
|
||||
return getSomethingForInterval(resultSupplier, startTime, finishTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimePoint getTimePoint() {
|
||||
return timePoint;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@ import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
* harder to implement because we would need to find out iteratively, between which fixes the competitor sailed, say, one tenth of the
|
||||
* windward distance in the leg.
|
||||
*/
|
||||
public class TrackedLegSliceOfCompetitorWithContext extends AbstractTrackedLegSliceOfCompetitorWithContext implements HasTrackedLegSliceOfCompetitorContext {
|
||||
public class TrackedLegSliceOfCompetitorWithContext extends TerminalAbstractTrackedLegSliceOfCompetitorWithContext implements HasTrackedLegSliceOfCompetitorContext {
|
||||
private static final long serialVersionUID = -8116119441445200029L;
|
||||
|
||||
public TrackedLegSliceOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor, TackTypeSegmentsDataMiningSettings settings, int sliceNumber) {
|
||||
|
||||
Reference in New Issue
Block a user