Skip to content

Commit 0af729c

Browse files
committed
Tidying.
1 parent 06806ad commit 0af729c

File tree

114 files changed

+16106
-674
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+16106
-674
lines changed

src/main/java/org/grahamkirby/race_timing/common/Race.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@
3434

3535
public abstract class Race {
3636

37-
// TODO add support for Tour of Fife series.
38-
// TODO add support for Junior Hill Running Champs.
39-
4037
public static final String COMMENT_SYMBOL = "#";
4138

4239
//////////////////////////////////////////////////////////////////////////////////////////////////
@@ -75,19 +72,21 @@ public abstract class Race {
7572

7673
// Series race.
7774
public static final String KEY_RACES = "RACES";
75+
public static final String KEY_NUMBER_OF_RACES_IN_SERIES = "NUMBER_OF_RACES_IN_SERIES";
76+
public static final String KEY_MINIMUM_NUMBER_OF_RACES = "MINIMUM_NUMBER_OF_RACES";
7877

7978
// Grand Prix race.
8079
public static final String KEY_RACE_CATEGORIES_PATH = "RACE_CATEGORIES_PATH";
8180
public static final String KEY_QUALIFYING_CLUBS = "QUALIFYING_CLUBS";
8281

8382
// Midweek race.
84-
public static final String KEY_MINIMUM_NUMBER_OF_RACES = "MINIMUM_NUMBER_OF_RACES";
8583
public static final String KEY_SCORE_FOR_FIRST_PLACE = "SCORE_FOR_FIRST_PLACE";
8684

8785
// Minitour race.
8886
public static final String KEY_WAVE_START_OFFSETS = "WAVE_START_OFFSETS";
8987
public static final String KEY_SECOND_WAVE_CATEGORIES = "SECOND_WAVE_CATEGORIES";
90-
public static final String KEY_TIME_TRIAL = "TIME_TRIAL";
88+
public static final String KEY_TIME_TRIAL_RACE = "TIME_TRIAL_RACE";
89+
public static final String KEY_TIME_TRIAL_STARTS = "TIME_TRIAL_STARTS";
9190
public static final String KEY_SELF_TIMED = "SELF_TIMED";
9291

9392
//////////////////////////////////////////////////////////////////////////////////////////////////
@@ -453,7 +452,7 @@ protected Comparator<RaceResult> combineComparators(final List<Comparator<RaceRe
453452

454453
private Comparator<RaceResult> dnfOnly(final Comparator<RaceResult> comparator) {
455454

456-
return (r1, r2) -> r1.shouldDisplayPosition() || r2.shouldDisplayPosition() ? 0 : comparator.compare(r1, r2);
455+
return (r1, r2) -> r1.getCompletionStatus() != CompletionStatus.DNF || r2.getCompletionStatus() != CompletionStatus.DNF ? 0 : comparator.compare(r1, r2);
457456
}
458457

459458
private List<PrizeCategoryGroup> getPrizeCategoryGroups(final Path prize_categories_path) throws IOException {

src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRace.java

+47-41
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616
*/
1717
package org.grahamkirby.race_timing.individual_race;
1818

19-
import org.grahamkirby.race_timing.common.CompletionStatus;
20-
import org.grahamkirby.race_timing.common.Normalisation;
21-
import org.grahamkirby.race_timing.common.RaceInput;
22-
import org.grahamkirby.race_timing.common.RaceResult;
19+
import org.grahamkirby.race_timing.common.*;
2320
import org.grahamkirby.race_timing.common.categories.EntryCategory;
2421
import org.grahamkirby.race_timing.common.categories.PrizeCategory;
2522
import org.grahamkirby.race_timing.common.output.RaceOutputCSV;
@@ -74,6 +71,39 @@ public EntryCategory findCategory(final int bib_number) {
7471
return getEntryWithBibNumber(bib_number).runner.category;
7572
}
7673

74+
public Duration getRunnerTime(final Runner runner) {
75+
76+
final List<RaceResult> results = getOverallResults();
77+
78+
for (final RaceResult result : results) {
79+
80+
final IndividualRaceResult individual_result = (IndividualRaceResult) result;
81+
if (individual_result.entry.runner.equals(runner))
82+
return individual_result.duration();
83+
}
84+
85+
return null;
86+
}
87+
88+
public Duration getMedianTime() {
89+
90+
if (median_time_string != null) return Normalisation.parseTime(median_time_string);
91+
92+
final List<RaceResult> results = getOverallResults();
93+
94+
if (results.size() % 2 == 0) {
95+
96+
final IndividualRaceResult median_result1 = (IndividualRaceResult) results.get(results.size() / 2);
97+
final IndividualRaceResult median_result2 = (IndividualRaceResult) results.get(results.size() / 2 + 1);
98+
99+
return median_result1.finish_time.plus(median_result2.finish_time).dividedBy(2);
100+
}
101+
else {
102+
final IndividualRaceResult median_result = (IndividualRaceResult) results.get(results.size() / 2);
103+
return median_result.finish_time;
104+
}
105+
}
106+
77107
//////////////////////////////////////////////////////////////////////////////////////////////////
78108

79109
private int compareRecordedPosition(final RaceResult r1, final RaceResult r2) {
@@ -101,8 +131,6 @@ protected void readProperties() throws IOException {
101131

102132
super.readProperties();
103133

104-
// Specifies all the bib numbers for runners who did have a finish
105-
// time recorded but were declared DNF.
106134
median_time_string = getProperty(KEY_MEDIAN_TIME);
107135
}
108136

@@ -134,11 +162,10 @@ protected RaceOutputPDF getOutputPDF() {
134162
@Override
135163
protected void initialiseResults() {
136164

137-
if (entries != null)
138-
entries.stream().
139-
map(entry -> (IndividualRaceEntry) entry).
140-
map(entry -> new IndividualRaceResult(this, entry)).
141-
forEachOrdered(overall_results::add);
165+
entries.stream().
166+
map(entry -> (IndividualRaceEntry) entry).
167+
map(entry -> new IndividualRaceResult(this, entry)).
168+
forEachOrdered(overall_results::add);
142169
}
143170

144171
@Override
@@ -166,12 +193,11 @@ public List<Comparator<RaceResult>> getDNFComparators() {
166193
@Override
167194
protected boolean entryCategoryIsEligibleForPrizeCategoryByGender(final EntryCategory entry_category, final PrizeCategory prize_category) {
168195

169-
if (entry_category == null) return true;
170-
return entry_category.getGender().equals(prize_category.getGender());
196+
return entry_category == null || entry_category.getGender().equals(prize_category.getGender());
171197
}
172198

173199
@Override
174-
protected EntryCategory getEntryCategory(RaceResult result) {
200+
protected EntryCategory getEntryCategory(final RaceResult result) {
175201

176202
return ((IndividualRaceResult) result).entry.runner.category;
177203
}
@@ -192,37 +218,17 @@ protected void fillDNF(final String dnf_string) {
192218

193219
//////////////////////////////////////////////////////////////////////////////////////////////////
194220

195-
public Duration getMedianTime() {
196-
197-
if (median_time_string != null) return Normalisation.parseTime(median_time_string);
198-
199-
final List<RaceResult> results = getOverallResults();
200-
201-
if (results.size() % 2 == 0) {
202-
203-
final IndividualRaceResult median_result1 = (IndividualRaceResult) results.get(results.size() / 2);
204-
final IndividualRaceResult median_result2 = (IndividualRaceResult) results.get(results.size() / 2 + 1);
205-
206-
return median_result1.finish_time.plus(median_result2.finish_time).dividedBy(2);
207-
}
208-
else {
209-
final IndividualRaceResult median_result = (IndividualRaceResult) results.get(results.size() / 2);
210-
return median_result.finish_time;
211-
}
212-
}
213-
214221
private void fillFinishTimes() {
215222

216-
if (raw_results != null)
217-
raw_results.forEach(raw_result -> {
223+
raw_results.forEach(raw_result -> {
218224

219-
final IndividualRaceResult result = getResultWithBibNumber(raw_result.getBibNumber());
220-
result.finish_time = raw_result.getRecordedFinishTime();
225+
final IndividualRaceResult result = getResultWithBibNumber(raw_result.getBibNumber());
226+
result.finish_time = raw_result.getRecordedFinishTime();
221227

222-
// Provisionally this result is not DNF since a finish time was recorded.
223-
// However, it might still be set to DNF in fillDNF() if the runner didn't complete the course.
224-
result.completion_status = CompletionStatus.COMPLETED;
225-
});
228+
// Provisionally this result is not DNF since a finish time was recorded.
229+
// However, it might still be set to DNF in fillDNF() if the runner didn't complete the course.
230+
result.completion_status = CompletionStatus.COMPLETED;
231+
});
226232
}
227233

228234
private IndividualRaceResult getResultWithBibNumber(final int bib_number) {

src/main/java/org/grahamkirby/race_timing/series_race/SeriesRace.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public abstract class SeriesRace extends Race {
3434

3535
protected List<IndividualRace> races;
3636

37+
protected int number_of_races_in_series;
3738
protected int minimum_number_of_races;
3839

3940
public SeriesRace(final Path config_file_path) throws IOException {
@@ -95,6 +96,7 @@ protected void outputResults() throws IOException {
9596
@Override
9697
protected void readProperties() {
9798

99+
number_of_races_in_series = Integer.parseInt(getProperty(KEY_NUMBER_OF_RACES_IN_SERIES));
98100
minimum_number_of_races = Integer.parseInt(getProperty(KEY_MINIMUM_NUMBER_OF_RACES));
99101
}
100102

@@ -117,7 +119,7 @@ public List<IndividualRace> getRaces() {
117119
}
118120

119121
public int getNumberOfRacesInSeries() {
120-
return races.size();
122+
return number_of_races_in_series;
121123
}
122124

123125
public int getMinimumNumberOfRaces() {

src/main/java/org/grahamkirby/race_timing/series_race/SeriesRaceInput.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ private IndividualRace getIndividualRace(int i) throws IOException {
5151

5252
final String race_config_path = race_config_paths.get(i);
5353

54-
return race_config_path.isEmpty() ? null : getIndividualRace(race_config_path, i + 1);
54+
return getIndividualRace(race_config_path, i + 1);
55+
// return race_config_path.isEmpty() ? null : getIndividualRace(race_config_path, i + 1);
5556
}
5657

5758
//////////////////////////////////////////////////////////////////////////////////////////////////

src/main/java/org/grahamkirby/race_timing/series_race/SeriesRaceResult.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ public CompletionStatus getCompletionStatus() {
5959

6060
public boolean completedSeries() {
6161

62-
return numberOfRacesCompleted() >= ((SeriesRace)race).getMinimumNumberOfRaces();
62+
int i = numberOfRacesCompleted();
63+
int minimumNumberOfRaces = ((SeriesRace) race).getMinimumNumberOfRaces();
64+
return i >= minimumNumberOfRaces;
6365
}
6466

65-
protected boolean canCompleteSeries() {
67+
public boolean canCompleteSeries() {
6668

6769
final SeriesRace series_race = (SeriesRace) race;
6870
final int number_of_races_remaining = series_race.getNumberOfRacesInSeries() - series_race.getNumberOfRacesTakenPlace();

src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRace.java

+22-24
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.grahamkirby.race_timing.individual_race.IndividualRaceResult;
2828
import org.grahamkirby.race_timing.series_race.SeriesRace;
2929
import org.grahamkirby.race_timing.series_race.SeriesRaceInput;
30+
import org.grahamkirby.race_timing.series_race.SeriesRaceResult;
3031

3132
import java.io.IOException;
3233
import java.nio.file.Files;
@@ -111,7 +112,8 @@ protected List<Comparator<RaceResult>> getComparators() {
111112

112113
@Override
113114
protected List<Comparator<RaceResult>> getDNFComparators() {
114-
return List.of(this::compareNumberOfRacesCompleted);
115+
116+
return List.of(this::comparePossibleCompletion, this::compareNumberOfRacesCompleted);
115117
}
116118

117119
@Override
@@ -127,24 +129,29 @@ protected RaceResult getOverallResult(final Runner runner) {
127129
@Override
128130
protected Predicate<RaceResult> getResultInclusionPredicate() {
129131

130-
return (result -> qualifying_clubs.contains(((IndividualRaceResult) result).entry.runner.club));
132+
return result -> qualifying_clubs.contains(((IndividualRaceResult) result).entry.runner.club);
131133
}
132134

133135
public double calculateRaceScore(final IndividualRace individual_race, final Runner runner) {
134136

135-
final Duration runner_time = getResult(individual_race, runner);
137+
final Duration runner_time = individual_race.getRunnerTime(runner);
136138

137139
return runner_time != null ? divide(runner_time, individual_race.getMedianTime()) * SCORE_FOR_MEDIAN_POSITION : 0.0;
138140
}
139141

140-
public boolean hasCompletedCategory(GrandPrixRaceResult result, RaceCategory category) {
142+
public boolean hasCompletedRaceCategory(GrandPrixRaceResult result, RaceCategory category) {
141143

142144
return category.race_numbers().stream().
143145
anyMatch(race_number -> race_number <= result.scores.size() && result.scores.get(race_number - 1) > 0.0);
144146
}
145147

146148
//////////////////////////////////////////////////////////////////////////////////////////////////
147149

150+
private int comparePossibleCompletion(final RaceResult r1, final RaceResult r2) {
151+
152+
return Boolean.compare(((SeriesRaceResult)r2).canCompleteSeries(), ((SeriesRaceResult)r1).canCompleteSeries());
153+
}
154+
148155
private double divide(final Duration d1, final Duration d2) {
149156

150157
return (double)d1.toMillis() / (double)d2.toMillis();
@@ -157,22 +164,23 @@ private int compareNumberOfRacesCompleted(RaceResult r1, RaceResult r2) {
157164

158165
private void configureRaceCategories() throws IOException {
159166

160-
final String race_categories_path = getProperty(KEY_RACE_CATEGORIES_PATH);
161-
162167
race_categories = new ArrayList<>();
163168

164-
Files.readAllLines(getPath(race_categories_path)).stream().
169+
Files.readAllLines(getPath(getProperty(KEY_RACE_CATEGORIES_PATH))).stream().
165170
filter(line -> !line.startsWith(COMMENT_SYMBOL)).
166-
forEachOrdered(line -> {
167-
final String[] elements = line.split(",");
171+
forEachOrdered(this::configureRaceCategory);
172+
}
168173

169-
final String category_name = elements[0];
170-
final int minimum_number = Integer.parseInt(elements[1]);
174+
private void configureRaceCategory(final String line) {
171175

172-
final List<Integer> race_numbers = Arrays.stream(elements).skip(2).map(Integer::parseInt).toList();
176+
final String[] elements = line.split(",");
173177

174-
race_categories.add(new RaceCategory(category_name, minimum_number, race_numbers));
175-
});
178+
final String category_name = elements[0];
179+
final int minimum_number = Integer.parseInt(elements[1]);
180+
181+
final List<Integer> race_numbers = Arrays.stream(elements).skip(2).map(Integer::parseInt).toList();
182+
183+
race_categories.add(new RaceCategory(category_name, minimum_number, race_numbers));
176184
}
177185

178186
protected void processMultipleClubsForRunner(final String runner_name, final List<String> clubs) {
@@ -182,14 +190,4 @@ protected void processMultipleClubsForRunner(final String runner_name, final Lis
182190
else
183191
noteMultipleClubsForRunnerName(runner_name, clubs);
184192
}
185-
186-
private Duration getResult(final IndividualRace individual_race, final Runner runner) {
187-
188-
return individual_race.getOverallResults().stream().
189-
map(result -> ((IndividualRaceResult)result)).
190-
filter(result -> runner.equals(result.entry.runner)).
191-
map(IndividualRaceResult::duration).
192-
findFirst().
193-
orElse(null);
194-
}
195193
}

src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceOutputCSV.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void printResult(final RaceResult r) throws IOException {
9191
writer.append(STR.",\{result.getCompletionStatus() == CompletionStatus.COMPLETED ? Math.round(result.totalScore()) : "-"},\{result.getCompletionStatus() == CompletionStatus.COMPLETED ? "Y" : "N"}");
9292

9393
for (RaceCategory category : ((GrandPrixRace)race).race_categories) {
94-
writer.append(",").append(grand_prix_race.hasCompletedCategory(result, category) ? "Y" : "N");
94+
writer.append(",").append(grand_prix_race.hasCompletedRaceCategory(result, category) ? "Y" : "N");
9595
}
9696

9797
writer.append("\n");

src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceOutputHTML.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public void printResult(final RaceResult r) throws IOException {
122122
""");
123123

124124
for (RaceCategory category : ((GrandPrixRace)race).race_categories) {
125-
writer.append("<td>").append(grand_prix_race.hasCompletedCategory(result, category) ? "Y" : "N").append("</td>");
125+
writer.append("<td>").append(grand_prix_race.hasCompletedRaceCategory(result, category) ? "Y" : "N").append("</td>");
126126
}
127127

128128
writer.append("""

src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceResult.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,14 @@ public boolean shouldBeDisplayedInResults() {
5555
@Override
5656
public boolean shouldDisplayPosition() {
5757

58-
return ((SeriesRace)race).seriesHasCompleted() ? completedSeries() : canCompleteSeries();
58+
return ((SeriesRace) race).seriesHasCompleted() ? completedSeries() : canCompleteSeries();
5959
}
6060

6161
protected double totalScore() {
6262

63-
final int number_of_counting_scores = Math.min(((GrandPrixRace) race).getMinimumNumberOfRaces(), numberOfRacesCompleted());
63+
final int minimum_number_of_races = ((GrandPrixRace) race).getMinimumNumberOfRaces();
64+
final int number_of_races_completed = numberOfRacesCompleted();
65+
final int number_of_counting_scores = Math.min(minimum_number_of_races, number_of_races_completed);
6466

6567
return scores.stream().
6668
sorted().

0 commit comments

Comments
 (0)