mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-21 21:25:38 +00:00
bug5738: implemented logic to skip empty series in CurrentRaceFilterImpl
This commit is contained in:
+27
-3
@@ -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
|
||||
|
||||
+24
-7
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user