Commit 0a833640 authored by Luna Riegel's avatar Luna Riegel
Browse files

Refactor: Add querying for Features with errors

parent 6fce842e
......@@ -21,4 +21,6 @@ public interface CityObjectCache {
void resetCache();
List<GmlId> getErrorFeatureIds();
}
......@@ -68,7 +68,7 @@ public class DatabaseHandler {
}
}
try (PreparedStatement createPs = con.prepareStatement("CREATE TABLE features (gmlid VARCHAR(255)" +
" PRIMARY KEY, bbox GEOMETRY, data BLOB)")) {
" PRIMARY KEY, bbox GEOMETRY, data BLOB, errors BOOLEAN);")) {
createPs.executeUpdate();
if (logger.isDebugEnabled()) {
logger.debug("Created features table");
......@@ -88,10 +88,16 @@ public class DatabaseHandler {
*/
public void marshallCityObject(CityObject co) {
try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?)")) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?, ?)")) {
ps.setString(1, co.getGmlId().toString());
String bbox = BoundingBox.of(co).to2DWkt();
ps.setString(2, bbox);
if (co.isValidated()) {
ps.setBoolean(4, co.hasAnyError());
}
else {
ps.setNull(4, java.sql.Types.BOOLEAN);
}
if (logger.isDebugEnabled()) {
logger.debug("Attempting to serialize CityObject: {} ", co);
}
......@@ -116,7 +122,7 @@ public class DatabaseHandler {
// Id String for error logging
String id = "";
try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?)")) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?,?)")) {
con.setAutoCommit(false);
for (Map.Entry<GmlId, CityObject> entry : map.entrySet()) {
CityObject co = entry.getValue();
......@@ -127,6 +133,12 @@ public class DatabaseHandler {
if (logger.isTraceEnabled()) {
logger.trace("Attempting to serialize CityObject: {} ", co);
}
if (co.isValidated()) {
ps.setBoolean(4, co.hasAnyError());
}
else {
ps.setNull(4, java.sql.Types.BOOLEAN);
}
try {
byte[] bytes = SerializationUtils.serialize(co);
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
......@@ -161,7 +173,7 @@ public class DatabaseHandler {
public CityObject unmarshallCityObject(GmlId id) {
try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement(
"SELECT gmlid, bbox, data FROM features WHERE gmlid = ?")) {
"SELECT data FROM features WHERE gmlid = ?")) {
ps.setString(1, id.toString());
ResultSet rs = ps.executeQuery();
if (rs.next()) {
......@@ -188,6 +200,22 @@ public class DatabaseHandler {
return null;
}
public List<GmlId> getIdsOfAllCityObjectsWithErrors(){
List<GmlId> ids = new ArrayList<>();
try (Connection con = dataSource.getConnection()){
try (PreparedStatement ps = con.prepareStatement("SELECT gmlid FROM features WHERE errors = TRUE")) {
ResultSet rs = ps.executeQuery();
while (rs.next()) {
ids.add(new GmlId(rs.getString("gmlid")));
}
}
} catch (SQLException e) {
logger.error("Fetching ids of all features with errors failed!");
logger.error(e.getMessage());
}
return ids;
}
public List<CityObject> getAllCityObjects() {
List<CityObject> cos = new ArrayList<>();
try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) {
......
......@@ -25,14 +25,12 @@ public class FeatureCache implements CityObjectCache{
private static final Logger logger = LogManager.getLogger(FeatureCache.class);
private final LoadingCache<GmlId, CityObject> cache;
private DatabaseHandler handler;
private final Map<String, DatabaseHandler> handlerList = new HashMap<>();
private final DatabaseHandler handler;
private AtomicInteger putsCounter = new AtomicInteger(0);
private boolean parsingFinished = false;
FeatureCache() {
handler = new DatabaseHandler();
handler.setupFeaturesTable();
cache = Caffeine.newBuilder().maximumSize(3000).removalListener((GmlId key, CityObject value, RemovalCause cause) -> {
if (value != null && cause.wasEvicted()) {
handler.marshallCityObject(value);
......@@ -84,14 +82,6 @@ public class FeatureCache implements CityObjectCache{
public void changeFileName(String fileName){
handler = handlerList.computeIfAbsent(fileName, k -> {
DatabaseHandler handler1 = new DatabaseHandler();
handler1.setupFeaturesTable();
return handler1;
});
}
public void preCacheFeatures(List<GmlId> ids) {
cache.getAll(ids);
}
......@@ -120,6 +110,11 @@ public class FeatureCache implements CityObjectCache{
parsingFinished = false;
}
@Override
public List<GmlId> getErrorFeatureIds() {
return handler.getIdsOfAllCityObjectsWithErrors();
}
public void finishParsing() {
if (!parsingFinished) {
......
......@@ -4,6 +4,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -48,4 +49,15 @@ public class UnconnectedCache implements CityObjectCache{
public void resetCache(){
//
}
@Override
public List<GmlId> getErrorFeatureIds() {
List<GmlId> errorFeatureIds = new ArrayList<>();
cache.forEach((gmlId, cityObject) ->{
if (cityObject.containsAnyError()){
errorFeatureIds.add(cityObject.getGmlId());
}
});
return errorFeatureIds;
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment