From 9a3eb7def0cbbc6d3291f251eea0e2258709f120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Wed, 18 Jul 2018 12:37:12 +0200 Subject: [PATCH 1/3] bug4661 use central point of code to determine if a race counts as won --- .../data/RaceResultOfCompetitorWithContext.java | 9 +-------- .../sailing/domain/leaderboard/Leaderboard.java | 15 ++++++++++++++- .../sailing/domain/leaderboard/ScoringScheme.java | 4 ---- .../leaderboard/impl/AbstractLeaderboardImpl.java | 2 +- .../impl/AbstractSimpleLeaderboardImpl.java | 2 ++ .../impl/LeaderboardTotalRankComparator.java | 4 ++-- .../impl/LowPointFirstToWinTwoRaces.java | 10 ---------- 7 files changed, 20 insertions(+), 26 deletions(-) mode change 100755 => 100644 java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceResultOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceResultOfCompetitorWithContext.java index f0e7b4a0831..3648c6802b7 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceResultOfCompetitorWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceResultOfCompetitorWithContext.java @@ -209,15 +209,8 @@ public class RaceResultOfCompetitorWithContext implements HasRaceResultOfCompeti @Override public Boolean isWin() { - Leaderboard leaderboard = getLeaderboard(); final TimePoint now = MillisecondsTimePoint.now(); - double points = leaderboard.getTotalPoints(competitor, raceColumn, now); - if (leaderboard.getScoringScheme().isHigherBetter()) { - double competitorCount = Util.size(leaderboard.getCompetitors()); - return points >= (competitorCount - 0.05); - } else { - return points <= 1.05; - } + return getLeaderboard().isWin(competitor, raceColumn, now); } } 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 098bdb90cf9..a59850784c3 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 @@ -604,4 +604,17 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns { * leaderboard. */ boolean hasScores(Competitor competitor, TimePoint timePoint); -} + + default boolean isWin(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { + Double points = getTotalPoints(competitor, raceColumn, timePoint); + if(points == null) { + return false; + } + if (getScoringScheme().isHigherBetter()) { + double competitorCount = Util.size(getCompetitors()); + return points >= (competitorCount - 0.05); + } else { + return points <= 1.05; + } + } +} \ No newline at end of file diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java index 7781bc88e1c..6ae47a1cd3c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java @@ -155,10 +155,6 @@ public interface ScoringScheme extends Serializable { throw new IllegalStateException("This call is not valid for this scoringSheme"); } - default boolean doesCountAsWinInMedalRace(Double o1Score, RaceColumn raceColumn) { - throw new IllegalStateException("This call is not valid for this scoringSheme"); - } - /** * Usually, the scores in each leaderboard column count as they are for the overall score. However, if a column is a * medal race column it usually counts double. Under certain circumstances, columns may also count with factors diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java old mode 100755 new mode 100644 index a49dc0d95bd..c2d8203bbb5 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -281,5 +281,5 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI RegattaLogBoatDeregistrator deregisterer = new RegattaLogBoatDeregistrator<>(regattaLog, boats, regattaLogEventAuthorForAbstractLeaderboard); deregisterer.deregister(deregisterer.analyze()); } - + } 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 572042110c2..992edf20d05 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 @@ -959,5 +959,7 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW return Util.getDominantObject(StreamSupport.stream(allBoats.spliterator(), /* parallel */ false) .map(b -> b.getBoatClass()).collect(Collectors.toList())); } + + } 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 bb3f59f37ed..abc78af606e 100755 --- 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 @@ -196,8 +196,8 @@ public class LeaderboardTotalRankComparator implements Comparator { // (tracked or manual) is sufficient preemptiveColumnResult = compareByMedalRaceParticipation(o1Score, o2Score); if (scoringScheme.isMedalWinAmountCriteria()) { - numberOfMedalRacesWonO1 += scoringScheme.doesCountAsWinInMedalRace(o1Score, raceColumn) ? 1 : 0; - numberOfMedalRacesWonO2 += scoringScheme.doesCountAsWinInMedalRace(o2Score, raceColumn) ? 1 : 0; + numberOfMedalRacesWonO1 += leaderboard.isWin(o1, raceColumn, timePoint) ? 1 : 0; + numberOfMedalRacesWonO2 += leaderboard.isWin(o2, raceColumn, timePoint) ? 1 : 0; } } if (preemptiveColumnResult == 0 && raceColumn.isTotalOrderDefinedByFleet()) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java index ea527082bf4..055b9e5c2e3 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java @@ -31,16 +31,6 @@ public class LowPointFirstToWinTwoRaces extends LowPoint { return 2; } - @Override - public boolean doesCountAsWinInMedalRace(Double score, RaceColumn raceColumn) { - if(score != null) { - double minScore = 1 * getScoreFactor(raceColumn); - return score == minScore; - } else { - return false; - } - } - @Override public double getScoreFactor(RaceColumn a) { Double factor = a.getExplicitFactor(); From 0b61a4c5dd590d8fb766589cec784a9f2cafe30f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Wed, 18 Jul 2018 12:49:54 +0200 Subject: [PATCH 2/3] bug4661 added javadocs --- .../src/com/sap/sailing/domain/leaderboard/Leaderboard.java | 4 ++++ .../com/sap/sailing/domain/leaderboard/ScoringScheme.java | 4 ++++ .../domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java | 5 +++++ 3 files changed, 13 insertions(+) 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 a59850784c3..19779becfd5 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 @@ -605,6 +605,10 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns { */ boolean hasScores(Competitor competitor, TimePoint timePoint); + /** + * Returns true if a racecolumn evaluates to be a win for the given competitor at the given timepoint. + * If the competitor is not scored for this race, false is returned + */ default boolean isWin(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { Double points = getTotalPoints(competitor, raceColumn, timePoint); if(points == null) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java index 6ae47a1cd3c..e7b5aafa825 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java @@ -151,6 +151,10 @@ public interface ScoringScheme extends Serializable { return false; } + /** + * If isMedalWinAmountCriteria returns true, this will be the amount of races that must be won, in order to win the + * medal series instantly + */ default int getTargetAmountOfMedalRaceWins() { throw new IllegalStateException("This call is not valid for this scoringSheme"); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java index 055b9e5c2e3..c567761f5ab 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinTwoRaces.java @@ -3,6 +3,11 @@ package com.sap.sailing.domain.leaderboard.impl; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.common.ScoringSchemeType; +/** + * This class is a derivation of the LowPointScoring scheme. The first participant in the medal series, that wins two + * races is ranked as the first. The participant that has the score 1 in the preSeries carry column only must reach one + * additional victory. This Scheme will change the default scoring factor for medal races to 1, usually 2 is used + */ public class LowPointFirstToWinTwoRaces extends LowPoint { private static final long serialVersionUID = 7072175334160798617L; From 5efe0ee7d7c59d21cfc8a9d0707a95630d950625 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 18 Jul 2018 12:52:29 +0200 Subject: [PATCH 3/3] Bug 4661: Added JavaDocs --- .../leaderboard/impl/LeaderboardTotalRankComparator.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 abc78af606e..046a45db260 100755 --- 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 @@ -261,6 +261,11 @@ public class LeaderboardTotalRankComparator implements Comparator { return result; } + /** + * Compares by the number of races won in the medal series. If one of the competitors reached the target of won + * races (defined by {@link ScoringScheme#getTargetAmountOfMedalRaceWins()} he is ranked better than the other. If + * none of the competitors reached the target, they are ranked equally even if one has more wins. + */ private int compareByMedalRacesWon(int numberOfMedalRacesWonO1, int numberOfMedalRacesWonO2) { int targetAmount = scoringScheme.getTargetAmountOfMedalRaceWins(); // if one reaches the targetamount, this has priority, else proceed with normal low points scoring (eg. not @@ -274,6 +279,10 @@ public class LeaderboardTotalRankComparator implements Comparator { return 0; } + /** + * Compares by the scores of a single race column. If only one of the competitors has a result this competitor is + * ranked better than the other one. + */ private int compareBySingleRaceColumnScore(Double o1CarryForwardInMedals, Double o2CarryForwardInMedals) { if (o1CarryForwardInMedals == null && o2CarryForwardInMedals == null) { return 0;