added competitor compression for competitor ordering per race

This commit is contained in:
Axel Uhl committed 2013-06-10 17:39:36 +02:00
1 parent 0ac0dbcaa3
commit 38083faedd
3 files changed
+53 -4

No files matched your search

@@ -420,11 +420,20 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
competitorDisplayNames = expandedCompetitorDisplayNames;
}
// TODO ensure that the races collection has all the necessary RaceColumnDTO objects before looking them up by name
Set<RaceColumnDTO> columnsForWhichToExpandCompetitorOrderingPerRace = new HashSet<RaceColumnDTO>(getCompetitorOrderingPerRace().keySet());
for (String raceColumnNameForWhichCompetitorOrderingPerRaceUnchanged : raceColumnNamesForWhichCompetitorOrderingPerRaceUnchanged) {
RaceColumnDTO raceColumn = getRaceColumnByName(raceColumnNameForWhichCompetitorOrderingPerRaceUnchanged);
// be on the safe side regarding the equals/hashCode implementation of RaceColumnDTO and look it up by name for old and new version
RaceColumnDTO previousRaceColumn = previousVersion.getRaceColumnByName(raceColumnNameForWhichCompetitorOrderingPerRaceUnchanged);
setCompetitorsFromBestToWorst(raceColumn, previousVersion.getCompetitorsFromBestToWorst(previousRaceColumn));
columnsForWhichToExpandCompetitorOrderingPerRace.remove(raceColumn);
}
// expand all other ordered competitor lists for all races where it changed
for (RaceColumnDTO columnForWhichToExpandCompetitorOrderingPerRace : columnsForWhichToExpandCompetitorOrderingPerRace) {
List<CompetitorDTO> competitorsFromBestToWorstForRace = getCompetitorsFromBestToWorst(columnForWhichToExpandCompetitorOrderingPerRace);
for (int i=competitorsFromBestToWorstForRace.size()-1; i>=0; i--) {
competitorsFromBestToWorstForRace.set(i, competitorsFromBestToWorstForRace.get(i).getCompetitorFromPrevious(previousVersion));
}
}
final Set<CompetitorDTO> rowsUnchangedForCompetitors = new HashSet<CompetitorDTO>();
if (rowsUnchanged != null) {
@@ -557,10 +566,17 @@ public class IncrementalLeaderboardDTO extends LeaderboardDTO implements Increme
final HashMap<RaceColumnDTO, List<CompetitorDTO>> competitorOrderingPerRace = new HashMap<RaceColumnDTO, List<CompetitorDTO>>(getCompetitorOrderingPerRace());
for (RaceColumnDTO raceColumn : this.getRaceList()) {
List<CompetitorDTO> competitorsFromBestToWorstForRaceColumn = getCompetitorsFromBestToWorst(raceColumn);
List<CompetitorDTO> previousCompetitorsFrombestToWorstForRaceColumn = previousVersion.getCompetitorsFromBestToWorst(raceColumn);
if (Util.equalsWithNull(competitorsFromBestToWorstForRaceColumn, previousCompetitorsFrombestToWorstForRaceColumn)) {
List<CompetitorDTO> previousCompetitorsFromBestToWorstForRaceColumn = previousVersion.getCompetitorsFromBestToWorst(raceColumn);
if (Util.equalsWithNull(competitorsFromBestToWorstForRaceColumn, previousCompetitorsFromBestToWorstForRaceColumn)) {
raceColumnNamesForWhichCompetitorOrderingPerRaceUnchanged.add(raceColumn.getName());
competitorOrderingPerRace.remove(raceColumn);
} else {
// try at least partial compaction
List<CompetitorDTO> compactedCompetitorsFromBestToWorstForRaceColumn = new ArrayList<CompetitorDTO>();
for (CompetitorDTO competitor : competitorsFromBestToWorstForRaceColumn) {
compactedCompetitorsFromBestToWorstForRaceColumn.add(compactCompetitorMap.get(competitor));
}
competitorOrderingPerRace.put(raceColumn, compactedCompetitorsFromBestToWorstForRaceColumn);
}
}
setCompetitorOrderingPerRace(competitorOrderingPerRace);
@@ -99,11 +99,11 @@ public class LeaderboardDTO extends AbstractLeaderboardDTO implements Serializab
competitorOrderingPerRace.put(raceColumn, orderedCompetitors);
}
protected void setCompetitorOrderingPerRace(Map<RaceColumnDTO, List<CompetitorDTO>> competitorOrderingPerRace) {
public void setCompetitorOrderingPerRace(Map<RaceColumnDTO, List<CompetitorDTO>> competitorOrderingPerRace) {
this.competitorOrderingPerRace = competitorOrderingPerRace;
}
protected Map<RaceColumnDTO, List<CompetitorDTO>> getCompetitorOrderingPerRace() {
public Map<RaceColumnDTO, List<CompetitorDTO>> getCompetitorOrderingPerRace() {
return competitorOrderingPerRace;
}
@@ -28,6 +28,7 @@ import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.LeaderboardEntryDTO;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
import com.sap.sailing.domain.common.dto.LegEntryDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.test.StoredTrackBasedTest;
import com.sap.sailing.util.ClonerImpl;
@@ -223,4 +224,36 @@ public class LeaderboardDTODiffingTest {
LeaderboardDTO applied = newVersion.getLeaderboardDTO(previousVersion);
assertEquals(newDisplayNamesBeforeStripping, applied.competitorDisplayNames);
}
@Test
public void testCompetitorOrderingInRaceChange() {
RaceColumnDTO r9 = newVersion.getRaceColumnByName("R9");
Map<RaceColumnDTO, List<CompetitorDTO>> newCompetitorOrderingPerRace = new HashMap<RaceColumnDTO, List<CompetitorDTO>>(newVersion.getCompetitorOrderingPerRace());
newVersion.setCompetitorOrderingPerRace(newCompetitorOrderingPerRace);
List<CompetitorDTO> newOrdering = new ArrayList<CompetitorDTO>(newVersion.getCompetitorsFromBestToWorst(r9));
newVersion.setCompetitorsFromBestToWorst(r9, newOrdering);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew);
newOrdering.add(somebodyNew);
CompetitorDTO formerRank13 = newOrdering.remove(13);
newOrdering.add(12, formerRank13);
List<CompetitorDTO> newOrderBeforeStripping = new ArrayList<CompetitorDTO>(newOrdering);
newVersion.strip(previousVersion);
for (RaceColumnDTO raceColumn : newVersion.getRaceList()) {
if (!raceColumn.getName().equals("R9")) {
assertNull(newVersion.getCompetitorsFromBestToWorst(raceColumn));
}
}
assertEquals(newVersion.getCompetitorsFromBestToWorst(r9).size()-1, newVersion.getCompetitorsFromBestToWorst(r9).indexOf(somebodyNew));
for (CompetitorDTO compactSuppressedCompetitor : newVersion.getCompetitorsFromBestToWorst(r9)) {
if (compactSuppressedCompetitor != somebodyNew) {
assertFalse(compactSuppressedCompetitor instanceof CompetitorDTOImpl); // assert that the existing competitor was compacted
}
}
LeaderboardDTO applied = newVersion.getLeaderboardDTO(previousVersion);
assertEquals(newOrderBeforeStripping, applied.getCompetitorsFromBestToWorst(applied.getRaceColumnByName("R9")));
}
}