Merge branch 'master' into bug5232

# Conflicts:
#	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
#	java/com.sap.sailing.www/release_notes_admin.html
This commit is contained in:
Georg Herdt
2020-07-03 10:53:00 +02:00
32 changed files with 615 additions and 95 deletions
@@ -487,6 +487,19 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
}
}
}
// replace null values of Regatta specific competitor handicap values with the respective competitor's
// default values
for (LeaderboardRowDTO row : rows.values()) {
if(row != null) {
if (row.effectiveTimeOnDistanceAllowancePerNauticalMile == null) {
row.effectiveTimeOnDistanceAllowancePerNauticalMile = row.competitor
.getTimeOnDistanceAllowancePerNauticalMile();
}
if (row.effectiveTimeOnTimeFactor == null) {
row.effectiveTimeOnTimeFactor = row.competitor.getTimeOnTimeFactor();
}
}
}
}
}
@@ -598,16 +611,27 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
// now clone the rows map to enable stripping the LeaderboardEntryDTOs inside
HashMap<CompetitorDTO, LeaderboardRowDTO> newRows = new HashMap<>();
for (Map.Entry<CompetitorDTO, LeaderboardRowDTO> competitorAndRow : rows.entrySet()) {
LeaderboardRowDTO previousRowDTO = previousVersion.rows.get(competitorAndRow.getKey());
final CompetitorDTO competitorDTO = competitorAndRow.getKey();
final LeaderboardRowDTO previousRowDTO = previousVersion.rows.get(competitorDTO);
if (Util.equalsWithNull(competitorAndRow.getValue(), previousRowDTO)
// can only compress for competitors that existed in the previous version
&& previousVersion.competitors.contains(competitorAndRow.getKey())) {
entireRowUnchanged(previousVersion, competitorAndRow.getKey());
// And don't enter into newRows. Mark all entries and all leg details in this row as unchanged for compaction of those structures:
// And don't enter into newRows. Mark all entries and all leg details in this row as unchanged for
// compaction of those structures:
} else {
LeaderboardRowDTO newRowDTO = new LeaderboardRowDTO();
cloner.clone(competitorAndRow.getValue(), newRowDTO);
CompetitorDTO compactCompetitor = compactCompetitorMap.get(competitorAndRow.getKey());
// if the Regatta specific competitor handicap values are equal to the competitor's default values they
// do not need to be transfered reduntantly
if (newRowDTO.effectiveTimeOnDistanceAllowancePerNauticalMile != null && newRowDTO.effectiveTimeOnDistanceAllowancePerNauticalMile
.equals(competitorDTO.getTimeOnDistanceAllowancePerNauticalMile())) {
newRowDTO.effectiveTimeOnDistanceAllowancePerNauticalMile = null;
}
if (newRowDTO.effectiveTimeOnTimeFactor != null && newRowDTO.effectiveTimeOnTimeFactor.equals(competitorDTO.getTimeOnTimeFactor())) {
newRowDTO.effectiveTimeOnTimeFactor = null;
}
CompetitorDTO compactCompetitor = compactCompetitorMap.get(competitorDTO);
newRowDTO.competitor = compactCompetitor;
newRows.put(compactCompetitor, newRowDTO);
HashMap<String, LeaderboardEntryDTO> newFieldsByRaceColumnName = new HashMap<String, LeaderboardEntryDTO>();
@@ -619,12 +643,12 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
if (previousEntryDTO != null
&& Util.equalsWithNull(raceColumnNameAndLeaderboardEntry.getValue(), previousEntryDTO)
// can only compress for competitors that existed in the previous version
&& previousVersion.competitors.contains(competitorAndRow.getKey())) {
getUnchangedLeaderboardEntries(previousVersion).unchanged(competitorAndRow.getKey(),
&& previousVersion.competitors.contains(competitorDTO)) {
getUnchangedLeaderboardEntries(previousVersion).unchanged(competitorDTO,
raceColumnNameAndLeaderboardEntry.getKey());
// also mark all leg details for the competitor for this column as unchanged; this will ensure
// that column compression can work for leg details
getLegDetailsUnchanged(previousVersion).unchanged(competitorAndRow.getKey(),
getLegDetailsUnchanged(previousVersion).unchanged(competitorDTO,
new com.sap.sse.common.Util.Pair<String, Integer>(raceColumnNameAndLeaderboardEntry.getKey(), null));
} else {
LeaderboardEntryDTO newLeaderboardEntryDTO = new LeaderboardEntryDTO();
@@ -643,9 +667,9 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
&& Util.equalsWithNull(legDetails,
previousEntryDTO.legDetails.get(legDetailsIndex))
// can only compress for competitors that existed in the previous version
&& previousVersion.competitors.contains(competitorAndRow.getKey())) {
&& previousVersion.competitors.contains(competitorDTO)) {
getLegDetailsUnchanged(previousVersion).unchanged(
competitorAndRow.getKey(),
competitorDTO,
new com.sap.sse.common.Util.Pair<String, Integer>(raceColumnNameAndLeaderboardEntry.getKey(),
legDetailsIndex));
newLeaderboardEntryDTO.legDetails.set(legDetailsIndex, null);
@@ -654,12 +678,12 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
} else {
if ((previousEntryDTO == null || previousEntryDTO.legDetails == null)
// can only compress for competitors that existed in the previous version
&& previousVersion.competitors.contains(competitorAndRow.getKey())) {
&& previousVersion.competitors.contains(competitorDTO)) {
// old and new entry are null; no need to set the legDetails in the new version to null
// as it already consumes no space;
// however, mark the legDetails as unchanged in legDetailsUnchanged so as to allow for
// all-column compression
getLegDetailsUnchanged(previousVersion).unchanged(competitorAndRow.getKey(),
getLegDetailsUnchanged(previousVersion).unchanged(competitorDTO,
new com.sap.sse.common.Util.Pair<String, Integer>(raceColumnNameAndLeaderboardEntry.getKey(), null));
}
}
@@ -30,24 +30,29 @@ public class LeaderboardRowDTO implements Serializable {
public Double totalDurationFoiledInSeconds;
public Double totalDistanceFoiledInMeters;
public Integer totalScoredRaces;
public Double effectiveTimeOnTimeFactor;
public Duration effectiveTimeOnDistanceAllowancePerNauticalMile;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((boat == null) ? 0 : boat.hashCode());
result = prime * result + ((carriedPoints == null) ? 0 : carriedPoints.hashCode());
result = prime * result + ((competitor == null) ? 0 : competitor.hashCode());
result = prime * result + ((boat == null) ? 0 : boat.hashCode());
result = prime * result + ((fieldsByRaceColumnName == null) ? 0 : fieldsByRaceColumnName.hashCode());
result = prime * result
+ ((maximumSpeedOverGroundInKnots == null) ? 0 : maximumSpeedOverGroundInKnots.hashCode());
result = prime * result + ((netPoints == null) ? 0 : netPoints.hashCode());
result = prime * result + ((effectiveTimeOnDistanceAllowancePerNauticalMile == null) ? 0
: effectiveTimeOnDistanceAllowancePerNauticalMile.hashCode());
result = prime * result + ((effectiveTimeOnTimeFactor == null) ? 0 : effectiveTimeOnTimeFactor.hashCode());
result = prime * result + ((totalDistanceFoiledInMeters == null) ? 0 : totalDistanceFoiledInMeters.hashCode());
result = prime * result
+ ((totalDistanceTraveledInMeters == null) ? 0 : totalDistanceTraveledInMeters.hashCode());
result = prime * result
+ ((totalDurationFoiledInSeconds == null) ? 0 : totalDurationFoiledInSeconds.hashCode());
result = prime * result
+ ((totalDistanceFoiledInMeters == null) ? 0 : totalDistanceFoiledInMeters.hashCode());
result = prime * result + ((netPoints == null) ? 0 : netPoints.hashCode());
result = prime * result + ((totalScoredRaces == null) ? 0 : totalScoredRaces.hashCode());
result = prime * result
+ ((totalTimeSailedDownwindInSeconds == null) ? 0 : totalTimeSailedDownwindInSeconds.hashCode());
result = prime * result + ((totalTimeSailedInSeconds == null) ? 0 : totalTimeSailedInSeconds.hashCode());
@@ -55,13 +60,11 @@ public class LeaderboardRowDTO implements Serializable {
+ ((totalTimeSailedReachingInSeconds == null) ? 0 : totalTimeSailedReachingInSeconds.hashCode());
result = prime * result
+ ((totalTimeSailedUpwindInSeconds == null) ? 0 : totalTimeSailedUpwindInSeconds.hashCode());
result = prime
* result
+ ((whenMaximumSpeedOverGroundWasAchieved == null) ? 0 : whenMaximumSpeedOverGroundWasAchieved
.hashCode());
result = prime * result + ((whenMaximumSpeedOverGroundWasAchieved == null) ? 0
: whenMaximumSpeedOverGroundWasAchieved.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
@@ -71,6 +74,11 @@ public class LeaderboardRowDTO implements Serializable {
if (getClass() != obj.getClass())
return false;
LeaderboardRowDTO other = (LeaderboardRowDTO) obj;
if (boat == null) {
if (other.boat != null)
return false;
} else if (!boat.equals(other.boat))
return false;
if (carriedPoints == null) {
if (other.carriedPoints != null)
return false;
@@ -81,11 +89,6 @@ public class LeaderboardRowDTO implements Serializable {
return false;
} else if (!competitor.equals(other.competitor))
return false;
if (boat == null) {
if (other.boat != null)
return false;
} else if (!boat.equals(other.boat))
return false;
if (fieldsByRaceColumnName == null) {
if (other.fieldsByRaceColumnName != null)
return false;
@@ -96,6 +99,26 @@ public class LeaderboardRowDTO implements Serializable {
return false;
} else if (!maximumSpeedOverGroundInKnots.equals(other.maximumSpeedOverGroundInKnots))
return false;
if (netPoints == null) {
if (other.netPoints != null)
return false;
} else if (!netPoints.equals(other.netPoints))
return false;
if (effectiveTimeOnDistanceAllowancePerNauticalMile == null) {
if (other.effectiveTimeOnDistanceAllowancePerNauticalMile != null)
return false;
} else if (!effectiveTimeOnDistanceAllowancePerNauticalMile.equals(other.effectiveTimeOnDistanceAllowancePerNauticalMile))
return false;
if (effectiveTimeOnTimeFactor == null) {
if (other.effectiveTimeOnTimeFactor != null)
return false;
} else if (!effectiveTimeOnTimeFactor.equals(other.effectiveTimeOnTimeFactor))
return false;
if (totalDistanceFoiledInMeters == null) {
if (other.totalDistanceFoiledInMeters != null)
return false;
} else if (!totalDistanceFoiledInMeters.equals(other.totalDistanceFoiledInMeters))
return false;
if (totalDistanceTraveledInMeters == null) {
if (other.totalDistanceTraveledInMeters != null)
return false;
@@ -106,15 +129,10 @@ public class LeaderboardRowDTO implements Serializable {
return false;
} else if (!totalDurationFoiledInSeconds.equals(other.totalDurationFoiledInSeconds))
return false;
if (totalDistanceFoiledInMeters == null) {
if (other.totalDistanceFoiledInMeters != null)
if (totalScoredRaces == null) {
if (other.totalScoredRaces != null)
return false;
} else if (!totalDistanceFoiledInMeters.equals(other.totalDistanceFoiledInMeters))
return false;
if (netPoints == null) {
if (other.netPoints != null)
return false;
} else if (!netPoints.equals(other.netPoints))
} else if (!totalScoredRaces.equals(other.totalScoredRaces))
return false;
if (totalTimeSailedDownwindInSeconds == null) {
if (other.totalTimeSailedDownwindInSeconds != null)
@@ -143,7 +161,7 @@ public class LeaderboardRowDTO implements Serializable {
return false;
return true;
}
public Distance getDistanceTraveled(String raceColumnName) {
final Distance result;
LeaderboardEntryDTO fieldsForRace = fieldsByRaceColumnName.get(raceColumnName);
@@ -50,7 +50,9 @@ public class ORCPerformanceCurveCourseImpl implements ORCPerformanceCurveCourse
}
resultLegs.add(potentiallyReplacedLeg);
}
resultLegs.add(lastFinishedLeg.scale(shareOfCurrentLeg));
if (shareOfCurrentLeg > 0) {
resultLegs.add(lastFinishedLeg.scale(shareOfCurrentLeg));
}
return new ORCPerformanceCurveCourseImpl(resultLegs);
}
}