performance improvement by re-using total points calculation for net points in comparator

Change-Id: I92a0fdf5270414d05465fbb3a6101e11dc736a3b
This commit is contained in:
Axel Uhl committed 2019-08-11 14:54:55 -06:00
1 parent a20495553c
commit c2e66b24e4
3 files changed
+22 -3

No files matched your search

@@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
@@ -539,6 +540,15 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns {
Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint,
Set<RaceColumn> discardedRaceColumns);
/**
* Same as {@link #getNetPoints(Competitor, RaceColumn, TimePoint, Set)}, only that a supplier for
* the total points for the {@code competitor} in column {@code raceColumn} at time point {@code timePoint}
* is provided. This helps if a caller also needs to determine the total points anyway, saving redundant
* calculations.
*/
Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint,
Set<RaceColumn> discardedRaceColumns, Supplier<Double> totalPointsProvider);
TimePoint getNowMinusDelay();
/**
@@ -13,6 +13,7 @@ import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@@ -466,11 +467,17 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW
@Override
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint,
Set<RaceColumn> discardedRaceColumns) {
return getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns, ()->getTotalPoints(competitor, raceColumn, timePoint));
}
@Override
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint,
Set<RaceColumn> discardedRaceColumns, Supplier<Double> totalPointsProvider) {
Double result;
if (isDiscarded(competitor, raceColumn, timePoint, discardedRaceColumns)) {
result = 0.0;
} else {
final Double totalPoints = getTotalPoints(competitor, raceColumn, timePoint);
final Double totalPoints = totalPointsProvider.get();
if (totalPoints == null) {
result = null;
} else {
@@ -94,8 +94,10 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> {
this.discardedRaceColumnsPerCompetitor.put(competitor, discardedRaceColumns);
for (RaceColumn raceColumn : raceColumnsToConsider) {
Pair<Competitor, RaceColumn> key = new Util.Pair<Competitor, RaceColumn>(competitor, raceColumn);
netPointsCache.put(key, leaderboard.getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns));
totalPointsCache.put(key, leaderboard.getTotalPoints(competitor, raceColumn, timePoint));
final Double totalPoints = leaderboard.getTotalPoints(competitor, raceColumn, timePoint);
netPointsCache.put(key, leaderboard.getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns,
/* total points provider */ ()->totalPoints));
totalPointsCache.put(key, totalPoints);
}
}
}