bug6092: interims commit, compilable but not done yet

This commit is contained in:
Axel Uhl
2025-02-12 17:10:50 +01:00
parent 87df39491e
commit c86ac61794
21 changed files with 182 additions and 156 deletions
@@ -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() {
@@ -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;
@@ -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();
@@ -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();
@@ -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();
@@ -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
*/
@@ -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()));
@@ -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();
}
}
@@ -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 {
@@ -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);
}
}
@@ -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);
@@ -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) {
@@ -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();
@@ -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();
}
@@ -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();
}
@@ -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;
}
@@ -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;
@@ -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;
}
}
@@ -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);
}
@@ -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;
}
}
@@ -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) {