bug5738: implemented logic to skip empty series in CurrentRaceFilterImpl

This commit is contained in:
Axel Uhl
2022-06-02 21:03:06 +02:00
parent 3c45fc3307
commit 05008e9a09
2 changed files with 51 additions and 10 deletions
@@ -89,7 +89,7 @@ public class CurrentRaceFilterImplTest {
isafSeries.add(new SeriesWithRowsImpl("Qualification", /* isMedal */ false, /* isFleetsCanRunInParallel */ true, isafQualificationRaceRows));
final List<RaceRow> isafFinalRaceRows = Arrays.asList(createRaceRow(6, 5, "F", "Gold"), createRaceRow(6, 5, "F", "Silver"));
isafSeries.add(new SeriesWithRowsImpl("Final", /* isMedal */ false, /* isFleetsCanRunInParallel */ true, isafFinalRaceRows));
final List<RaceRow> isafMedalRaceRows = Arrays.asList(createRaceRow(1, 1, "M", ")Medal"));
final List<RaceRow> isafMedalRaceRows = Arrays.asList(createRaceRow(1, 1, "M", "Medal"));
isafSeries.add(new SeriesWithRowsImpl("Medal", /* isMedal */ true, /* isFleetsCanRunInParallel */ true, isafMedalRaceRows));
final RaceGroup isaf = new RaceGroupImpl("ISAF", /* displayName */ null,
new BoatClassImpl(BoatClassMasterdata._470), /* canBoatsOfCompetitorsChangePerRace */ false,
@@ -129,9 +129,9 @@ public class CurrentRaceFilterImplTest {
private RaceGroup createiQFOilRegatta() {
final List<SeriesWithRows> iQFOilSeries = new ArrayList<>();
final List<RaceRow> iQFOilOpeningSeries1RaceRows = Arrays.asList(createRaceRow(1, 16, "R", "Default"));
final List<RaceRow> iQFOilOpeningSeries1RaceRows = Arrays.asList(createRaceRow(1, 1, "R", "Default"));
iQFOilSeries.add(new SeriesWithRowsImpl("Opening (1)", /* isMedal */ false, /* isFleetsCanRunInParallel */ true, iQFOilOpeningSeries1RaceRows));
final List<RaceRow> iQFOilMarathonRaceRows = Arrays.asList(createRaceRow(16, 0, "R", "Default"));
final List<RaceRow> iQFOilMarathonRaceRows = Arrays.asList(createRaceRow(2, 0, "R", "Default"));
iQFOilSeries.add(new SeriesWithRowsImpl("Marathon", /* isMedal */ false, /* isFleetsCanRunInParallel */ true, iQFOilMarathonRaceRows));
final List<RaceRow> iQFOilOpeningSeries2RaceRows = Arrays.asList(createRaceRow(16, 0, "R", "Default"));
iQFOilSeries.add(new SeriesWithRowsImpl("Opening (2)", /* isMedal */ false, /* isFleetsCanRunInParallel */ true, iQFOilOpeningSeries2RaceRows));
@@ -229,6 +229,30 @@ public class CurrentRaceFilterImplTest {
assertTrue(current505Races.contains(get(_505, "R2", "Default"))); // it's unscheduled and has a scheduled immediate predecessor
}
@Test
public void testSchedulingRaceAfterEmptySeries() {
{
final Set<SimpleFilterableRace> currentRaces = fixture.getCurrentRaces();
// with all races unscheduled we can expect the first race of each regatta's first series to show
final Set<SimpleFilterableRace> currentiQFOilRaces = currentRaces.stream().filter(r->r.getRaceGroup() == iQFOil).collect(Collectors.toSet());
assertEquals(1, currentiQFOilRaces.size());
final SimpleFilterableRace firstRace = currentiQFOilRaces.iterator().next();
assertEquals("R1", firstRace.getRaceColumnName());
}
get(iQFOil, "R1", "Default").setStatus(RaceLogRaceStatus.SCHEDULED);
{
final Set<SimpleFilterableRace> currentRaces = fixture.getCurrentRaces();
final Set<SimpleFilterableRace> currentiQFOilRaces = currentRaces.stream().filter(r->r.getRaceGroup() == iQFOil).collect(Collectors.toSet());
assertEquals(5, currentiQFOilRaces.size());
assertTrue(currentiQFOilRaces.contains(get(iQFOil, "R1", "Default"))); // it's scheduled, so it shows
assertTrue(currentiQFOilRaces.contains(get(iQFOil, "QF1", "Quarter Final")));
assertTrue(currentiQFOilRaces.contains(get(iQFOil, "QF1", "Semi Final")));
assertTrue(currentiQFOilRaces.contains(get(iQFOil, "QF1", "Quarter Final")));
assertTrue(currentiQFOilRaces.contains(get(iQFOil, "QF1", "Semi Final")));
}
}
@Test
public void testSchedulingFirstIsafRace() {
// with all races unscheduled we can expect the first race of each regatta's first series to show
@@ -4,6 +4,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -156,10 +157,25 @@ public class CurrentRaceFilterImpl<T extends FilterableRace> implements CurrentR
* in the first fleet of the series.
*/
private boolean hasNoPredecessor(FilterableRace race) {
return race.getZeroBasedSeriesIndex() == 0 && race.getZeroBasedIndexInFleet() == 0 &&
return race.getZeroBasedIndexInFleet() == 0 && isInFirstNonEmptySeries(race) &&
(race.getSeries().isFleetsCanRunInParallel() || Util.indexOf(race.getSeries().getFleets(), race.getFleet()) == 0);
}
private boolean isInFirstNonEmptySeries(FilterableRace race) {
for (int seriesIndex = race.getZeroBasedSeriesIndex() - 1; seriesIndex>=0; seriesIndex--) {
final SeriesWithRows seriesWithRows = Util.get(race.getRaceGroup().getSeries(), seriesIndex);
if (!isEmptySeries(seriesWithRows)) {
return false;
}
}
return true;
}
private boolean isEmptySeries(SeriesWithRows seriesWithRows) {
final Iterable<RaceRow> raceRows = seriesWithRows.getRaceRows();
return !raceRows.iterator().hasNext() || !raceRows.iterator().next().getCells().iterator().hasNext();
}
/**
* Two cases need to be distinguished: the races in different fleets of the same series may be run
* in parallel or not.<p>
@@ -231,17 +247,18 @@ public class CurrentRaceFilterImpl<T extends FilterableRace> implements CurrentR
private Iterable<T> getLastRacesFromImmediatelyPrecedingSeries(FilterableRace race, final RaceGroup raceGroup) {
final Set<T> lastRacesInImmediatelyPrecedingSeries = new HashSet<>();
final SeriesWithRows immediatelyPrecedingSeries = Util.get(raceGroup.getSeries(), race.getZeroBasedSeriesIndex()-1);
if (immediatelyPrecedingSeries.isFleetsCanRunInParallel()) {
final List<SeriesWithRows> immediatelyPrecedingSerieses = Util.asList(raceGroup.getSeries()).subList(0, race.getZeroBasedSeriesIndex());
SeriesWithRows lastPrecedingNonEmptySeries = Util.last(Util.filter(immediatelyPrecedingSerieses, series->!isEmptySeries(series)));
if (lastPrecedingNonEmptySeries.isFleetsCanRunInParallel()) {
// add all last races of all fleets in immediately preceding series because they may be run in parallel
for (final RaceRow rowInImmediatelyPrecedingSeries : immediatelyPrecedingSeries.getRaceRows()) {
final T lastRaceInRow = getLastRaceInRow(raceGroup, immediatelyPrecedingSeries, rowInImmediatelyPrecedingSeries);
for (final RaceRow rowInImmediatelyPrecedingSeries : lastPrecedingNonEmptySeries.getRaceRows()) {
final T lastRaceInRow = getLastRaceInRow(raceGroup, lastPrecedingNonEmptySeries, rowInImmediatelyPrecedingSeries);
lastRacesInImmediatelyPrecedingSeries.add(lastRaceInRow);
}
} else {
// add only the last race of the last fleet in the immediately preceding series
final RaceRow lastRowInImmediatelyPrecedingSeries = Util.last(immediatelyPrecedingSeries.getRaceRows());
lastRacesInImmediatelyPrecedingSeries.add(getLastRaceInRow(raceGroup, immediatelyPrecedingSeries, lastRowInImmediatelyPrecedingSeries));
final RaceRow lastRowInImmediatelyPrecedingSeries = Util.last(lastPrecedingNonEmptySeries.getRaceRows());
lastRacesInImmediatelyPrecedingSeries.add(getLastRaceInRow(raceGroup, lastPrecedingNonEmptySeries, lastRowInImmediatelyPrecedingSeries));
}
return lastRacesInImmediatelyPrecedingSeries;
}