bug3484 removed template factory cache and fixed race log bug

This commit is contained in:
Raphael Müßeler committed 2017-12-19 10:38:07 +01:00
1 parent 3bc2526639
commit db131c69a8
14 files changed
+221 -195

No files matched your search

@@ -1,5 +1,5 @@
package com.sap.sailing.domain.base;
import com.sap.sse.pairinglist.CompetitionFormat;
public interface PairingListRegattaAdapter extends CompetitionFormat<RaceColumn, Fleet, Competitor> {
public interface PairingListRegattaAdapter extends CompetitionFormat<RaceColumn, Fleet, Competitor, Boat> {
}
@@ -1027,25 +1027,26 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
public void ok(PairingListTemplateDTO editedObject) {
BusyDialog busyDialog = new BusyDialog();
busyDialog.show();
try{
sailingService.calculatePairingList(leaderboardDTO.getName(), editedObject.getSelectedFlightNames(), editedObject.getCompetitorCount(), editedObject.getFlightMultiplier(),
new AsyncCallback<PairingListTemplateDTO>() {
try {
sailingService.calculatePairingList(leaderboardDTO.getName(),
editedObject.getSelectedFlightNames(), editedObject.getCompetitorCount(),
editedObject.getFlightMultiplier(), new AsyncCallback<PairingListTemplateDTO>() {
@Override
public void onFailure(Throwable caught) {
busyDialog.hide();
System.out.println(caught);
}
@Override
public void onFailure(Throwable caught) {
busyDialog.hide();
System.out.println(caught);
}
@Override
public void onSuccess(PairingListTemplateDTO result) {
busyDialog.hide();
openPairingListCreationDialog(leaderboardDTO, result);
}
});
}catch(Exception exception){
//TODO show error somehow
@Override
public void onSuccess(PairingListTemplateDTO result) {
busyDialog.hide();
openPairingListCreationDialog(leaderboardDTO, result);
}
});
} catch (Exception exception) {
// TODO show error somehow
}
}
@@ -30,9 +30,7 @@ public class PairingListCreationDialog extends DataEntryDialog<PairingListTempla
private final StrippedLeaderboardDTO leaderboardDTO;
private final StringMessages stringMessages;
private final Button applyToRacelogButton;
private final Button cSVExportButton;
private final Button printViewButton;
private final Button applyToRacelogButton, cSVExportButton, printViewButton, refreshButton;
public PairingListCreationDialog(StrippedLeaderboardDTO leaderboardDTO, final StringMessages stringMessages,
PairingListTemplateDTO template, SailingServiceAsync sailingService) {
@@ -46,6 +44,7 @@ public class PairingListCreationDialog extends DataEntryDialog<PairingListTempla
applyToRacelogButton = new Button(stringMessages.applyToRacelog());
cSVExportButton = new Button(stringMessages.csvExport());
printViewButton = new Button(stringMessages.printView());
refreshButton = new Button(stringMessages.refresh());
if (template.getCompetitorCount() != leaderboardDTO.competitorsCount) {
this.disableApplyToRacelogs();
@@ -130,9 +129,12 @@ public class PairingListCreationDialog extends DataEntryDialog<PairingListTempla
cSVExportButton.ensureDebugId("CSVExportButton");
printViewButton.getElement().getStyle().setMargin(3, Unit.PX);
printViewButton.ensureDebugId("printViewButton");
refreshButton.getElement().getStyle().setMargin(3, Unit.PX);
refreshButton.ensureDebugId("printViewButton");
getRightButtonPannel().add(applyToRacelogButton);
getRightButtonPannel().add(cSVExportButton);
getRightButtonPannel().add(printViewButton);
getRightButtonPannel().add(refreshButton);
getRightButtonPannel().add(new HTML(stringMessages.printHint()));
if (!applyToRacelogButton.isEnabled()) {
Label label = new Label(stringMessages.blockedApplyButton());
@@ -168,6 +170,38 @@ public class PairingListCreationDialog extends DataEntryDialog<PairingListTempla
Window.open(link, "", "");
}
});
refreshButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
getDialogBox().hide();
BusyDialog busyDialog = new BusyDialog();
busyDialog.show();
try {
sailingService.calculatePairingList(leaderboardDTO.getName(),
template.getSelectedFlightNames(), template.getCompetitorCount(),
template.getFlightMultiplier(), new AsyncCallback<PairingListTemplateDTO>() {
@Override
public void onFailure(Throwable caught) {
busyDialog.hide();
System.out.println(caught);
}
@Override
public void onSuccess(PairingListTemplateDTO result) {
busyDialog.hide();
PairingListCreationDialog dialog = new PairingListCreationDialog(leaderboardDTO,
stringMessages, result, sailingService);
dialog.show();
}
});
} catch (Exception exception) {
// TODO show error somehow
}
}
});
}
//TODO set Anchor link to Button (see link with settings under configure url)
@@ -6825,7 +6825,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public PairingListDTO getPairingListFromTemplate(final String leaderboardName, final int flightMultiplier,
final Iterable<String> selectedFlightNames,PairingListTemplateDTO templateDTO)
final Iterable<String> selectedFlightNames, PairingListTemplateDTO templateDTO)
throws NotFoundException {
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
List<RaceColumn> selectedRaces = new ArrayList<RaceColumn>();
@@ -6836,26 +6836,29 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
}
}
PairingListTemplate pairingListTemplate = new PairingListTemplateImpl(templateDTO.getPairingListTemplate(), templateDTO.getCompetitorCount(), templateDTO.getFlightMultiplier());
PairingList<RaceColumn, Fleet, Competitor,Boat> pairingList =
getService().getPairingListFromTemplate(pairingListTemplate, leaderboardName, selectedRaces);
PairingListTemplate pairingListTemplate = new PairingListTemplateImpl(templateDTO.getPairingListTemplate(),
templateDTO.getCompetitorCount(), templateDTO.getFlightMultiplier());
PairingList<RaceColumn, Fleet, Competitor, Boat> pairingList = getService()
.getPairingListFromTemplate(pairingListTemplate, leaderboardName, selectedRaces);
List<List<List<Pair<CompetitorDTO, BoatDTO>>>> result = new ArrayList<>();
for (RaceColumn raceColumn : selectedRaces) {
//TODO change flights to fleets
List<List<Pair<CompetitorDTO, BoatDTO>>> flights = new ArrayList<>();
for (Fleet fleetElement : raceColumn.getFleets()) {
List<Pair<CompetitorDTO, BoatDTO>> fleets=new ArrayList<>();
for(Pair<Competitor,Boat> pair: pairingList.getCompetitors(raceColumn, fleetElement)){
if(pair.getA()!=null){
fleets.add(new Pair<CompetitorDTO,BoatDTO>(baseDomainFactory.convertToCompetitorDTO(pair.getA()),new BoatDTO(pair.getB().getName(),pair.getB().getSailID())));
}else{
fleets.add(new Pair<CompetitorDTO,BoatDTO>(new CompetitorDTOImpl(),new BoatDTO(pair.getB().getName(),pair.getB().getSailID())));
}
}
flights.add(fleets);
}
result.add(flights);
}
// TODO change flights to fleets
List<List<Pair<CompetitorDTO, BoatDTO>>> raceColumns = new ArrayList<>();
for (Fleet fleetElement : raceColumn.getFleets()) {
List<Pair<CompetitorDTO, BoatDTO>> fleets = new ArrayList<>();
for (Pair<Competitor, Boat> pair : pairingList.getCompetitors(raceColumn, fleetElement)) {
if (pair.getA() != null) {
fleets.add(new Pair<CompetitorDTO, BoatDTO>(baseDomainFactory.convertToCompetitorDTO(pair.getA()),
new BoatDTO(pair.getB().getName(), pair.getB().getSailID())));
} else {
fleets.add(new Pair<CompetitorDTO, BoatDTO>(new CompetitorDTOImpl(),
new BoatDTO(pair.getB().getName(), pair.getB().getSailID())));
}
}
raceColumns.add(fleets);
}
result.add(raceColumns);
}
return new PairingListDTO(result);
}
@@ -120,6 +120,7 @@ import com.sap.sailing.domain.common.dto.EventType;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO;
import com.sap.sailing.domain.common.dto.SeriesCreationParametersDTO;
import com.sap.sailing.domain.common.impl.ColorMapImpl;
import com.sap.sailing.domain.common.impl.DataImportProgressImpl;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
@@ -265,6 +266,7 @@ import com.sap.sse.pairinglist.CompetitionFormat;
import com.sap.sse.pairinglist.PairingFrameProvider;
import com.sap.sse.pairinglist.PairingList;
import com.sap.sse.pairinglist.PairingListTemplate;
import com.sap.sse.pairinglist.PairingListTemplateFactory;
import com.sap.sse.pairinglist.impl.PairingListTemplateFactoryImpl;
import com.sap.sse.replication.OperationExecutionListener;
import com.sap.sse.replication.OperationWithResult;
@@ -489,7 +491,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
*/
private final RaceChangeObserverForAnniversaryDetection raceChangeObserverForAnniversaryDetection;
private final PairingListTemplateFactoryImpl pairingListTemplateFactory = new PairingListTemplateFactoryImpl();
private final PairingListTemplateFactory pairingListTemplateFactory = PairingListTemplateFactory.INSTANCE;
/**
* Providing the constructor parameters for a new {@link RacingEventServiceImpl} instance is a bit tricky
@@ -4163,7 +4165,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
if (leaderboard != null) {
PairingListTemplate template = pairingListTemplateFactory
.getOrCreatePairingListTemplate(new PairingFrameProvider() {
.createPairingListTemplate(new PairingFrameProvider() {
@Override
public int getGroupsCount() {
@@ -4195,12 +4197,14 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
List<Competitor> competitors = Util.createList(leaderboard.getAllCompetitors());
Collections.shuffle(competitors);
//TODO (bug2822) get Boats of Regatta
ArrayList<Boat> boats=new ArrayList<>();
for(int slot=0;slot<pairingListTemplate.getPairingListTemplate()[0].length;slot++){
boats.add(new BoatImpl("Boat "+(slot+1), new BoatClassImpl("49er", true), "DE"+slot));
//TODO (bug2822) get Boats of Regatta/Leaderboard
List<Boat> boats = new ArrayList<>();
for (int slot = 0; slot < pairingListTemplate.getPairingListTemplate()[0].length; slot++) {
boats.add(new BoatImpl("Boat " + (slot + 1), new BoatClassImpl("49er", true), "DE" + slot));
}
PairingList<RaceColumn, Fleet, Competitor,Boat> pairingList = pairingListTemplate.createPairingList(new CompetitionFormat<RaceColumn, Fleet, Competitor>() {
PairingList<RaceColumn, Fleet, Competitor,Boat> pairingList = pairingListTemplate.createPairingList(new CompetitionFormat<RaceColumn, Fleet, Competitor, Boat>() {
@Override
public Iterable<RaceColumn> getFlights() {
@@ -4222,7 +4226,12 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
public int getGroupsCount() {
return Util.size(Util.get(leaderboard.getRaceColumns(), 0).getFleets());
}
},boats);
@Override
public Iterable<Boat> getCompetitorAllocation() {
return boats;
}
});
return pairingList;
}
@@ -9,7 +9,7 @@ import com.sap.sse.pairinglist.AbstractPairingFrameProvider;
public class PairingFrameProviderTest extends AbstractPairingFrameProvider {
private int flights, groups, competitors;
public PairingFrameProviderTest(int flights, int groups, int competitors) {
this.flights = flights;
this.groups = groups;
@@ -1,7 +1,7 @@
package com.sap.see.pairinglist.test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertArrayEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.IntStream;
@@ -17,7 +17,7 @@ import junit.framework.Assert;
public class PairingListTemplateFactoryTest {
public PairingListTemplateFactoryImpl factoryImpl;
@Before
public void testSetup() {
factoryImpl = new PairingListTemplateFactoryImpl();
@@ -30,7 +30,7 @@ public class PairingListTemplateFactoryTest {
final int competitors = 18;
int[][] plTemplate = factoryImpl
.getOrCreatePairingListTemplate(new PairingFrameProviderTest(flights, groups, competitors),0)
.createPairingListTemplate(new PairingFrameProviderTest(flights, groups, competitors))
.getPairingListTemplate();
Assert.assertNotNull(plTemplate);
@@ -41,45 +41,39 @@ public class PairingListTemplateFactoryTest {
}
}
}
int[][] plTemplate2 = factoryImpl
.getOrCreatePairingListTemplate(new PairingFrameProviderTest(flights, groups, competitors + 1),0)
.createPairingListTemplate(new PairingFrameProviderTest(flights, groups, competitors + 1))
.getPairingListTemplate();
int dummyCount = 0;
Assert.assertNotNull(plTemplate2);
for (int[] group : plTemplate2) {
for (int competitorNumber : group) {
if (competitorNumber == -1) {
dummyCount++;
}
if (competitorNumber < -1 && competitorNumber < competitors) {
Assert.fail("Values of Pairing List Template must not be smaller -1, when there are dummies!");
}
}
}
if (dummyCount != (groups - 1) * flights) {
Assert.fail("There are not as much dummies as there should be!");
}
}
/**
* Checks if the Factory returns the same PairingListTemplate if one exists
*/
@Test
public void testGetOrCreate() {
final int flights = 15;
final int groups = 3;
final int competitors = 18;
PairingFrameProviderTest frameProviderTest1 = new PairingFrameProviderTest(flights, groups, competitors);
PairingFrameProviderTest frameProviderTest2 = new PairingFrameProviderTest(flights, groups, competitors);
PairingListTemplate list1 = factoryImpl.getOrCreatePairingListTemplate(frameProviderTest1,0);
PairingListTemplate list2 = factoryImpl.getOrCreatePairingListTemplate(frameProviderTest2,0);
Assert.assertSame(list1,list2);
public void testCreatePairingListTemplate() {
PairingListTemplateFactoryImpl factoryImpl = new PairingListTemplateFactoryImpl();
PairingListTemplate template1 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 18));
PairingListTemplate template2 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 18));
Assert.assertFalse(Arrays.equals(template1.getPairingListTemplate(), template2.getPairingListTemplate()));
}
/**
@@ -88,85 +82,87 @@ public class PairingListTemplateFactoryTest {
@Test
public void testGeneration() {
PairingListTemplateFactoryImpl factoryImpl = new PairingListTemplateFactoryImpl();
PairingListTemplate example1 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(15, 3, 18),0);
PairingListTemplate example6 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(15, 3, 14),0);
PairingListTemplate example2 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(100, 6, 18),0);
PairingListTemplate example3 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(10, 3, 30),0);
PairingListTemplate example4 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(15, 3, 18), 3);
PairingListTemplate example5 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(15, 3, 18), 3);
PairingListTemplate example1 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 18));
PairingListTemplate example6 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 14));
PairingListTemplate example2 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(100, 6, 18));
PairingListTemplate example3 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(10, 3, 30));
PairingListTemplate example4 = factoryImpl
.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 18), 3);
PairingListTemplate example5 = factoryImpl
.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 18), 3);
assertNotNull(example1);
assertNotNull(example2);
assertNotNull(example3);
assertNotNull(example4);
assertNotNull(example5);
assertNotNull(example6);
assertArrayEquals(example4.getPairingListTemplate(), example5.getPairingListTemplate());
System.out.println(Arrays.deepToString(example1.getPairingListTemplate()));
System.out.println(example2.getQuality());
}
@Test
public void testMultiplyFlights() {
final int flightCount = 14;
final int groupCount = 3;
final int competitorCount = 18;
final int competitorCount = 18;
final int multiplier = 2;
PairingListTemplateFactoryImpl factoryImpl = new PairingListTemplateFactoryImpl();
PairingListTemplate example = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(flightCount, groupCount, competitorCount), multiplier);
for (int groupIndex = 0; groupIndex < flightCount * groupCount; groupIndex = groupIndex + (groupCount * (multiplier))) {
assertArrayEquals(example.getPairingListTemplate()[groupIndex], example.getPairingListTemplate()[groupIndex + groupCount]);
PairingListTemplate example = factoryImpl.createPairingListTemplate(
new PairingFrameProviderTest(flightCount, groupCount, competitorCount), multiplier);
for (int groupIndex = 0; groupIndex < flightCount * groupCount; groupIndex = groupIndex
+ (groupCount * (multiplier))) {
assertArrayEquals(example.getPairingListTemplate()[groupIndex],
example.getPairingListTemplate()[groupIndex + groupCount]);
}
}
@Test
public void qualityCheck(){
PairingListTemplate template = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(15, 3, 18),0);
public void qualityCheck() {
PairingListTemplate template = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(15, 3, 18));
System.out.println(Arrays.deepToString(template.getPairingListTemplate()));
System.out.println(template.getQuality());
if(template.getQuality()>=0.7) {
if (template.getQuality() >= 0.7) {
Assert.fail("Quality of Pairinglist is worse than usual!");
}
PairingListTemplate template2 = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(10, 3, 30),0);
PairingListTemplate template2 = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(10, 3, 30));
System.out.println(Arrays.deepToString(template2.getPairingListTemplate()));
System.out.println(template2.getQuality());
if(template2.getQuality()>=1.2) {
if (template2.getQuality() >= 1.2) {
Assert.fail("Quality of Pairinglist is worse than usual!");
}
}
/**
* Checks if the competitors of all single flights are divided up correctly (e.g. multiple competitors, absenced competitors)
* flights, groups and competitors can be variable.
* Checks if the competitors of all single flights are divided up correctly (e.g. multiple competitors, absenced
* competitors) flights, groups and competitors can be variable.
*/
@Test
public void checkFlights() {
final int flights = 15;
final int groups = 3;
final int competitors = 18;
ArrayList<Integer> availableCompetitors = new ArrayList<>();
int[][] copy = factoryImpl.getOrCreatePairingListTemplate(new PairingFrameProviderTest(flights, groups, competitors),0).getPairingListTemplate();
for(int i = 0; i < flights; i++) {
int[][] copy = factoryImpl.createPairingListTemplate(new PairingFrameProviderTest(flights, groups, competitors))
.getPairingListTemplate();
for (int i = 0; i < flights; i++) {
IntStream.range(0, competitors - 1).forEach(competitor -> {
availableCompetitors.add(competitor);
});
for(int j = 0; j < groups; j++) {
for(int k = 0; k < competitors/groups; k++) {
if(availableCompetitors.contains(copy[i*groups+j][k])) {
availableCompetitors.remove(new Integer(copy[i*groups+j][k]));
for (int j = 0; j < groups; j++) {
for (int k = 0; k < competitors / groups; k++) {
if (availableCompetitors.contains(copy[i * groups + j][k])) {
availableCompetitors.remove(new Integer(copy[i * groups + j][k]));
}
}
}
if(availableCompetitors.isEmpty()) {
if (availableCompetitors.isEmpty()) {
continue;
} else {
Assert.fail("The competitors are not divided up correctly!");
@@ -5,7 +5,7 @@ import com.sap.sse.common.Util;
* If a Class implements this Interface, it is possible to generate a ParingList out of this Class.
* The class needs some specific methods to get the attributes of the needed ParingList.
*/
public interface CompetitionFormat<Flight, Group, Competitor> extends PairingFrameProvider {
public interface CompetitionFormat<Flight, Group, Competitor, CompetitorAllocation> extends PairingFrameProvider {
Iterable<Flight> getFlights();
default int getFlightsCount() {
@@ -19,4 +19,6 @@ public interface CompetitionFormat<Flight, Group, Competitor> extends PairingFra
default int getCompetitorsCount() {
return Util.size(getCompetitors());
}
Iterable<CompetitorAllocation> getCompetitorAllocation();
}
@@ -8,12 +8,12 @@ import com.sap.sse.common.Util.Pair;
* which contains specific Competitor objects for a specific flight. Because of this it has to depend on a
* <code>CompetitonFormat</code>.
*/
public interface PairingList<Flight, Group, Competitor,Boat> {
public interface PairingList<Flight, Group, Competitor, CompetitorAllocation> {
//TODO specify Javadoc for Boat-Competitor association
/**
* Returns the Competitor objects in a group of a specific flight
*
* @return <code>Iterable</code> with competitors
*/
Iterable<Pair<Competitor,Boat>> getCompetitors(Flight flight, Group group);
Iterable<Pair<Competitor, CompetitorAllocation>> getCompetitors(Flight flight, Group group);
}
@@ -16,8 +16,8 @@ import java.util.ArrayList;
*/
public interface PairingListTemplate {
<Flight, Group, Competitor,Boat> PairingList<Flight, Group, Competitor,Boat> createPairingList(
CompetitionFormat<Flight, Group, Competitor> competitionFormat,ArrayList<Boat> boats);
<Flight, Group, Competitor, CompetitorAllocation> PairingList<Flight, Group, Competitor, CompetitorAllocation> createPairingList(
CompetitionFormat<Flight, Group, Competitor, CompetitorAllocation> competitionFormat);
/**
* The value corresponds to the quality of a pairing list template. The quality is calculated by the
@@ -6,12 +6,10 @@ public interface PairingListTemplateFactory {
static PairingListTemplateFactory INSTANCE = new PairingListTemplateFactoryImpl();
/**
* Returns new pairing list template if there is no existing pairing list template with
* the same parameters.
* Returns a new {@link PairingListTemplate}
*
* @param pairingFrameProvider
* @return PairingListTemplate Object
* @return PairingListTemplate correlates with the new {@link PairingListTemplate}
*/
PairingListTemplate getOrCreatePairingListTemplate(PairingFrameProvider pairingFrameProvider,int flightMultiplier);
PairingListTemplate createPairingListTemplate(PairingFrameProvider pairingFrameProvider, int flightCount);
}
@@ -9,41 +9,40 @@ import com.sap.sse.pairinglist.CompetitionFormat;
import com.sap.sse.pairinglist.PairingList;
import com.sap.sse.pairinglist.PairingListTemplate;
public class PairingListImpl<Flight, Group, Competitor,Boat> implements PairingList<Flight, Group, Competitor,Boat> {
public class PairingListImpl<Flight, Group, Competitor,CompetitorAllocation> implements PairingList<Flight, Group, Competitor, CompetitorAllocation> {
private final PairingListTemplate pairingListTemplate;
private final CompetitionFormat<Flight, Group, Competitor> competitionFormat;
private final List<Boat> boats;
private final CompetitionFormat<Flight, Group, Competitor, CompetitorAllocation> competitionFormat;
private final List<Competitor> competitors;
/**
* @param pList: pairing list with specific information of flights, groups and competitors
* @param standardDev: describes quality of our pList (the lower the standardDev, the better the pairing list)
*/
public PairingListImpl(PairingListTemplate template, CompetitionFormat<Flight, Group, Competitor> competitionFormat,ArrayList<Boat> boats) {
public PairingListImpl(PairingListTemplate template, CompetitionFormat<Flight, Group, Competitor, CompetitorAllocation> competitionFormat) {
this.pairingListTemplate = template;
this.competitionFormat = competitionFormat;
this.boats=boats;
this.competitors=Util.asList(competitionFormat.getCompetitors());
this.competitors = Util.asList(competitionFormat.getCompetitors());
}
@Override
public Iterable<Pair<Competitor,Boat>> getCompetitors(Flight flight, Group group) {
public Iterable<Pair<Competitor, CompetitorAllocation>> getCompetitors(Flight flight, Group group) {
final int[][] competitorIndices = pairingListTemplate.getPairingListTemplate();
final int flightIndex = Util.indexOf(competitionFormat.getFlights(), flight);
final int groupIndex = Util.indexOf(competitionFormat.getGroups(flight), group);
final int groupCount =Util.size(competitionFormat.getGroups(flight));
final int groupCount = Util.size(competitionFormat.getGroups(flight));
final ArrayList<Integer> competitorIndicesInRace = new ArrayList<>();
for (Integer integer : competitorIndices[flightIndex*groupCount+groupIndex]) {
for (Integer integer : competitorIndices[flightIndex * groupCount + groupIndex]) {
competitorIndicesInRace.add(integer);
}
final List<Pair<Competitor,Boat>> result = new ArrayList<>();
for(int slot=0;slot<competitorIndicesInRace.size();slot++){
if(competitorIndicesInRace.get(slot)>=0){
result.add(new Pair<Competitor, Boat>(competitors.get(competitorIndicesInRace.get(slot)), boats.get(slot)));
}else{
result.add(new Pair<Competitor, Boat>(null, boats.get(slot)));
final List<Pair<Competitor, CompetitorAllocation>> result = new ArrayList<>();
for (int slot = 0; slot < competitorIndicesInRace.size(); slot++) {
if (competitorIndicesInRace.get(slot) >= 0) {
result.add(new Pair<Competitor, CompetitorAllocation>(competitors.get(competitorIndicesInRace.get(slot)),
Util.get(competitionFormat.getCompetitorAllocation(), slot)));
} else {
result.add(new Pair<Competitor, CompetitorAllocation>(null, Util.get(competitionFormat.getCompetitorAllocation(), slot)));
}
}
return result;
@@ -1,59 +1,24 @@
package com.sap.sse.pairinglist.impl;
import java.util.HashMap;
import java.util.Map;
import com.sap.sse.pairinglist.PairingFrameProvider;
import com.sap.sse.pairinglist.PairingListTemplate;
import com.sap.sse.pairinglist.PairingListTemplateFactory;
public class PairingListTemplateFactoryImpl implements PairingListTemplateFactory {
private final Map<Integer, Map<Integer,PairingListTemplate>> pairingListTemplates;
public PairingListTemplateFactoryImpl() {
this.pairingListTemplates=new HashMap<>();
}
public PairingListTemplateFactoryImpl(Map<Integer, Map<Integer,PairingListTemplate>> existingPairingListTemplates) {
this.pairingListTemplates = existingPairingListTemplates;
}
public PairingListTemplateFactoryImpl() { }
@Override
public PairingListTemplate getOrCreatePairingListTemplate(PairingFrameProvider pairingFrameProvider,int flightMultiplier) {
PairingListTemplate result;
try{
result = pairingListTemplates.get(pairingFrameProvider.getHashCode()).get(flightMultiplier);
}catch(NullPointerException e){
result=null;
}
if (result == null) {
result = generatePairingList(pairingFrameProvider,flightMultiplier);
if(pairingListTemplates.get(pairingFrameProvider.getHashCode())==null){
pairingListTemplates.put(pairingFrameProvider.getHashCode(), new HashMap<>());
pairingListTemplates.get(pairingFrameProvider.getHashCode()).put(flightMultiplier, result);
}else{
pairingListTemplates.get(pairingFrameProvider.getHashCode()).put(flightMultiplier, result);
}
}
return result;
}
/**
* Creates a new ParingListTemplate which depends on the parameters of the given pairingFrameProvider.
* @param pairingFrameProvider
* @return new PariningListTemplate object
*/
protected PairingListTemplate generatePairingList(PairingFrameProvider pairingFrameProvider, int iterations,
int flightMultiplier) {
return new PairingListTemplateImpl(pairingFrameProvider, iterations, flightMultiplier);
}
protected PairingListTemplate generatePairingList(PairingFrameProvider pairingFrameProvider, int flightMultiplier) {
return this.generatePairingList(pairingFrameProvider, 100000, flightMultiplier);
public PairingListTemplate createPairingListTemplate(PairingFrameProvider pairingFrameProvider, int flightMultiplier) {
return new PairingListTemplateImpl(pairingFrameProvider, flightMultiplier);
}
protected PairingListTemplate generatePairingList(PairingFrameProvider pairingFrameProvider) {
return this.generatePairingList(pairingFrameProvider, 100000, 0);
public PairingListTemplate createPairingListTemplate(PairingFrameProvider pairingFrameProvider, int iterations, int flightMultiplier) {
return new PairingListTemplateImpl(pairingFrameProvider, iterations, flightMultiplier);
}
public PairingListTemplate createPairingListTemplate(PairingFrameProvider pairingFrameProvider) {
return new PairingListTemplateImpl(pairingFrameProvider);
}
}
@@ -66,13 +66,32 @@ public class PairingListTemplateImpl implements PairingListTemplate {
+ "be greater than 1; count of competitors has to be greater than count of groups");
}
}
//Used to convert a TemplateDTO to PairingListTemplate
public PairingListTemplateImpl(int[][] template,int competitorsCount,int flightMultiplier) {
this.pairingListTemplate=template;
this.standardDev=this.calcStandardDev(incrementAssociations(template, new int[competitorsCount][competitorsCount]));
this.iterations=100000;
this.flightMultiplier=flightMultiplier;
this.dummies=0;
// Used to convert a TemplateDTO to PairingListTemplate
public PairingListTemplateImpl(int[][] template, int competitorsCount, int flightMultiplier) {
this.pairingListTemplate = template;
int groupCount = (int) (competitorsCount / this.pairingListTemplate[0].length + 1);
this.dummies = groupCount - (competitorsCount % groupCount);
int dummyIndex = 0;
for (int[] group : this.pairingListTemplate) {
for (int competitorNumber = 0; competitorNumber < group.length; competitorNumber++) {
if (group[competitorNumber] < 0) {
group[competitorNumber] = competitorsCount + dummyIndex;
dummyIndex++;
if (dummyIndex >= dummies) {
dummyIndex = 0;
}
}
}
}
this.standardDev = this.calcStandardDev(incrementAssociations(this.pairingListTemplate,
new int[competitorsCount + this.dummies][competitorsCount + this.dummies]));
this.resetDummies(this.pairingListTemplate, competitorsCount + this.dummies);
this.iterations = 100000;
this.flightMultiplier = flightMultiplier;
}
@Override
@@ -81,9 +100,9 @@ public class PairingListTemplateImpl implements PairingListTemplate {
}
@Override
public <Flight, Group, Competitor,Boat> PairingList<Flight, Group, Competitor,Boat> createPairingList(
CompetitionFormat<Flight, Group, Competitor> competitionFormat,ArrayList<Boat> boats) {
return new PairingListImpl<>(this, competitionFormat,boats);
public <Flight, Group, Competitor, CompetitorAllocation> PairingList<Flight, Group, Competitor, CompetitorAllocation> createPairingList(
CompetitionFormat<Flight, Group, Competitor, CompetitorAllocation> competitionFormat) {
return new PairingListImpl<>(this, competitionFormat);
}
@Override