From 822aff3194878f0c4503763b46bb3e19e628724d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 23 Sep 2013 16:11:44 +0200 Subject: [PATCH 01/96] started work on bug 655 by adding TimePoint argument to isScoreCorrected API --- .../persistence/impl/MongoObjectFactoryImpl.java | 5 ++++- .../domain/leaderboard/ScoreCorrection.java | 5 +++-- .../leaderboard/SettableScoreCorrection.java | 2 +- .../impl/AbstractSimpleLeaderboardImpl.java | 2 +- .../leaderboard/impl/ScoreCorrectionImpl.java | 6 +++--- .../TestStoringAndRetrievingLeaderboards.java | 16 ++++++++-------- .../LeaderboardMasterDataJsonSerializer.java | 4 +++- .../gateway/impl/LeaderboardJsonGetServlet.java | 2 +- .../server/test/MasterDataImportTest.java | 2 +- .../UpdateLeaderboardMaxPointsReason.java | 2 +- .../UpdateLeaderboardScoreCorrection.java | 2 +- 11 files changed, 27 insertions(+), 21 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 540da2d9cee..fa3e77a851b 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -36,6 +36,7 @@ import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -280,11 +281,13 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { } private void storeScoreCorrections(Leaderboard leaderboard, BasicDBObject dbScoreCorrections) { + TimePoint now = MillisecondsTimePoint.now(); SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { BasicDBList dbCorrectionForRace = new BasicDBList(); for (Competitor competitor : leaderboard.getCompetitors()) { - if (scoreCorrection.isScoreCorrected(competitor, raceColumn)) { + // TODO bug 655: make score corrections time dependent + if (scoreCorrection.isScoreCorrected(competitor, raceColumn, now)) { BasicDBObject dbCorrectionForCompetitor = new BasicDBObject(); dbCorrectionForCompetitor.put(FieldNames.COMPETITOR_ID.name(), competitor.getId()); MaxPointsReason maxPointsReason = scoreCorrection.getMaxPointsReason(competitor, raceColumn); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java index f8e9926b2fc..b1d9c0995c9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java @@ -39,7 +39,7 @@ public interface ScoreCorrection extends Serializable { * and {@link MaxPointsReason#NONE} will be listed as the {@link Result#getMaxPointsReason() correction reason}. * Note, though, that {@link MaxPointsReason#NONE} can also be the reason for an explicit score correction, e.g., if * the tracking results were overruled by the jury. Clients may use - * {@link #isScoreCorrected(Competitor, TrackedRace)} to detect the difference. + * {@link #isScoreCorrected(Competitor, TrackedRace, TimePoint)} to detect the difference. * * @param numberOfCompetitorsFetcher * can determine the number of competitors to use as the basis for penalty score calculation @@ -53,11 +53,12 @@ public interface ScoreCorrection extends Serializable { * Should, for some reason, the uncorrected score change later, an existing score correction would still remain in * place whereas if no score correction exists for the competitor/race combination, the resulting score after * "correction" will still be the uncorrected value.

+ * @param timePoint TODO * * @return if an explicit score correction was made for the combination of competitor and * raceColumn */ - boolean isScoreCorrected(Competitor competitor, RaceColumn raceColumn); + boolean isScoreCorrected(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint); boolean hasCorrectionFor(RaceColumn raceInLeaderboard); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java index 736250540fe..8f2a605a6a4 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java @@ -14,7 +14,7 @@ public interface SettableScoreCorrection extends ScoreCorrection { * @param reason * if null, any existing max-points reason is removed; while * {@link #getMaxPointsReason(Competitor, RaceColumn)} will return {@link MaxPointsReason#NONE}, a - * call to {@link #isScoreCorrected(Competitor, RaceColumn)} will return false if no + * call to {@link #isScoreCorrected(Competitor, RaceColumn, TimePoint)} will return false if no * other explicit score correction was made for the competitor. */ void setMaxPointsReason(Competitor competitor, RaceColumn raceColumn, MaxPointsReason reason); 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 dcc1ccbd896..c645cff286a 100755 --- 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 @@ -615,7 +615,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race public boolean countRaceForComparisonWithDiscardingThresholds(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { TrackedRace trackedRaceForCompetitorInColumn; return getScoringScheme().isValidInTotalScore(this, raceColumn, timePoint) && - (getScoreCorrection().isScoreCorrected(competitor, raceColumn) || + (getScoreCorrection().isScoreCorrected(competitor, raceColumn, timePoint) || ((trackedRaceForCompetitorInColumn=raceColumn.getTrackedRace(competitor)) != null && trackedRaceForCompetitorInColumn.hasStarted(timePoint))); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index 2b434fac0b1..6e9b6870a0f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -135,7 +135,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { } @Override - public boolean isScoreCorrected(Competitor competitor, RaceColumn raceColumn) { + public boolean isScoreCorrected(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { Pair key = raceColumn.getKey(competitor); return correctedScores.containsKey(key) || maxPointsReasons.containsKey(key); } @@ -164,7 +164,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { */ @Override public Result getCorrectedScore(Callable trackedRankProvider, final Competitor competitor, - final RaceColumn raceColumn, TimePoint timePoint, NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher, + final RaceColumn raceColumn, final TimePoint timePoint, NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher, ScoringScheme scoringScheme) { Double result; final MaxPointsReason maxPointsReason = getMaxPointsReason(competitor, raceColumn); @@ -196,7 +196,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { @Override public boolean isCorrected() { - return isScoreCorrected(competitor, raceColumn); + return isScoreCorrected(competitor, raceColumn, timePoint); } }; } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java index 7a9c5ba94ed..5938c3be19b 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java @@ -200,9 +200,9 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, leaderboard.getFleet(null)); assertEquals(leaderboardName, loadedLeaderboard.getName()); - assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); + assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1, MillisecondsTimePoint.now())); assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.00000001); - assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2)); + assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2, MillisecondsTimePoint.now())); } @Test @@ -226,9 +226,9 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false, leaderboard.getFleet(null)); RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, leaderboard.getFleet(null)); assertEquals(leaderboardName, loadedLeaderboard.getName()); - assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); + assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1, MillisecondsTimePoint.now())); assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.00000001); - assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2)); + assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2, MillisecondsTimePoint.now())); } @Test @@ -254,8 +254,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, leaderboard.getFleet(null)); assertEquals(leaderboardName, loadedLeaderboard.getName()); - assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); - assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2)); + assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1, MillisecondsTimePoint.now())); + assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2, MillisecondsTimePoint.now())); assertEquals(maxPointsReason, loadedLeaderboard.getScoreCorrection().getMaxPointsReason(competitor, loadedColumn2)); } @@ -286,9 +286,9 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, leaderboard.getFleet(null)); assertEquals(leaderboardName, loadedLeaderboard.getName()); - assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); + assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1, MillisecondsTimePoint.now())); assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.000000001); - assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2)); + assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2, MillisecondsTimePoint.now())); assertEquals(maxPointsReason, loadedLeaderboard.getScoreCorrection().getMaxPointsReason(competitor, loadedColumn2)); } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java index e62a45885fa..11dec8ec737 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java @@ -11,6 +11,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; @@ -272,7 +273,8 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer(updatedEntry.getNetPoints(), updatedEntry.getTotalPoints(), isScoreCorrected); } else { throw new IllegalArgumentException("Didn't find competitor with ID "+competitorIdAsString+" in leaderboard "+getLeaderboardName()); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboardScoreCorrection.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboardScoreCorrection.java index 7319800c250..31c073f27e0 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboardScoreCorrection.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboardScoreCorrection.java @@ -56,7 +56,7 @@ public class UpdateLeaderboardScoreCorrection extends AbstractLeaderboardColumnO newNetPoints = correctedScore; } newTotalPoints = leaderboard.getEntry(competitor, raceColumn, timePoint).getTotalPoints(); - isScoreCorrected = leaderboard.getScoreCorrection().isScoreCorrected(competitor, raceColumn); + isScoreCorrected = leaderboard.getScoreCorrection().isScoreCorrected(competitor, raceColumn, timePoint); } else { throw new IllegalArgumentException("Didn't find competitor with ID "+competitorIdAsString+" in leaderboard "+getLeaderboardName()); } From cce1c54d5e1484cc42f439712a20441302a0a20e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 23 Sep 2013 17:28:46 +0200 Subject: [PATCH 02/96] factored a TimePoint parameter into ScoreCorrection.getMaxPointsReason(...) as well --- .../impl/MongoObjectFactoryImpl.java | 2 +- .../domain/leaderboard/ScoreCorrection.java | 41 +++++++++++++++++-- .../leaderboard/SettableScoreCorrection.java | 7 +--- .../impl/AbstractLeaderboardImpl.java | 2 +- .../impl/AbstractSimpleLeaderboardImpl.java | 2 +- .../leaderboard/impl/ScoreCorrectionImpl.java | 13 ++++-- ...estStoringAndLoadingEventsAndRegattas.java | 2 +- .../TestStoringAndRetrievingLeaderboards.java | 4 +- .../LeaderboardMasterDataJsonSerializer.java | 5 ++- .../server/test/MasterDataImportTest.java | 4 +- 10 files changed, 59 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index fa3e77a851b..16a2d20eb50 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -290,7 +290,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { if (scoreCorrection.isScoreCorrected(competitor, raceColumn, now)) { BasicDBObject dbCorrectionForCompetitor = new BasicDBObject(); dbCorrectionForCompetitor.put(FieldNames.COMPETITOR_ID.name(), competitor.getId()); - MaxPointsReason maxPointsReason = scoreCorrection.getMaxPointsReason(competitor, raceColumn); + MaxPointsReason maxPointsReason = scoreCorrection.getMaxPointsReason(competitor, raceColumn, now); if (maxPointsReason != MaxPointsReason.NONE) { dbCorrectionForCompetitor.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON.name(), maxPointsReason.name()); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java index b1d9c0995c9..38c8ef1d754 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java @@ -20,6 +20,12 @@ import com.sap.sailing.domain.tracking.TrackedRace; * */ public interface ScoreCorrection extends Serializable { + /** + * A score correction as valid at the time point specified with the query that produced this object. + * + * @author Axel Uhl (d043530) + * + */ public interface Result { /** * @return null in case there is no score attributed to the competitor for the race column in @@ -31,6 +37,11 @@ public interface ScoreCorrection extends Serializable { MaxPointsReason getMaxPointsReason(); boolean isCorrected(); + + /** + * @return the time point for which this result is valid + */ + TimePoint getTimePoint(); } /** @@ -41,25 +52,49 @@ public interface ScoreCorrection extends Serializable { * the tracking results were overruled by the jury. Clients may use * {@link #isScoreCorrected(Competitor, TrackedRace, TimePoint)} to detect the difference. * + * @param trackedRankProvider + * can provide the tracked rank if needed; will only be called if there is no score correction for the + * timePoint specified. + * @param timePoint + * the time point for which to get the corrected score; score corrections have a validity time interval. + * Only the last score correction valid at timePoint is considered. + * * @param numberOfCompetitorsFetcher * can determine the number of competitors to use as the basis for penalty score calculation * ("max points") if needed */ - Result getCorrectedScore(Callable trackedRank, Competitor competitor, RaceColumn raceColumn, + Result getCorrectedScore(Callable trackedRankProvider, Competitor competitor, RaceColumn raceColumn, TimePoint timePoint, NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsFetcher, ScoringScheme scoringScheme); + /** + * @param timePoint + * the time point at which the max points reason is to be valid + * + * @return a non-null result + */ + MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint); + /** * Note the difference between what this method does and a more naive comparison of uncorrected and corrected score. * Should, for some reason, the uncorrected score change later, an existing score correction would still remain in * place whereas if no score correction exists for the competitor/race combination, the resulting score after - * "correction" will still be the uncorrected value.

- * @param timePoint TODO + * "correction" will still be the uncorrected value. + *

+ * + * @param timePoint + * the time point for which to check whether the competitor's score was corrected at that time point; in + * other words, this method checks if there is a score correction for competitor in column + * raceColumn that is valid at timePoint. * * @return if an explicit score correction was made for the combination of competitor and * raceColumn */ boolean isScoreCorrected(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint); + /** + * Checks if this score correction object has any score corrections for any competitor valid at any time point for + * the race column specified by raceInLeaderboard. + */ boolean hasCorrectionFor(RaceColumn raceInLeaderboard); /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java index 8f2a605a6a4..732bf75467d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/SettableScoreCorrection.java @@ -13,17 +13,12 @@ public interface SettableScoreCorrection extends ScoreCorrection { /** * @param reason * if null, any existing max-points reason is removed; while - * {@link #getMaxPointsReason(Competitor, RaceColumn)} will return {@link MaxPointsReason#NONE}, a + * {@link #getMaxPointsReason(Competitor, RaceColumn, TimePoint)} will return {@link MaxPointsReason#NONE}, a * call to {@link #isScoreCorrected(Competitor, RaceColumn, TimePoint)} will return false if no * other explicit score correction was made for the competitor. */ void setMaxPointsReason(Competitor competitor, RaceColumn raceColumn, MaxPointsReason reason); - /** - * @return a non-null result - */ - MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn); - void correctScore(Competitor competitor, RaceColumn raceColumn, double points); /** 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 index 224a9e21d1c..7ad876d0bae 100755 --- 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 @@ -133,7 +133,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI Iterator ci = competitorsFromBestToWorst.iterator(); while (betterCompetitorRank < rank && ci.hasNext()) { Competitor betterTrackedCompetitor = ci.next(); - MaxPointsReason maxPointsReasonForBetterCompetitor = getScoreCorrection().getMaxPointsReason(betterTrackedCompetitor, raceColumn); + MaxPointsReason maxPointsReasonForBetterCompetitor = getScoreCorrection().getMaxPointsReason(betterTrackedCompetitor, raceColumn, timePoint); if (maxPointsReasonForBetterCompetitor != null && maxPointsReasonForBetterCompetitor != MaxPointsReason.NONE && maxPointsReasonForBetterCompetitor.isAdvanceCompetitorsTrackedWorse()) { correctedRank--; 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 c645cff286a..6f6f770f311 100755 --- 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 @@ -459,7 +459,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race @Override public MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { - return getScoreCorrection().getMaxPointsReason(competitor, raceColumn); + return getScoreCorrection().getMaxPointsReason(competitor, raceColumn, timePoint); } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index 6e9b6870a0f..99a4d2e6110 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -147,7 +147,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { } @Override - public MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn) { + public MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { MaxPointsReason result = maxPointsReasons.get(raceColumn.getKey(competitor)); if (result == null) { result = MaxPointsReason.NONE; @@ -156,7 +156,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { } /** - * If the {@link #getMaxPointsReason(Competitor, TrackedRace)} for the competitor for the + * If the {@link #getMaxPointsReason(Competitor, TrackedRace, TimePoint)} for the competitor for the * raceColumn's tracked race is not {@link MaxPointsReason#NONE}, the * {@link #getMaxPoints(TrackedRace) maximum score} is computed for the competitor. Otherwise, the * uncorrectedScore is returned. @@ -167,7 +167,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { final RaceColumn raceColumn, final TimePoint timePoint, NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher, ScoringScheme scoringScheme) { Double result; - final MaxPointsReason maxPointsReason = getMaxPointsReason(competitor, raceColumn); + final MaxPointsReason maxPointsReason = getMaxPointsReason(competitor, raceColumn, timePoint); if (maxPointsReason == MaxPointsReason.NONE) { result = getCorrectedNonMaxedScore(competitor, raceColumn, trackedRankProvider, scoringScheme, numberOfCompetitorsInLeaderboardFetcher); } else { @@ -196,7 +196,12 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { @Override public boolean isCorrected() { - return isScoreCorrected(competitor, raceColumn, timePoint); + return isScoreCorrected(competitor, raceColumn, getTimePoint()); + } + + @Override + public TimePoint getTimePoint() { + return timePoint; } }; } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java index 5223c642de0..35321662f18 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java @@ -224,7 +224,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest trackedRegatta[0] = new DynamicTrackedRegattaImpl(loadedRegatta); resForLoading.apply(new ConnectTrackedRaceToLeaderboardColumn(loadedLeaderboard.getName(), loadedQ2.getName(), loadedYellow .getName(), q2YellowTrackedRace.getRaceIdentifier())); - MaxPointsReason hassosLoadedMaxPointsReason = loadedLeaderboard.getScoreCorrection().getMaxPointsReason(hasso, loadedQ2); + MaxPointsReason hassosLoadedMaxPointsReason = loadedLeaderboard.getScoreCorrection().getMaxPointsReason(hasso, loadedQ2, MillisecondsTimePoint.now()); assertEquals(MaxPointsReason.DNF, hassosLoadedMaxPointsReason); } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java index 5938c3be19b..5dce5b40d64 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java @@ -256,7 +256,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { assertEquals(leaderboardName, loadedLeaderboard.getName()); assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1, MillisecondsTimePoint.now())); assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2, MillisecondsTimePoint.now())); - assertEquals(maxPointsReason, loadedLeaderboard.getScoreCorrection().getMaxPointsReason(competitor, loadedColumn2)); + assertEquals(maxPointsReason, loadedLeaderboard.getScoreCorrection().getMaxPointsReason(competitor, loadedColumn2, MillisecondsTimePoint.now())); } @Test @@ -289,7 +289,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1, MillisecondsTimePoint.now())); assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.000000001); assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2, MillisecondsTimePoint.now())); - assertEquals(maxPointsReason, loadedLeaderboard.getScoreCorrection().getMaxPointsReason(competitor, loadedColumn2)); + assertEquals(maxPointsReason, loadedLeaderboard.getScoreCorrection().getMaxPointsReason(competitor, loadedColumn2, MillisecondsTimePoint.now())); } private Competitor createCompetitor() { diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java index 11dec8ec737..2ac3f15a576 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/masterdata/impl/LeaderboardMasterDataJsonSerializer.java @@ -274,12 +274,13 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer Date: Tue, 24 Sep 2013 08:48:58 +0200 Subject: [PATCH 03/96] refactored creation of ScoreCorrectionImpl and subclass instances so that it happens in leaderboard constructors; Prepares for the linking of the score correction object back to its leaderboard in the score correction's constructor. This will allow for the detection of race column ordering and hence the default application of score corrections depending on time point if there are tracked races before or after that time point for a given competitor. --- .../impl/DomainObjectFactoryImpl.java | 16 +-- .../test/LeaderboardForKielWeekTest.java | 5 +- .../domain/test/LeaderboardOfflineTest.java | 25 ++-- .../LeaderboardScoringAndRankingTest.java | 16 +-- .../test/RaceLogAttachOnTrackedRaceTest.java | 4 +- .../impl/AbstractLeaderboardImpl.java | 8 +- .../impl/AbstractSimpleLeaderboardImpl.java | 13 +- .../impl/FlexibleLeaderboardImpl.java | 13 +- .../impl/RegattaLeaderboardImpl.java | 6 +- .../leaderboard/impl/ScoreCorrectionImpl.java | 24 +++- .../meta/AbstractMetaLeaderboard.java | 10 +- .../FlexibleLeaderboardMasterData.java | 5 +- .../RegattaLeaderboardMasterData.java | 3 +- ...StoringAndRetrievingLeaderboardGroups.java | 123 +++++++++--------- .../TestStoringAndRetrievingLeaderboards.java | 52 ++++---- ...ingAndRetrievingRaceLogInLeaderboards.java | 5 +- .../server/impl/RacingEventServiceImpl.java | 8 +- 17 files changed, 170 insertions(+), 166 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index a4a06acaee3..cd0f88709a8 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -82,7 +82,6 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.persistence.DomainObjectFactory; @@ -238,16 +237,15 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { result = leaderboardRegistry.getLeaderboardByName(leaderboardName); } if (result == null) { - SettableScoreCorrection scoreCorrection = new ScoreCorrectionImpl(); ThresholdBasedResultDiscardingRule resultDiscardingRule = loadResultDiscardingRule(dbLeaderboard, FieldNames.LEADERBOARD_DISCARDING_THRESHOLDS); String regattaName = (String) dbLeaderboard.get(FieldNames.REGATTA_NAME.name()); if (groupForMetaLeaderboard != null) { result = new LeaderboardGroupMetaLeaderboard(groupForMetaLeaderboard, loadScoringScheme(dbLeaderboard), resultDiscardingRule); groupForMetaLeaderboard.setOverallLeaderboard(result); } else if (regattaName == null) { - result = loadFlexibleLeaderboard(dbLeaderboard, scoreCorrection, resultDiscardingRule); + result = loadFlexibleLeaderboard(dbLeaderboard, resultDiscardingRule); } else { - result = loadRegattaLeaderboard(leaderboardName, regattaName, dbLeaderboard, scoreCorrection, resultDiscardingRule, regattaRegistry); + result = loadRegattaLeaderboard(leaderboardName, regattaName, dbLeaderboard, resultDiscardingRule, regattaRegistry); } if (result != null) { final Leaderboard finalResult = result; @@ -263,7 +261,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } } }); - needsMigration[0] = loadLeaderboardCorrections(dbLeaderboard, loadedLeaderboardCorrections, scoreCorrection) || needsMigration[0]; + needsMigration[0] = loadLeaderboardCorrections(dbLeaderboard, loadedLeaderboardCorrections, result.getScoreCorrection()) || needsMigration[0]; needsMigration[0] = loadSuppressedCompetitors(dbLeaderboard, loadedLeaderboardCorrections) || needsMigration[0]; loadColumnFactors(dbLeaderboard, result); // add the leaderboard to the registry @@ -338,20 +336,20 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { * @return null if the regatta cannot be resolved; otherwise the leaderboard for the regatta specified */ private RegattaLeaderboard loadRegattaLeaderboard(String leaderboardName, String regattaName, DBObject dbLeaderboard, - SettableScoreCorrection scoreCorrection, ThresholdBasedResultDiscardingRule resultDiscardingRule, RegattaRegistry regattaRegistry) { + ThresholdBasedResultDiscardingRule resultDiscardingRule, RegattaRegistry regattaRegistry) { RegattaLeaderboard result = null; Regatta regatta = regattaRegistry.getRegatta(new RegattaName(regattaName)); if (regatta == null) { logger.info("Couldn't find regatta "+regattaName+" for corresponding regatta leaderboard. Not loading regatta leaderboard."); } else { - result = new RegattaLeaderboardImpl(regatta, scoreCorrection, resultDiscardingRule); + result = new RegattaLeaderboardImpl(regatta, resultDiscardingRule); result.setName(leaderboardName); } return result; } private FlexibleLeaderboard loadFlexibleLeaderboard(DBObject dbLeaderboard, - SettableScoreCorrection scoreCorrection, ThresholdBasedResultDiscardingRule resultDiscardingRule) { + ThresholdBasedResultDiscardingRule resultDiscardingRule) { final FlexibleLeaderboardImpl result; BasicDBList dbRaceColumns = (BasicDBList) dbLeaderboard.get(FieldNames.LEADERBOARD_COLUMNS.name()); if (dbRaceColumns == null) { @@ -372,7 +370,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } result = new FlexibleLeaderboardImpl(raceLogStore, (String) dbLeaderboard.get(FieldNames.LEADERBOARD_NAME - .name()), scoreCorrection, resultDiscardingRule, scoringScheme, courseArea); + .name()), resultDiscardingRule, scoringScheme, courseArea); // For a FlexibleLeaderboard, fleets are owned by the leaderboard's RaceColumn objects. We need to manage // them here: Map fleetsByName = new HashMap(); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java index cd97487b2e7..9abe5d413eb 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java @@ -23,7 +23,6 @@ import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tractracadapter.ReceiverType; @@ -38,8 +37,8 @@ public class LeaderboardForKielWeekTest extends OnlineTracTracBasedTest { @Test public void leaderboardWithOneRaceTest() throws URISyntaxException, NoWindException, IOException, InterruptedException { - leaderboard = new FlexibleLeaderboardImpl("Kiel Week 2011 505s", new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl("Kiel Week 2011 505s", new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), + new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); MillisecondsTimePoint now = MillisecondsTimePoint.now(); loadRace("357c700a-9d9a-11e0-85be-406186cbf87c"); // 505 Race 2 diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java index 9081815008e..4df7ca3ee3b 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java @@ -40,7 +40,6 @@ import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; @@ -102,7 +101,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { @Test public void ensureMedalRaceParamIsIgnoredIfRaceColumnAlreadyExists() { - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { 5, 8 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); final String columnName = "abc"; @@ -115,7 +114,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { @Test public void testRepeatedLeaderboardDTOCacheInvalidation() throws NoWindException, InterruptedException, ExecutionException { - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { 5, 8 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); final String columnName = "abc"; @@ -174,8 +173,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { r.addCompetitor(c3); // this makes maxPoints==4 testRaces.add(r); // hash set should take care of more or less randomly permuting the races } - ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { 1 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); int i=0; @@ -190,7 +188,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { bestScoringRaceColumn = raceColumn; } } - scoreCorrection.setMaxPointsReason(competitor, bestScoringRaceColumn, MaxPointsReason.DSQ); + leaderboard.getScoreCorrection().setMaxPointsReason(competitor, bestScoringRaceColumn, MaxPointsReason.DSQ); // assert that best scoring but now disqualified race gets max net points because of disqualification: assertEquals(Util.size(bestScoringRaceColumn.getTrackedRace(defaultFleet).getRace().getCompetitors())+1, leaderboard.getEntry(competitor, bestScoringRaceColumn, MillisecondsTimePoint.now()).getNetPoints(), 0.000000001); @@ -208,8 +206,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { competitor, /* rank */ 1, /* started */true); testRace.addCompetitor(c2); testRace.addCompetitor(c3); // this makes maxPoints==4 - ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { 2 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); leaderboard.addRace(testRace, "R1", /* medalRace */ false, defaultFleet); @@ -237,14 +234,13 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { competitor, /* rank */ 1, /* started */true); testRace.addCompetitor(c2); testRace.addCompetitor(c3); // this makes maxPoints==4 - ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { 2 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); RaceColumn r1 = leaderboard.addRace(testRace, "R1", /* medalRace */ false, defaultFleet); raceColumnsInLeaderboard.put(testRace, r1); RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false, defaultFleet); - scoreCorrection.setMaxPointsReason(competitor, r2, MaxPointsReason.DND); // non-discardable disqualification + leaderboard.getScoreCorrection().setMaxPointsReason(competitor, r2, MaxPointsReason.DND); // non-discardable disqualification // assert that max points were given before discarding... assertEquals(4.0, leaderboard.getEntry(competitor, r2, MillisecondsTimePoint.now()).getNetPoints(), 0.000000001); // ...and after... @@ -265,8 +261,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { r.addCompetitor(c3); // this makes maxPoints==4 testRaces.add(r); // hash set should take care of more or less randomly permuting the races } - ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { 1 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); int i=0; @@ -281,7 +276,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { bestScoringRaceColumn = raceColumn; } } - scoreCorrection.setMaxPointsReason(competitor, bestScoringRaceColumn, MaxPointsReason.DND); + leaderboard.getScoreCorrection().setMaxPointsReason(competitor, bestScoringRaceColumn, MaxPointsReason.DND); // assert that best scoring but now disqualified race gets max net points because of disqualification: assertEquals(Util.size(bestScoringRaceColumn.getTrackedRace(defaultFleet).getRace().getCompetitors())+1, leaderboard.getEntry(competitor, bestScoringRaceColumn, MillisecondsTimePoint.now()).getNetPoints(), 0.000000001); @@ -293,7 +288,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { protected void testLeaderboard(int numberOfStartedRaces, int numberOfNotStartedRaces, int firstDiscardingThreshold, int secondDiscardingThreshold, Integer carry, boolean addOneMedalRace, int numberOfUntrackedRaces) throws NoWindException { setupRaces(numberOfStartedRaces, numberOfNotStartedRaces); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ThresholdBasedResultDiscardingRuleImpl( new int[] { firstDiscardingThreshold, secondDiscardingThreshold }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); int i=0; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java index 7578c7a5f94..349c7e208eb 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java @@ -46,7 +46,6 @@ import com.sap.sailing.domain.leaderboard.impl.HighPointExtremeSailingSeriesOver import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithStartTimeAndRanks; import com.sap.sailing.domain.tracking.MarkPassing; @@ -59,9 +58,8 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { private ArrayList series; private Leaderboard createLeaderboard(Regatta regatta, int[] discardingThresholds) { - ScoreCorrectionImpl scoreCorrections = new ScoreCorrectionImpl(); ThresholdBasedResultDiscardingRuleImpl discardingRules = new ThresholdBasedResultDiscardingRuleImpl(discardingThresholds); - return new RegattaLeaderboardImpl(regatta, scoreCorrections, discardingRules); + return new RegattaLeaderboardImpl(regatta, discardingRules); } @Test @@ -800,24 +798,24 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { Competitor[] f6 = new Competitor[] { c[3], c[0] }; TimePoint now = MillisecondsTimePoint.now(); TimePoint later = new MillisecondsTimePoint(now.asMillis()+1000); - FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); + FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), + new HighPoint(), null); leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f1)), "R1", /* medalRace */ false, leaderboard1.getFleet(null)); leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f2)), "R2", /* medalRace */ false, leaderboard1.getFleet(null)); assertTrue(leaderboard1.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare( leaderboard1.getTotalPoints(c[0], later), leaderboard1.getTotalPoints(c[3], later)) < 0); // c0 better than c3 - FlexibleLeaderboard leaderboard2 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); + FlexibleLeaderboard leaderboard2 = new FlexibleLeaderboardImpl("Leaderboard 3", new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), + new HighPoint(), null); leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f3)), "R1", /* medalRace */ false, leaderboard1.getFleet(null)); leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f4)), "R2", /* medalRace */ false, leaderboard1.getFleet(null)); assertTrue(leaderboard2.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare( leaderboard2.getTotalPoints(c[3], later), leaderboard2.getTotalPoints(c[0], later)) < 0); // c3 better than c0 - FlexibleLeaderboard leaderboard3 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); + FlexibleLeaderboard leaderboard3 = new FlexibleLeaderboardImpl("Leaderboard 3", new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), + new HighPoint(), null); leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f5)), "R1", /* medalRace */ false, leaderboard1.getFleet(null)); leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f6)), "R2", /* medalRace */ false, diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java index 80eb691ef57..78e7d9383fa 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java @@ -16,7 +16,6 @@ import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.test.mock.MockedTrackedRace; import com.sap.sailing.domain.tracking.TrackedRace; @@ -48,8 +47,7 @@ public class RaceLogAttachOnTrackedRaceTest { @Before public void setUp() { - ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - leaderboard = new FlexibleLeaderboardImpl("", scoreCorrection, null, new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl("", null, new LowPoint(), null); } @Test 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 index 7ad876d0bae..59114f0d9a6 100755 --- 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 @@ -14,7 +14,6 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.leaderboard.ScoreCorrection; -import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.tracking.TrackedRace; @@ -38,14 +37,11 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI private transient Iterable allCompetitorsCache; /** - * @param scoreCorrection must not be null * @param scoreComparator the comparator to use to compare basic scores, such as net points * @param name must not be null */ - public AbstractLeaderboardImpl(SettableScoreCorrection scoreCorrection, - ThresholdBasedResultDiscardingRule resultDiscardingRule) { - super(scoreCorrection, resultDiscardingRule); - assert scoreCorrection != null; + public AbstractLeaderboardImpl(ThresholdBasedResultDiscardingRule resultDiscardingRule) { + super(resultDiscardingRule); } @Override 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 6f6f770f311..02d279c3a49 100755 --- 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 @@ -342,9 +342,9 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race } } - public AbstractSimpleLeaderboardImpl(SettableScoreCorrection scoreCorrection, ThresholdBasedResultDiscardingRule resultDiscardingRule) { + public AbstractSimpleLeaderboardImpl(ThresholdBasedResultDiscardingRule resultDiscardingRule) { this.carriedPoints = new HashMap(); - this.scoreCorrection = scoreCorrection; + this.scoreCorrection = createScoreCorrection(); this.displayNames = new HashMap(); this.crossLeaderboardResultDiscardingRule = resultDiscardingRule; this.suppressedCompetitors = new HashSet(); @@ -354,6 +354,15 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race initTransientFields(); } + /** + * Produces the score correction object to use in this leaderboard. Used by the constructor. Subclasses may override + * this method to create a more specific type of score correction. This implementation produces an object of type + * {@link ScoreCorrectionImpl}. + */ + protected SettableScoreCorrection createScoreCorrection() { + return new ScoreCorrectionImpl(); + } + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); initTransientFields(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index c78ae8d18bc..609fb016488 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -18,7 +18,6 @@ import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.ScoringScheme; -import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; @@ -47,14 +46,14 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements private transient RaceLogStore raceLogStore; private CourseArea courseArea; - public FlexibleLeaderboardImpl(String name, SettableScoreCorrection scoreCorrection, - ThresholdBasedResultDiscardingRule resultDiscardingRule, ScoringScheme scoringScheme, CourseArea courseArea) { - this(EmptyRaceLogStore.INSTANCE, name, scoreCorrection, resultDiscardingRule, scoringScheme, courseArea); + public FlexibleLeaderboardImpl(String name, ThresholdBasedResultDiscardingRule resultDiscardingRule, + ScoringScheme scoringScheme, CourseArea courseArea) { + this(EmptyRaceLogStore.INSTANCE, name, resultDiscardingRule, scoringScheme, courseArea); } - public FlexibleLeaderboardImpl(RaceLogStore raceLogStore, String name, SettableScoreCorrection scoreCorrection, - ThresholdBasedResultDiscardingRule resultDiscardingRule, ScoringScheme scoringScheme, CourseArea courseArea) { - super(scoreCorrection, resultDiscardingRule); + public FlexibleLeaderboardImpl(RaceLogStore raceLogStore, String name, ThresholdBasedResultDiscardingRule resultDiscardingRule, + ScoringScheme scoringScheme, CourseArea courseArea) { + super(resultDiscardingRule); this.scoringScheme = scoringScheme; if (name == null) { throw new IllegalArgumentException("A leaderboard's name must not be null"); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java index 02439785dd1..8d224a533d6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java @@ -14,7 +14,6 @@ import com.sap.sailing.domain.base.impl.RaceColumnInSeriesImpl; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ScoringScheme; -import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.tracking.TrackedRace; @@ -31,9 +30,8 @@ public class RegattaLeaderboardImpl extends AbstractLeaderboardImpl implements R private static final long serialVersionUID = 2370461218294770084L; private final Regatta regatta; - public RegattaLeaderboardImpl(Regatta regatta, SettableScoreCorrection scoreCorrection, - ThresholdBasedResultDiscardingRule resultDiscardingRule) { - super(scoreCorrection, resultDiscardingRule); + public RegattaLeaderboardImpl(Regatta regatta, ThresholdBasedResultDiscardingRule resultDiscardingRule) { + super(resultDiscardingRule); this.regatta = regatta; regatta.addRaceColumnListener(this); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index 99a4d2e6110..09b92d87ec7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -161,6 +161,22 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { * {@link #getMaxPoints(TrackedRace) maximum score} is computed for the competitor. Otherwise, the * uncorrectedScore is returned. *

+ * + * The current implementation considers timePoint by comparing it to the competitor's + * times for the tracked race associated for that competitor in raceColumn. If there is no such tracked + * race, any score correction available will be applied unchanged. If a tracked race is attached to the column for + * the competitor's fleet, the score correction is applied if timePoint is after the competitor + * finished or aborted the race. If the timePoint is after the {@link TrackedRace#getStartOfRace() race + * start time}, a score correction for the competitor for that race is considered if it is a + * {@link MaxPointsReason#DNS}, {@link MaxPointsReason#DNC} or {@link MaxPointsReason#OCS} code. Those penalties + * apply already from the start of the race and will cause the penalty score to be applied already during the race + * time interval, so the competitor will be sorted to the end of the leaderboard already during replay. + *

+ * + * TODO Future versions of this implementation shall also work for untracked race columns by comparing timePoint + * to start and finish time points of tracked races in other columns of the same leaderboard owning this {@link ScoreCorrection} + * object. From those time relations it can be possible to infer that timePoint is before or after another of + * competitor's races. */ @Override public Result getCorrectedScore(Callable trackedRankProvider, final Competitor competitor, @@ -169,7 +185,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { Double result; final MaxPointsReason maxPointsReason = getMaxPointsReason(competitor, raceColumn, timePoint); if (maxPointsReason == MaxPointsReason.NONE) { - result = getCorrectedNonMaxedScore(competitor, raceColumn, trackedRankProvider, scoringScheme, numberOfCompetitorsInLeaderboardFetcher); + result = getCorrectedNonMaxedScore(competitor, raceColumn, trackedRankProvider, scoringScheme, numberOfCompetitorsInLeaderboardFetcher, timePoint); } else { // allow explicit override even when max points reason is specified; calculation may be wrong, // e.g., in case we have an untracked race and the number of competitors is estimated incorrectly @@ -223,16 +239,16 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { * competitor's key, it is used. Otherwise, the uncorrectedScore is returned. * @param scoringScheme * used to transform the tracked rank into a score if there is no score correction applied - * + * @param timePoint TODO * @return null in case the competitor has no score assigned in that race which is the * case if the score is not corrected by these score corrections, and the trackedRankProvider delivers 0 * as the rank, or if the score is not corrected and the scoring scheme cannot find the competitor in any tracked race * of the raceColumn, meaning there cannot be a tracked rank for the competitor regardless what * trackedRankProvider delivers. */ - protected Double getCorrectedNonMaxedScore(final Competitor competitor, final RaceColumn raceColumn, + private Double getCorrectedNonMaxedScore(final Competitor competitor, final RaceColumn raceColumn, Callable trackedRankProvider, ScoringScheme scoringScheme, - final NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher) { + final NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher, TimePoint timePoint) { Double correctedNonMaxedScore = correctedScores.get(raceColumn.getKey(competitor)); Double result; if (correctedNonMaxedScore == null) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java index 9673b67fcc3..98347355fc3 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java @@ -20,6 +20,7 @@ import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.MetaLeaderboard; import com.sap.sailing.domain.leaderboard.ScoreCorrectionListener; import com.sap.sailing.domain.leaderboard.ScoringScheme; +import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.impl.AbstractSimpleLeaderboardImpl; import com.sap.sailing.domain.tracking.TrackedRace; @@ -74,7 +75,7 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI } public AbstractMetaLeaderboard(String name, ScoringScheme scoringScheme, ThresholdBasedResultDiscardingRule resultDiscardingRule) { - super(new MetaLeaderboardScoreCorrection(), resultDiscardingRule); + super(resultDiscardingRule); getScoreCorrection().setMetaLeaderboard(this); metaFleet = new FleetImpl("MetaFleet"); this.scoringScheme = scoringScheme; @@ -83,6 +84,13 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI scoreCorrectionChangeForwardersByLeaderboard = new WeakHashMap(); } + @Override + protected SettableScoreCorrection createScoreCorrection() { + return new MetaLeaderboardScoreCorrection(); + } + + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); columnsForLeaderboards = new WeakHashMap<>(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/FlexibleLeaderboardMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/FlexibleLeaderboardMasterData.java index c0c06e2c852..9e2ce14093c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/FlexibleLeaderboardMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/FlexibleLeaderboardMasterData.java @@ -9,7 +9,6 @@ import com.sap.sailing.domain.base.LeaderboardMasterData; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.racelog.RaceLogEvent; public class FlexibleLeaderboardMasterData extends LeaderboardMasterData { @@ -48,8 +47,8 @@ public class FlexibleLeaderboardMasterData extends LeaderboardMasterData { @Override public Leaderboard getLeaderboard() { - return new FlexibleLeaderboardImpl(getName(), new ScoreCorrectionImpl(), getResultDiscardingRule(), - scoringScheme, courseArea); + return new FlexibleLeaderboardImpl(getName(), getResultDiscardingRule(), scoringScheme, + courseArea); } public List getRaceColumns() { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/RegattaLeaderboardMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/RegattaLeaderboardMasterData.java index 689bbb30a75..8abeee6471a 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/RegattaLeaderboardMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/RegattaLeaderboardMasterData.java @@ -10,7 +10,6 @@ import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.racelog.RaceLogEvent; public class RegattaLeaderboardMasterData extends LeaderboardMasterData { @@ -40,7 +39,7 @@ public class RegattaLeaderboardMasterData extends LeaderboardMasterData { if (regatta == null) { return null; } - return new RegattaLeaderboardImpl(regatta, new ScoreCorrectionImpl(), getResultDiscardingRule()); + return new RegattaLeaderboardImpl(regatta, getResultDiscardingRule()); } } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java index 0e71b7b8415..be053083ef2 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java @@ -40,7 +40,6 @@ import com.sap.sailing.domain.leaderboard.impl.HighPointExtremeSailingSeriesOver import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; @@ -76,17 +75,17 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -124,19 +123,19 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupName = "Leaderboard Group"; final String groupDescription = "A leaderboard group"; - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null)); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); LeaderboardGroup leaderboardGroup = racingEventService.addLeaderboardGroup(groupName, groupDescription, false, Arrays.asList(leaderboardNames), new int[0], @@ -181,19 +180,19 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null)); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -238,19 +237,19 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null)); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -286,14 +285,14 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupName1 = "Leaderboard Group 1"; final String groupDescription1 = "A leaderboard group 1"; final ArrayList leaderboards1 = new ArrayList<>(); - Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards1.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards1.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards1.add(leaderboard); final LeaderboardGroup leaderboardGroup1 = new LeaderboardGroupImpl(groupName1, groupDescription1, false, leaderboards1); mongoObjectFactory.storeLeaderboardGroup(leaderboardGroup1); @@ -301,11 +300,11 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupName2 = "Leaderboard Group 2"; final String groupDescription2= "A leaderboard group 2"; final ArrayList leaderboards2 = new ArrayList<>(); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards2.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards2.add(leaderboard); final LeaderboardGroup leaderboardGroup2 = new LeaderboardGroupImpl(groupName2, groupDescription2, false, leaderboards2); mongoObjectFactory.storeLeaderboardGroup(leaderboardGroup2); @@ -331,17 +330,17 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -369,11 +368,11 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); - leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -382,12 +381,12 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String[] ungroupedLeaderboardNames = {"Ungrouped Leaderboard 0", "Ungrouped Leaderboard 1", "Ungrouped Leaderboard 2"}; final FlexibleLeaderboard[] ungroupedLeaderboards = { - new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[0], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null), - new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[1], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null), - new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[2], new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null) }; + new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[0], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null), + new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[1], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null), + new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[2], new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null) }; mongoObjectFactory.storeLeaderboard(ungroupedLeaderboards[0]); mongoObjectFactory.storeLeaderboard(ungroupedLeaderboards[1]); mongoObjectFactory.storeLeaderboard(ungroupedLeaderboards[2]); @@ -424,7 +423,7 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - final FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + final FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); final Fleet fleet = leaderboard.getFleet(null); final RaceColumn race = leaderboard.addRaceColumn(columnName, false, fleet); leaderboards.add(leaderboard); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java index 5dce5b40d64..baf2b19dd4e 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java @@ -26,13 +26,11 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; @@ -48,8 +46,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { public void testStoreAndRetrieveSimpleLeaderboardWithSpecificColumnFactors() { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); leaderboard.addRaceColumn("R1", /* medalRace */ false); RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false); r2.setFactor(1.5); @@ -66,8 +64,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { public void testStoreAndRetrieveLeaderboardWithSuppressedCompetitors() { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor wolfgang = createCompetitor(); Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", new TeamImpl("STG", Collections.singleton( new PersonImpl("Hasso Plattner", new NationalityImpl("GER"), @@ -94,12 +92,11 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { public void testStoreAndRetrieveLeaderboardWithCommentedScoreCorrection() { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - SettableScoreCorrection scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, scoreCorrection, - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); - scoreCorrection.setComment("Humba"); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); + leaderboard.getScoreCorrection().setComment("Humba"); MillisecondsTimePoint now = MillisecondsTimePoint.now(); - scoreCorrection.setTimePointOfLastCorrectionsValidity(now); + leaderboard.getScoreCorrection().setTimePointOfLastCorrectionsValidity(now); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); assertEquals("Humba", loadedLeaderboard.getScoreCorrection().getComment()); @@ -110,9 +107,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { public void testStoreAndRetrieveLeaderboardWithDisplayNameSet() { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - SettableScoreCorrection scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, scoreCorrection, - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); final String raceColumnName1 = "My First Race 1"; @@ -132,8 +128,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { public void testStoreAndRetrieveSimpleLeaderboard() { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); assertEquals(leaderboardName, loadedLeaderboard.getName()); @@ -145,8 +141,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { public void testStoreAndRetrieveSimpleLeaderboardWithHighPointScoringScheme() { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new HighPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new HighPoint(), null); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); assertSame(HighPoint.class, loadedLeaderboard.getScoringScheme().getClass()); @@ -159,8 +155,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String raceColumnName = "My First Race"; final double carriedPointsForWolfgangHunger = 3.7; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); leaderboard.addRace(raceWithOneCompetitor, raceColumnName, /* medalRace */ false, leaderboard.getFleet(null)); @@ -184,8 +180,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String raceColumnName2 = "My First Race 2"; final double correctedPoints = 2.75; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); @@ -212,8 +208,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String raceColumnName2 = "My.First$Race$2"; final double correctedPoints = 2.75; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); @@ -238,8 +234,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String raceColumnName2 = "My First Race 2"; final MaxPointsReason maxPointsReason = MaxPointsReason.DNF; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); @@ -267,8 +263,8 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final double correctedPoints = 2.55; final MaxPointsReason maxPointsReason = MaxPointsReason.DNF; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; - FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index a1e19a65f7d..04ecb49b28e 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -32,7 +32,6 @@ import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory; @@ -77,8 +76,8 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD RaceLogStore raceLogStore = MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory); - leaderboard = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + leaderboard = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), + new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); leaderboard.addRaceColumn(raceColumnName, /* medalRace */ false, defaultFleet); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 154acd334ea..8c16475a91d 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -73,7 +73,6 @@ import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.persistence.DomainObjectFactory; @@ -377,8 +376,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen domainObjectFactory); CourseArea courseArea = getCourseArea(courseAreaId); FlexibleLeaderboard result = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, - new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl(discardThresholds), - scoringScheme, courseArea); + new ThresholdBasedResultDiscardingRuleImpl(discardThresholds), scoringScheme, + courseArea); result.setDisplayName(leaderboardDisplayName); synchronized (leaderboardsByName) { if (getLeaderboardByName(leaderboardName) != null) { @@ -410,8 +409,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen + (regatta == null ? "null" : (regatta.getName() + " (" + regatta.hashCode() + ")")) + " to " + this); RegattaLeaderboard result = null; if (regatta != null) { - result = new RegattaLeaderboardImpl(regatta, new ScoreCorrectionImpl(), - new ThresholdBasedResultDiscardingRuleImpl(discardThresholds)); + result = new RegattaLeaderboardImpl(regatta, new ThresholdBasedResultDiscardingRuleImpl(discardThresholds)); result.setDisplayName(leaderboardDisplayName); synchronized (leaderboardsByName) { if (getLeaderboardByName(result.getName()) != null) { From d126aa0b82b37279a2c595800bce658be51f0d52 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 24 Sep 2013 09:06:50 +0200 Subject: [PATCH 04/96] added leaderboard field in ScoreCorrectionImpl --- .../impl/AbstractSimpleLeaderboardImpl.java | 2 +- .../leaderboard/impl/ScoreCorrectionImpl.java | 11 ++++++++++- .../meta/AbstractMetaLeaderboard.java | 3 +-- .../meta/MetaLeaderboardScoreCorrection.java | 16 +++++++++------- 4 files changed, 21 insertions(+), 11 deletions(-) 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 02d279c3a49..24e7c7b2108 100755 --- 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 @@ -360,7 +360,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race * {@link ScoreCorrectionImpl}. */ protected SettableScoreCorrection createScoreCorrection() { - return new ScoreCorrectionImpl(); + return new ScoreCorrectionImpl(this); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index 09b92d87ec7..b63b63b220e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -14,7 +14,9 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Pair; +import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher; +import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ScoreCorrectionListener; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; @@ -57,8 +59,11 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { private TimePoint timePointOfLastCorrectionsValidity; private transient Set scoreCorrectionListeners; + + private Leaderboard leaderboard; - public ScoreCorrectionImpl() { + public ScoreCorrectionImpl(Leaderboard leaderboard) { + this.leaderboard = leaderboard; this.maxPointsReasons = new HashMap, MaxPointsReason>(); this.correctedScores = new HashMap, Double>(); this.scoreCorrectionListeners = new HashSet(); @@ -310,4 +315,8 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { this.comment = scoreCorrectionComment; } + protected Leaderboard getLeaderboard() { + return leaderboard; + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java index 98347355fc3..aeb39a751b8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java @@ -76,7 +76,6 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI public AbstractMetaLeaderboard(String name, ScoringScheme scoringScheme, ThresholdBasedResultDiscardingRule resultDiscardingRule) { super(resultDiscardingRule); - getScoreCorrection().setMetaLeaderboard(this); metaFleet = new FleetImpl("MetaFleet"); this.scoringScheme = scoringScheme; this.name = name; @@ -86,7 +85,7 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI @Override protected SettableScoreCorrection createScoreCorrection() { - return new MetaLeaderboardScoreCorrection(); + return new MetaLeaderboardScoreCorrection(this); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardScoreCorrection.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardScoreCorrection.java index 2d4e49e5f49..8109435276c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardScoreCorrection.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardScoreCorrection.java @@ -6,18 +6,15 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.leaderboard.MetaLeaderboard; import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; public class MetaLeaderboardScoreCorrection extends ScoreCorrectionImpl { private static final long serialVersionUID = 3773423384260065869L; - private AbstractMetaLeaderboard metaLeaderboard; - public MetaLeaderboardScoreCorrection() { - } - - protected void setMetaLeaderboard(AbstractMetaLeaderboard metaLeaderboard) { - this.metaLeaderboard = metaLeaderboard; + public MetaLeaderboardScoreCorrection(MetaLeaderboard leaderboard) { + super(leaderboard); } @Override @@ -43,11 +40,16 @@ public class MetaLeaderboardScoreCorrection extends ScoreCorrectionImpl { MaxPointsReason newMaxPointsReason) { super.notifyListeners(competitor, oldMaxPointsReason, newMaxPointsReason); } + + @Override + protected MetaLeaderboard getLeaderboard() { + return (MetaLeaderboard) super.getLeaderboard(); + } @Override public TimePoint getTimePointOfLastCorrectionsValidity() { TimePoint result = super.getTimePointOfLastCorrectionsValidity(); - for (Leaderboard leaderboard : metaLeaderboard.getLeaderboards()) { + for (Leaderboard leaderboard : getLeaderboard().getLeaderboards()) { TimePoint leaderboardLastCorrectionTimePoint = leaderboard.getScoreCorrection().getTimePointOfLastCorrectionsValidity(); if (result == null || (leaderboardLastCorrectionTimePoint != null && leaderboardLastCorrectionTimePoint.after(result))) { result = leaderboardLastCorrectionTimePoint; From 776b11ce1d39f9dca7ec251aa3dc3f4d291d847e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 24 Sep 2013 09:08:11 +0200 Subject: [PATCH 05/96] made leaderboard field in ScoreCorrectionImpl final --- .../sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index b63b63b220e..33e25c8b33d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -60,7 +60,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { private transient Set scoreCorrectionListeners; - private Leaderboard leaderboard; + private final Leaderboard leaderboard; public ScoreCorrectionImpl(Leaderboard leaderboard) { this.leaderboard = leaderboard; From ce80cfcde7593732c52b92562551fe5e78e2e426 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 24 Sep 2013 14:46:53 +0200 Subject: [PATCH 06/96] interims commit on the way to time-dependentscore corrections --- .../leaderboard/impl/ScoreCorrectionImpl.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index 33e25c8b33d..4f465538250 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -5,6 +5,7 @@ import java.io.ObjectInputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.NavigableSet; import java.util.Set; import java.util.concurrent.Callable; @@ -20,6 +21,7 @@ import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ScoreCorrectionListener; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; +import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedRace; /** @@ -150,6 +152,96 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { Double oldScore = correctedScores.remove(raceColumn.getKey(competitor)); notifyListeners(competitor, raceColumn, oldScore, null); } + + /** + * Based on the order of the {@link Leaderboard#getRaceColumns() race columns} in the {@link #getLeaderboard() + * leaderboard to which this score correction object belongs}, tries to determine whether the timePoint + * is before the start of competitor's race in the race column specified by raceColumn. If + * there is a {@link RaceColumn#getTrackedRace(Competitor) tracked race for the competitor associated with the race + * column}, that race's start time is used for the calculation. Otherwise, if there is a tracked race column prior + * to raceColumn in the leaderboard in which competitor competes, and the competitor + * hasn't finished that race at timePoint, we also know that this must be before the start of + * competitor's race in raceColumn because we assume that the same competitor can only + * compete in one race at a time within a single leaderboard. + *

+ * + * In all other cases, false is returned which can either mean that timePoint is certainly + * known to be after the race start of competitor in the race for raceColumn, or we just + * can't tell, e.g., because competitor's race for raceColumn is not tracked, and + * timePoint is after all prior race column's finishing time for competitor. + *

+ * + * This method can be used to decide whether to apply a {@link MaxPointsReason#DNC}, {@link MaxPointsReason#DNS} or + * {@link MaxPointsReason#OCS} correction for competitor at timePoint in the race for + * raceColumn, because the correction can be applied at race start but should not be applied any + * earlier than that because it would incorrectly influence the total scores displayed for the competitor during + * earlier races. + */ + private boolean isCertainlyBeforeRaceStart(TimePoint timePoint, RaceColumn raceColumn, Competitor competitor) { + final boolean result; + TrackedRace trackedRace = raceColumn.getTrackedRace(competitor); + final TimePoint startOfRace; + if (trackedRace != null && (startOfRace = trackedRace.getStartOfRace()) != null) { + result = timePoint.before(startOfRace); + } else { + boolean preResult = false; + for (RaceColumn rc : getLeaderboard().getRaceColumns()) { + if (rc == raceColumn) { + break; + } + TrackedRace rcTrackedRace = rc.getTrackedRace(competitor); + if (rcTrackedRace != null) { + NavigableSet markPassings = rcTrackedRace.getMarkPassings(competitor); + if (!markPassings.isEmpty()) { + MarkPassing lastMarkPassing = markPassings.last(); + if (lastMarkPassing.getTimePoint().before(timePoint)) { + preResult = true; + break; + } + } else { + // if available, use the end of the race as indicator for how long competitor may have been in the race + TimePoint endOfRace = rcTrackedRace.getEndOfRace(); + if (endOfRace != null && timePoint.before(endOfRace)) { + preResult = true; + break; + } + } + } + } + result = preResult; + } + return result; + } + + /** + * Based on the order of the {@link Leaderboard#getRaceColumns() race columns} in the {@link #getLeaderboard() + * leaderboard to which this score correction object belongs}, tries to determine whether the timePoint + * is after the finish or abandoning of competitor's race in the race column specified by + * raceColumn. If there is a {@link RaceColumn#getTrackedRace(Competitor) tracked race for the + * competitor associated with the race column}, that race's finish time for competitor (if defined) or + * the {@link TrackedRace#getEndOfRace() end of the race} is used for the calculation. Otherwise, if there is a + * tracked race column after raceColumn in the leaderboard in which competitor competes, + * and the competitor has started that race at timePoint, we also know that this must be after the + * end of competitor's race in raceColumn because we assume that the same competitor can + * only compete in one race at a time within a single leaderboard. + *

+ * + * In all other cases, false is returned which can either mean that timePoint is certainly + * known to be after the race start of competitor in the race for raceColumn, or we just + * can't tell, e.g., because competitor's race for raceColumn is not tracked, and + * timePoint is after all prior race column's finishing time for competitor. + *

+ * + * This method can be used to decide whether to apply a {@link MaxPointsReason#DNC}, {@link MaxPointsReason#DNS} or + * {@link MaxPointsReason#OCS} correction for competitor at timePoint in the race for + * raceColumn, because the correction can be applied at race start but should not be applied any + * earlier than that because it would incorrectly influence the total scores displayed for the competitor during + * earlier races. + */ + private boolean isCertainlyAfterRaceFinish(TimePoint timePoint, RaceColumn raceColumn, Competitor competitor) { + // TODO + return false; + } @Override public MaxPointsReason getMaxPointsReason(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { From 001de81f23756da3267372ce0a1521ba47e2560d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 24 Sep 2013 15:39:45 +0200 Subject: [PATCH 07/96] move 505 IDM 2013 to 2013 section and replaced the official website by a link to our live center for the event --- java/com.sap.sailing.www/index.html | 49 +++++++++++++++-------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.www/index.html b/java/com.sap.sailing.www/index.html index a66e67f377e..913cca56ab4 100644 --- a/java/com.sap.sailing.www/index.html +++ b/java/com.sap.sailing.www/index.html @@ -34,31 +34,10 @@

+

Upcoming

@@ -89,6 +68,29 @@

2013

+
@@ -432,3 +434,4 @@ + From d14029a845f0d857e6c2a51fa4016b0ac8fa03d2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 24 Sep 2013 16:22:52 +0200 Subject: [PATCH 08/96] fixed date for Nice --- java/com.sap.sailing.www/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.www/index.html b/java/com.sap.sailing.www/index.html index 913cca56ab4..bda74b4dae7 100644 --- a/java/com.sap.sailing.www/index.html +++ b/java/com.sap.sailing.www/index.html @@ -44,7 +44,7 @@
- Sep 2 - 7 + Oct 3 - 6
From f29f20f103dd9a2675d8f2a5072eeb2bfcab44d4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 24 Sep 2013 16:48:25 +0200 Subject: [PATCH 09/96] implemented the methods that help decide whether a score correction is to be considered valid at a given time point --- .../leaderboard/impl/ScoreCorrectionImpl.java | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index 4f465538250..285a997b212 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -239,8 +239,44 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { * earlier races. */ private boolean isCertainlyAfterRaceFinish(TimePoint timePoint, RaceColumn raceColumn, Competitor competitor) { - // TODO - return false; + final boolean result; + TrackedRace trackedRace = raceColumn.getTrackedRace(competitor); + final TimePoint endOfRace; + // endOfRace != null means we at least will have a fallback result even if there are no mark passings for the competitor + if (trackedRace != null && (endOfRace = trackedRace.getEndOfRace()) != null) { + NavigableSet markPassings = trackedRace.getMarkPassings(competitor); + final MarkPassing lastMarkPassing; + // count race as finished for the competitor if the finish mark passing exists or the time is after the end of race + if (!markPassings.isEmpty() && (lastMarkPassing = markPassings.last()).getWaypoint() == trackedRace.getRace().getCourse().getLastWaypoint()) { + result = timePoint.after(lastMarkPassing.getTimePoint()); + } else { + // if available, use the end of the race as indicator for how long competitor may have been in the race + result = timePoint.after(endOfRace); + } + } else { + boolean preResult = false; + boolean found = false; + for (RaceColumn rc : getLeaderboard().getRaceColumns()) { + if (!found && rc == raceColumn) { + found = true; + break; + } + if (found) { + TrackedRace rcTrackedRace = rc.getTrackedRace(competitor); + if (rcTrackedRace != null) { + // if available, use the start of the race as indicator for whether the competitor is in that + // race at timePoint + TimePoint startOfRace = rcTrackedRace.getStartOfRace(); + if (startOfRace != null && timePoint.after(startOfRace)) { + preResult = true; + break; + } + } + } + } + result = preResult; + } + return result; } @Override From 85b50ce4e214506d3c3f02eb76a0e2470f0880ca Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Tue, 24 Sep 2013 16:48:37 +0200 Subject: [PATCH 10/96] Showing Nice leaderboard --- java/com.sap.sailing.www.events/ess40/mobile.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.www.events/ess40/mobile.html b/java/com.sap.sailing.www.events/ess40/mobile.html index b1592476ea7..7c4b627b278 100644 --- a/java/com.sap.sailing.www.events/ess40/mobile.html +++ b/java/com.sap.sailing.www.events/ess40/mobile.html @@ -23,7 +23,7 @@ Act 7 - Nice, France

- September 2th - 6th + October 2th - 6th