From f5e731a1d0d02bdd746e4e9ea6eb52095773390f Mon Sep 17 00:00:00 2001 From: Graham Kirby Date: Wed, 27 Nov 2024 21:43:18 +0000 Subject: [PATCH] Moved maximum race score for midweek series to config. --- .../grahamkirby/race_timing/common/Race.java | 1 + .../race_timing/relay_race/RelayRace.java | 11 ++++---- .../relay_race/RelayRaceOutputCSV.java | 2 +- .../relay_race/RelayRaceOutputHTML.java | 4 +-- .../fife_ac_midweek/MidweekRace.java | 28 +++++++++---------- .../midweek/2023/completed_1/input/config.txt | 1 + .../midweek/2023/completed_2/input/config.txt | 1 + .../midweek/2023/completed_3/input/config.txt | 1 + .../midweek/2023/completed_4/input/config.txt | 1 + .../midweek/2023/completed_5/input/config.txt | 1 + .../series_race/midweek/2024/input/config.txt | 1 + .../midweek/dead_heats/input/config.txt | 1 + .../duplicate_runner_name/input/config.txt | 1 + .../midweek/large_race/input/config.txt | 1 + .../name_includes_comma/input/config.txt | 1 + .../prize_category_groups/input/config.txt | 1 + 16 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/grahamkirby/race_timing/common/Race.java b/src/main/java/org/grahamkirby/race_timing/common/Race.java index 07d1c977..c733e1ce 100644 --- a/src/main/java/org/grahamkirby/race_timing/common/Race.java +++ b/src/main/java/org/grahamkirby/race_timing/common/Race.java @@ -71,6 +71,7 @@ public abstract class Race { // Midweek race. public static final String KEY_MINIMUM_NUMBER_OF_RACES = "MINIMUM_NUMBER_OF_RACES"; + public static final String KEY_MAX_RACE_SCORE = "MAX_RACE_SCORE"; // Minitour race. public static final String KEY_WAVE_START_OFFSETS = "WAVE_START_OFFSETS"; diff --git a/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRace.java b/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRace.java index b6545f2e..39b7f2eb 100644 --- a/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRace.java +++ b/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRace.java @@ -58,7 +58,7 @@ private record ResultWithLegIndex(RelayRaceResult result, int leg_index) {} // mass start. This allows e.g. for a leg 1 runner finishing after a leg 3 mass start - see configureMassStarts(). private List start_times_for_mass_starts; - protected List paired_legs; + protected Set paired_legs; private List individual_leg_starts; private Duration start_offset; private Map gender_eligibility_map; @@ -206,7 +206,8 @@ protected boolean entryCategoryIsEligibleForPrizeCategoryByGender(final EntryCat return gender_eligibility_map.keySet().stream(). filter(entry_gender -> entry_category.getGender().equals(entry_gender)). - anyMatch(entry_gender -> prize_category.getGender().equals(gender_eligibility_map.get(entry_gender))); + filter(entry_gender -> prize_category.getGender().equals(gender_eligibility_map.get(entry_gender))). + count() > 0; } @Override @@ -408,12 +409,10 @@ private void configurePairedLegs() { // Example: PAIRED_LEGS = 2,3 - paired_legs = Stream.generate(() -> false). - limit(number_of_legs). - collect(Collectors.toList()); + paired_legs = new HashSet<>(); for (final String leg_number_as_string : paired_legs_string.split(",")) - paired_legs.set(Integer.parseInt(leg_number_as_string) - 1, true); + paired_legs.add(Integer.parseInt(leg_number_as_string)); } private void configureIndividualLegStarts() { diff --git a/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputCSV.java b/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputCSV.java index b84bdb62..4287ba7b 100644 --- a/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputCSV.java +++ b/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputCSV.java @@ -161,7 +161,7 @@ public LegResultPrinter(final Race race, final OutputStreamWriter writer, final @Override public void printResultsHeader() throws IOException { - final String plural = ((RelayRace) race).paired_legs.get(leg - 1) ? "s" : ""; + final String plural = ((RelayRace) race).paired_legs.contains(leg) ? "s" : ""; writer.append(STR."Pos,Runner\{plural},Time\n"); } diff --git a/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputHTML.java b/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputHTML.java index 5b806ea9..877862ed 100644 --- a/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputHTML.java +++ b/src/main/java/org/grahamkirby/race_timing/relay_race/RelayRaceOutputHTML.java @@ -188,7 +188,7 @@ public void printResultsHeader() throws IOException { Pos - Runner\{((RelayRace)race).paired_legs.get(leg - 1) ? "s" : ""} + Runner\{((RelayRace)race).paired_legs.contains(leg) ? "s" : ""} Time @@ -271,7 +271,7 @@ public void printResultsHeader() throws IOException { for (int leg_number = 1; leg_number <= ((RelayRace)race).number_of_legs; leg_number++) { writer.append(STR.""" - Runner\{((RelayRace)race).paired_legs.get(leg_number - 1) ? "s" : ""} \{leg_number} + Runner\{((RelayRace)race).paired_legs.contains(leg_number) ? "s" : ""} \{leg_number} Leg \{leg_number} \{leg_number < ((RelayRace)race).number_of_legs ? STR."Split \{leg_number}" : "Total"} """); diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java index 2a377202..c6ee7a4b 100644 --- a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java +++ b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java @@ -35,11 +35,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; public class MidweekRace extends SeriesRace { - // TODO Move to config. - private static final int MAX_RACE_SCORE = 200; + private int max_race_score; ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -64,6 +64,7 @@ public static void main(final String[] args) throws IOException { protected void readProperties() { minimum_number_of_races = Integer.parseInt(getProperty(KEY_MINIMUM_NUMBER_OF_RACES)); + max_race_score = Integer.parseInt(getProperty(KEY_MAX_RACE_SCORE)); } @Override @@ -203,24 +204,21 @@ private void recordDefinedClubForRunnerName(final String runner_name, final Stri public int calculateRaceScore(final IndividualRace individual_race, final Runner runner) { - // TODO try writing as stream. if (individual_race == null) return 0; - int score = MAX_RACE_SCORE; - final String gender = runner.category.getGender(); + final AtomicInteger score = new AtomicInteger(max_race_score + 1); // The first finisher of each gender gets the maximum score, the next finisher one less, and so on. - for (final RaceResult result : individual_race.getOverallResults()) { - - IndividualRaceResult result1 = (IndividualRaceResult) result; - final Runner result_runner = result1.entry.runner; - if (result1.getCompletionStatus() == CompletionStatus.COMPLETED && result_runner.equals(runner)) return Math.max(score, 0); - if (gender.equals(result_runner.category.getGender())) score--; - } - - // Runner didn't compete in this race. - return 0; + return individual_race.getOverallResults().stream(). + map(result -> (IndividualRaceResult) result). + filter(result -> result.getCompletionStatus() == CompletionStatus.COMPLETED). + map(result -> result.entry.runner). + peek(result_runner -> { if (gender.equals(result_runner.category.getGender())) score.decrementAndGet(); }). + filter(result_runner -> result_runner.equals(runner)). + findFirst(). + map(_ -> Math.max(score.get(), 0)). + orElse(0); // Runner didn't compete in this race. } } diff --git a/src/test/resources/actual_races/series_race/midweek/2023/completed_1/input/config.txt b/src/test/resources/actual_races/series_race/midweek/2023/completed_1/input/config.txt index 1202d393..310cffa7 100644 --- a/src/test/resources/actual_races/series_race/midweek/2023/completed_1/input/config.txt +++ b/src/test/resources/actual_races/series_race/midweek/2023/completed_1/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,,,, MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/midweek/2023/completed_2/input/config.txt b/src/test/resources/actual_races/series_race/midweek/2023/completed_2/input/config.txt index 38e94e26..ec4c052c 100644 --- a/src/test/resources/actual_races/series_race/midweek/2023/completed_2/input/config.txt +++ b/src/test/resources/actual_races/series_race/midweek/2023/completed_2/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,,, MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/midweek/2023/completed_3/input/config.txt b/src/test/resources/actual_races/series_race/midweek/2023/completed_3/input/config.txt index 60ec029f..9816d099 100644 --- a/src/test/resources/actual_races/series_race/midweek/2023/completed_3/input/config.txt +++ b/src/test/resources/actual_races/series_race/midweek/2023/completed_3/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,hill_of_tarvit/input/config.txt,, MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/midweek/2023/completed_4/input/config.txt b/src/test/resources/actual_races/series_race/midweek/2023/completed_4/input/config.txt index 0f39c3e0..efeed509 100644 --- a/src/test/resources/actual_races/series_race/midweek/2023/completed_4/input/config.txt +++ b/src/test/resources/actual_races/series_race/midweek/2023/completed_4/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,hill_of_tarvit/input/config.txt,dunnikier/input/config.txt, MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/midweek/2023/completed_5/input/config.txt b/src/test/resources/actual_races/series_race/midweek/2023/completed_5/input/config.txt index bde16106..ea732abd 100644 --- a/src/test/resources/actual_races/series_race/midweek/2023/completed_5/input/config.txt +++ b/src/test/resources/actual_races/series_race/midweek/2023/completed_5/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,hill_of_tarvit/input/config.txt,dunnikier/input/config.txt,balmullo/input/config.txt MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/midweek/2024/input/config.txt b/src/test/resources/actual_races/series_race/midweek/2024/input/config.txt index 212a2a46..7bda1a22 100644 --- a/src/test/resources/actual_races/series_race/midweek/2024/input/config.txt +++ b/src/test/resources/actual_races/series_race/midweek/2024/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,hill_of_tarvit/input/config.txt,dunnikier/input/config.txt,balmullo/input/config.txt MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/series_race/midweek/dead_heats/input/config.txt b/src/test/resources/series_race/midweek/dead_heats/input/config.txt index bf052531..20c73dec 100644 --- a/src/test/resources/series_race/midweek/dead_heats/input/config.txt +++ b/src/test/resources/series_race/midweek/dead_heats/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,tarvit/input/config.txt,dunnikier/input/config.txt,balmullo/input/config.txt MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv diff --git a/src/test/resources/series_race/midweek/duplicate_runner_name/input/config.txt b/src/test/resources/series_race/midweek/duplicate_runner_name/input/config.txt index 9cd0c48e..cb9891a9 100644 --- a/src/test/resources/series_race/midweek/duplicate_runner_name/input/config.txt +++ b/src/test/resources/series_race/midweek/duplicate_runner_name/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,tarvit/input/config.txt,, MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to project root directory. CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv diff --git a/src/test/resources/series_race/midweek/large_race/input/config.txt b/src/test/resources/series_race/midweek/large_race/input/config.txt index b6a5068f..2c738f16 100644 --- a/src/test/resources/series_race/midweek/large_race/input/config.txt +++ b/src/test/resources/series_race/midweek/large_race/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,tarvit/input/config.txt,dunnikier/input/config.txt,balmullo/input/config.txt MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to project root directory. CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv diff --git a/src/test/resources/series_race/midweek/name_includes_comma/input/config.txt b/src/test/resources/series_race/midweek/name_includes_comma/input/config.txt index 9cd0c48e..cb9891a9 100644 --- a/src/test/resources/series_race/midweek/name_includes_comma/input/config.txt +++ b/src/test/resources/series_race/midweek/name_includes_comma/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,tarvit/input/config.txt,, MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to project root directory. CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv diff --git a/src/test/resources/series_race/midweek/prize_category_groups/input/config.txt b/src/test/resources/series_race/midweek/prize_category_groups/input/config.txt index bf052531..20c73dec 100644 --- a/src/test/resources/series_race/midweek/prize_category_groups/input/config.txt +++ b/src/test/resources/series_race/midweek/prize_category_groups/input/config.txt @@ -4,6 +4,7 @@ RACE_NAME_FOR_FILENAMES = midweek RACES = st_andrews/input/config.txt,strath_blebo/input/config.txt,tarvit/input/config.txt,dunnikier/input/config.txt,balmullo/input/config.txt MINIMUM_NUMBER_OF_RACES = 4 +MAX_RACE_SCORE = 200 # Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv