Skip to content

Commit 27e00d8

Browse files
committed
Progress on updates to lap race, tests not passing.
1 parent e6699ef commit 27e00d8

18 files changed

+730
-522
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package common;
2+
3+
public class MissingTimeException extends RuntimeException {
4+
}

src/main/java/common/Race.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ protected static Properties readProperties(final String config_file_path) throws
5454
}
5555

5656
protected void readProperties() {
57+
5758
working_directory_path = Paths.get(properties.getProperty("WORKING_DIRECTORY"));
5859
dnf_string = properties.getProperty("DNF_LEGS");
5960
}
@@ -62,15 +63,16 @@ public Path getWorkingDirectoryPath() {
6263
return working_directory_path;
6364
}
6465

66+
public RawResult[] getRawResults() {
67+
return raw_results;
68+
}
69+
6570
protected String getPropertyWithDefault(final String property_key, final String default_value) {
6671

6772
final String value = properties.getProperty(property_key);
6873
return value == null || value.isBlank() ? default_value : value;
6974
}
7075

71-
72-
73-
7476
protected static Duration parseTime(String element) {
7577

7678
element = element.strip();

src/main/java/common/RawResult.java

+23-3
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,21 @@
66

77
public class RawResult {
88

9-
final int bib_number;
10-
final Duration recorded_finish_time; // Relative to start of leg 1.
9+
// Leg number is optional, depending on whether it was recorded on paper sheet.
10+
final int bib_number, leg_number;
11+
Duration recorded_finish_time; // Relative to start of leg 1.
12+
boolean interpolated_time = false;
1113

1214
public RawResult(final String file_line) {
1315

1416
final String[] elements = file_line.split("\t");
1517

1618
final String bib_number_as_string = elements[0];
19+
final String time_as_string = elements[1];
1720

1821
bib_number = Integer.parseInt(bib_number_as_string);
19-
recorded_finish_time = Race.parseTime(elements[1]);
22+
recorded_finish_time = time_as_string.equals("?") ? null : Race.parseTime(time_as_string);
23+
leg_number = elements.length > 2 ? Integer.parseInt(elements[2]) : 0;
2024
}
2125

2226
public int getBibNumber() {
@@ -26,4 +30,20 @@ public int getBibNumber() {
2630
public Duration getRecordedFinishTime() {
2731
return recorded_finish_time;
2832
}
33+
34+
public void setRecordedFinishTime(Duration finish_time) {
35+
recorded_finish_time = finish_time;
36+
}
37+
38+
public boolean isInterpolatedTime() {
39+
return interpolated_time;
40+
}
41+
42+
public void setInterpolatedTime(boolean interpolated_time) {
43+
this.interpolated_time = interpolated_time;
44+
}
45+
46+
public int getLegNumber() {
47+
return leg_number;
48+
}
2949
}

src/main/java/individual_race/IndividualRaceOutputPDF.java

-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
import com.lowagie.text.*;
44
import com.lowagie.text.pdf.PdfWriter;
55
import common.Category;
6-
import lap_race.LapRace;
7-
import lap_race.Team;
8-
import lap_race.TeamResult;
96

107
import java.io.IOException;
118
import java.io.OutputStream;

src/main/java/lap_race/LapRace.java

+73-16
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public void processResults() throws IOException {
8585
printLegResults();
8686
printPrizes();
8787
printCombined();
88+
printCollatedTimes();
8889
}
8990

9091
@Override
@@ -94,6 +95,7 @@ protected void configure() throws IOException {
9495

9596
configureHelpers();
9697
configureInputData();
98+
configureInterpolatedTimes();
9799
configureMassStarts();
98100
configurePairedLegs();
99101
configureIndividualLegStarts();
@@ -126,6 +128,49 @@ private void configureInputData() throws IOException {
126128
raw_results = input.loadRawResults();
127129
}
128130

131+
private void configureInterpolatedTimes() {
132+
133+
int raw_result_index = 0;
134+
int previous_non_null_time_index;
135+
136+
while (raw_result_index < raw_results.length && raw_results[raw_result_index].getRecordedFinishTime() == null) raw_result_index++;
137+
138+
for (int i = 0; i < raw_result_index - 1; i++)
139+
raw_results[i].setRecordedFinishTime(raw_results[raw_result_index].getRecordedFinishTime());
140+
141+
while (raw_result_index < raw_results.length) {
142+
143+
while (raw_result_index < raw_results.length && raw_results[raw_result_index].getRecordedFinishTime() != null) raw_result_index++;
144+
previous_non_null_time_index = raw_result_index - 1;
145+
146+
while (raw_result_index < raw_results.length && raw_results[raw_result_index].getRecordedFinishTime() == null) raw_result_index++;
147+
148+
if (raw_result_index < raw_results.length) {
149+
final int number_of_consecutive_null_times = raw_result_index - previous_non_null_time_index - 1;
150+
151+
System.out.println("number_of_consecutive_null_times: " + number_of_consecutive_null_times);
152+
Duration time_step = raw_results[raw_result_index].getRecordedFinishTime().
153+
minus(raw_results[previous_non_null_time_index].getRecordedFinishTime()).
154+
dividedBy(number_of_consecutive_null_times + 1);
155+
156+
System.out.println("time before: " + raw_results[previous_non_null_time_index].getRecordedFinishTime());
157+
System.out.println("time after: " + raw_results[raw_result_index].getRecordedFinishTime());
158+
System.out.println("step: " + time_step);
159+
160+
161+
for (int i = previous_non_null_time_index + 1; i < raw_result_index; i++) {
162+
raw_results[i].setRecordedFinishTime(raw_results[i - 1].getRecordedFinishTime().plus(time_step));
163+
raw_results[i].setInterpolatedTime(true);
164+
}
165+
}
166+
else {
167+
for (int i = previous_non_null_time_index + 1; i < raw_result_index; i++) {
168+
raw_results[i].setRecordedFinishTime(Race.DUMMY_DURATION);
169+
}
170+
}
171+
}
172+
}
173+
129174
private void configureMassStarts() {
130175

131176
start_times_for_mass_starts = new Duration[number_of_legs];
@@ -257,27 +302,36 @@ private void fillLegFinishTimes() {
257302
leg_results[leg_index].DNF = false;
258303
}
259304

260-
if (leg_times_swap_string != null) swapLegTimes();
261-
}
262-
263-
private void swapLegTimes() {
264-
for (final String leg_time_swap : leg_times_swap_string.split(","))
265-
swapLegTimes(leg_time_swap);
266-
}
305+
// if (leg_times_swap_string != null) swapLegTimes();
267306

268-
private void swapLegTimes(final String leg_time_swap) {
269307

270-
final ResultWithLegIndex result_with_leg = getResultWithLegIndex(leg_time_swap);
271308

272-
final LegResult[] leg_results = result_with_leg.result().leg_results;
273-
final int leg_index = result_with_leg.leg_index();
309+
for (TeamResult team_result : overall_results) {
310+
Arrays.sort(team_result.leg_results, Comparator.comparingInt(o -> o.leg_number));
274311

275-
final Duration temp = leg_results[leg_index - 1].finish_time;
276-
277-
leg_results[leg_index - 1].finish_time = leg_results[leg_index].finish_time;
278-
leg_results[leg_index].finish_time = temp;
312+
for (int i = 0; i < team_result.leg_results.length; i++)
313+
team_result.leg_results[i].leg_number = i+1;
314+
}
279315
}
280316

317+
// private void swapLegTimes() {
318+
// for (final String leg_time_swap : leg_times_swap_string.split(","))
319+
// swapLegTimes(leg_time_swap);
320+
// }
321+
//
322+
// private void swapLegTimes(final String leg_time_swap) {
323+
//
324+
// final ResultWithLegIndex result_with_leg = getResultWithLegIndex(leg_time_swap);
325+
//
326+
// final LegResult[] leg_results = result_with_leg.result().leg_results;
327+
// final int leg_index = result_with_leg.leg_index();
328+
//
329+
// final Duration temp = leg_results[leg_index - 1].finish_time;
330+
//
331+
// leg_results[leg_index - 1].finish_time = leg_results[leg_index].finish_time;
332+
// leg_results[leg_index].finish_time = temp;
333+
// }
334+
281335
private ResultWithLegIndex getResultWithLegIndex(final String bib_and_leg) {
282336

283337
// String of form "bib-number/leg-number"
@@ -450,7 +504,10 @@ private void printPrizes() throws IOException {
450504
}
451505

452506
private void printCombined() throws IOException {
453-
454507
output_HTML.printCombined();
455508
}
509+
510+
private void printCollatedTimes() throws IOException {
511+
((LapRaceOutputText)output_text).printCollatedTimes();
512+
}
456513
}

src/main/java/lap_race/LapRaceInput.java

+18-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package lap_race;
22

3+
import common.MissingTimeException;
34
import common.RawResult;
45

56
import java.io.IOException;
@@ -12,11 +13,10 @@ public class LapRaceInput {
1213

1314
final LapRace race;
1415

15-
Path input_directory_path;
16-
Path entries_path;
17-
Path raw_results_path;
18-
String entries_filename;
19-
String raw_results_filename;
16+
Path input_directory_path, entries_path, raw_results_path, paper_results_path;
17+
String entries_filename, raw_results_filename, paper_results_filename;
18+
19+
int number_of_raw_results;
2020

2121
public LapRaceInput(final LapRace race) {
2222

@@ -34,13 +34,15 @@ private void readProperties() {
3434

3535
entries_filename = race.getProperties().getProperty("ENTRIES_FILENAME");
3636
raw_results_filename = race.getProperties().getProperty("RAW_RESULTS_FILENAME");
37+
paper_results_filename = race.getProperties().getProperty("PAPER_RESULTS_FILENAME");
3738
}
3839

3940
private void constructFilePaths() {
4041

4142
input_directory_path = race.getWorkingDirectoryPath().resolve("input");
4243
entries_path = input_directory_path.resolve(entries_filename);
4344
raw_results_path = input_directory_path.resolve(raw_results_filename);
45+
paper_results_path = input_directory_path.resolve(paper_results_filename);
4446
}
4547

4648
Team[] loadEntries() throws IOException {
@@ -89,15 +91,23 @@ private boolean entriesAlreadyContain(final Team[] entries, final String team_na
8991

9092
RawResult[] loadRawResults() throws IOException {
9193

92-
final List<String> lines = Files.readAllLines(raw_results_path);
9394
final List<RawResult> raw_results = new ArrayList<>();
9495

95-
for (String line : lines)
96+
for (String line : Files.readAllLines(raw_results_path))
97+
loadRawResult(raw_results, line);
98+
99+
number_of_raw_results = raw_results.size();
100+
101+
for (String line : Files.readAllLines(paper_results_path))
96102
loadRawResult(raw_results, line);
97103

98104
return raw_results.toArray(new RawResult[0]);
99105
}
100106

107+
int getNumberOfRawResults() {
108+
return number_of_raw_results;
109+
}
110+
101111
private static void loadRawResult(final List<RawResult> raw_results, String line) {
102112

103113
int comment_start_index = line.indexOf("//");
@@ -115,7 +125,7 @@ private static void loadRawResult(final List<RawResult> raw_results, String line
115125

116126
final RawResult previous_result = !raw_results.isEmpty() ? raw_results.get(raw_results.size() - 1) : null;
117127

118-
if (previous_result != null && previous_result.getRecordedFinishTime().compareTo(result.getRecordedFinishTime()) > 0)
128+
if (result.getRecordedFinishTime() != null && previous_result != null && previous_result.getRecordedFinishTime() != null && previous_result.getRecordedFinishTime().compareTo(result.getRecordedFinishTime()) > 0)
119129
throw new RuntimeException("result " + (raw_results.size() + 1) + " out of order");
120130

121131
raw_results.add(result);

src/main/java/lap_race/LapRaceOutput.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ public abstract class LapRaceOutput {
3030
String year;
3131
String race_name_for_results;
3232
String race_name_for_filenames;
33-
String overall_results_filename;
34-
String detailed_results_filename;
35-
String prizes_filename;
33+
String overall_results_filename, detailed_results_filename, prizes_filename, collated_times_filename;
3634
Path output_directory_path;
3735

3836
public LapRaceOutput(final LapRace race) {
@@ -59,6 +57,7 @@ private void constructFilePaths() {
5957
overall_results_filename = race_name_for_filenames + "_overall_" + year;
6058
detailed_results_filename = race_name_for_filenames + "_detailed_" + year;
6159
prizes_filename = race_name_for_filenames + "_prizes_" + year;
60+
collated_times_filename = "times_collated";
6261

6362
output_directory_path = race.getWorkingDirectoryPath().resolve("output");
6463
}

src/main/java/lap_race/LapRaceOutputText.java

+57-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package lap_race;
22

33
import common.Category;
4+
import common.RawResult;
45

56
import java.io.IOException;
67
import java.io.OutputStreamWriter;
78
import java.nio.file.Files;
89
import java.nio.file.Path;
10+
import java.util.HashMap;
911
import java.util.List;
12+
import java.util.Map;
1013

1114
public class LapRaceOutputText extends LapRaceOutput {
1215

@@ -16,7 +19,6 @@ public LapRaceOutputText(final LapRace results) {
1619

1720
@Override
1821
public void printOverallResults() {
19-
2022
throw new UnsupportedOperationException();
2123
}
2224

@@ -75,4 +77,58 @@ private void printPrizes(final Category category, final OutputStreamWriter write
7577

7678
writer.append("\n\n");
7779
}
80+
81+
public void printCollatedTimes() throws IOException {
82+
83+
final Path collated_times_text_path = output_directory_path.resolve(collated_times_filename + ".txt");
84+
85+
try (final OutputStreamWriter writer = new OutputStreamWriter(Files.newOutputStream(collated_times_text_path))) {
86+
87+
Map<Integer, Integer> leg_finished_count = new HashMap<>();
88+
89+
for (int i = 0; i < race.getRawResults().length; i++) {
90+
91+
if (i == race.input.getNumberOfRawResults()) {
92+
writer.append("""
93+
94+
// Remaining times from paper recording sheet only.
95+
96+
""");
97+
}
98+
99+
RawResult raw_result = race.getRawResults()[i];
100+
101+
final int bib_number = raw_result.getBibNumber();
102+
final int legs_already_finished = leg_finished_count.getOrDefault(bib_number, 0);
103+
104+
writer.append(String.valueOf(bib_number)).
105+
append("\t").
106+
append(format(raw_result.getRecordedFinishTime()));
107+
108+
StringBuilder comment = new StringBuilder();
109+
110+
if (raw_result.getLegNumber() > 0) {
111+
writer.append("\t").append(String.valueOf(raw_result.getLegNumber()));
112+
if (legs_already_finished >= raw_result.getLegNumber()) {
113+
comment.append("Leg ").
114+
append(raw_result.getLegNumber()).
115+
append(" finisher was runner ").
116+
append(legs_already_finished + 1).
117+
append(" to finish for team.");
118+
}
119+
}
120+
121+
if (raw_result.isInterpolatedTime())
122+
comment.append("Interpolated time.");
123+
124+
if (!comment.isEmpty()) {
125+
writer.append("\t// ").append(comment);
126+
}
127+
128+
leg_finished_count.put(bib_number, legs_already_finished + 1);
129+
130+
writer.append("\n");
131+
}
132+
}
133+
}
78134
}

0 commit comments

Comments
 (0)