From c2e66b24e48a699d9c7c3d4b31f119d28df70b07 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 11 Aug 2019 14:54:55 -0600 Subject: [PATCH] performance improvement by re-using total points calculation for net points in comparator Change-Id: I92a0fdf5270414d05465fbb3a6101e11dc736a3b --- .../sap/sailing/domain/leaderboard/Leaderboard.java | 10 ++++++++++ .../impl/AbstractSimpleLeaderboardImpl.java | 9 ++++++++- .../impl/LeaderboardTotalRankComparator.java | 6 ++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java index 01b3ed75872..5e4366997d0 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java @@ -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 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 discardedRaceColumns, Supplier totalPointsProvider); + TimePoint getNowMinusDelay(); /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java index 8185529a029..e1c2add400f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java @@ -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 discardedRaceColumns) { + return getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns, ()->getTotalPoints(competitor, raceColumn, timePoint)); + } + + @Override + public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint, + Set discardedRaceColumns, Supplier 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 { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java index 3b79eee114d..377cfbe0fd1 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java @@ -94,8 +94,10 @@ public class LeaderboardTotalRankComparator implements Comparator { this.discardedRaceColumnsPerCompetitor.put(competitor, discardedRaceColumns); for (RaceColumn raceColumn : raceColumnsToConsider) { Pair key = new Util.Pair(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); } } }