package polly.rx.core.orion.datasource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import polly.rx.core.orion.FleetHeatMap;
import polly.rx.core.orion.QuadrantProvider;
import polly.rx.core.orion.model.Fleet;
import polly.rx.core.orion.model.Quadrant;
import polly.rx.core.orion.model.Sector;
import polly.rx.entities.DBHeatMapEntry;
import polly.rx.entities.DBSector;
import de.skuzzle.polly.sdk.PersistenceManagerV2;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Param;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Read;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Write;
import de.skuzzle.polly.sdk.exceptions.DatabaseException;
import de.skuzzle.polly.sdk.time.Time;
public class DBFleetHeatMap implements FleetHeatMap {
private final PersistenceManagerV2 persistence;
private final QuadrantProvider quadrantProvider;
public DBFleetHeatMap(PersistenceManagerV2 persistence, QuadrantProvider quadProvider) {
this.persistence = persistence;
this.quadrantProvider = quadProvider;
}
@Override
public int getTimes(String venadName, Sector sector) {
return findEntries(venadName, sector).size();
}
@Override
public Map<Quadrant, Map<Sector, Integer>> getUserHeatMaps(String venad) {
final Map<Quadrant, Map<Sector, Integer>> result = new HashMap<>();
try (final Read read = this.persistence.read()) {
for (final Quadrant quad : this.quadrantProvider.getAllQuadrants()) {
final Map<Sector, Integer> heatMap = getSectorHeatMap(venad, quad);
if (!heatMap.isEmpty()) {
result.put(quad, heatMap);
}
}
}
return result;
}
@Override
public Map<Sector, Integer> getSectorHeatMap(String venadName, Quadrant quadrant) {
final Map<Sector, Integer> result = new HashMap<>();
final List<DBHeatMapEntry> all;
try (final Read read = this.persistence.read()) {
all = read.findList(DBHeatMapEntry.class,
DBHeatMapEntry.BY_VENAD_AND_QUADRANT,
new Param(venadName, quadrant.getName()));
}
for (final DBHeatMapEntry entry : all) {
result.compute(entry.getSector(), (s, i) -> i == null
? 1
: i + 1);
}
return result;
}
@Override
public void update(Fleet fleet) {
try (final Write write = this.persistence.write()) {
final Read read = write.read();
final DBSector sector = read.findSingle(DBSector.class,
DBSector.QUERY_FIND_SECTOR,
new Param(fleet.getSector().getQuadName(),
fleet.getSector().getX(),
fleet.getSector().getY()));
final DBHeatMapEntry newEntry = new DBHeatMapEntry();
newEntry.setDate(Time.currentTime());
newEntry.setOwnerVenadName(fleet.getOwnerName());
newEntry.setSector(sector);
write.single(newEntry);
} catch (DatabaseException e) {
e.printStackTrace();
}
}
private List<DBHeatMapEntry> findEntries(String venadName, Sector s) {
try (final Read read = this.persistence.read()) {
final DBSector sector = read.findSingle(DBSector.class,
DBSector.QUERY_FIND_SECTOR,
new Param(s.getQuadName(), s.getX(), s.getY()));
return read.findList(DBHeatMapEntry.class, DBHeatMapEntry.BY_VENAD_AND_SECTOR,
new Param(venadName, sector));
}
}
}