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 { ...@@ -21,4 +21,6 @@ public interface CityObjectCache {
void resetCache(); void resetCache();
List<GmlId> getErrorFeatureIds();
} }
...@@ -68,7 +68,7 @@ public class DatabaseHandler { ...@@ -68,7 +68,7 @@ public class DatabaseHandler {
} }
} }
try (PreparedStatement createPs = con.prepareStatement("CREATE TABLE features (gmlid VARCHAR(255)" + 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(); createPs.executeUpdate();
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Created features table"); logger.debug("Created features table");
...@@ -88,10 +88,16 @@ public class DatabaseHandler { ...@@ -88,10 +88,16 @@ public class DatabaseHandler {
*/ */
public void marshallCityObject(CityObject co) { public void marshallCityObject(CityObject co) {
try (Connection con = dataSource.getConnection()) { 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()); ps.setString(1, co.getGmlId().toString());
String bbox = BoundingBox.of(co).to2DWkt(); String bbox = BoundingBox.of(co).to2DWkt();
ps.setString(2, bbox); ps.setString(2, bbox);
if (co.isValidated()) {
ps.setBoolean(4, co.hasAnyError());
}
else {
ps.setNull(4, java.sql.Types.BOOLEAN);
}
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Attempting to serialize CityObject: {} ", co); logger.debug("Attempting to serialize CityObject: {} ", co);
} }
...@@ -116,7 +122,7 @@ public class DatabaseHandler { ...@@ -116,7 +122,7 @@ public class DatabaseHandler {
// Id String for error logging // Id String for error logging
String id = ""; String id = "";
try (Connection con = dataSource.getConnection()) { 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); con.setAutoCommit(false);
for (Map.Entry<GmlId, CityObject> entry : map.entrySet()) { for (Map.Entry<GmlId, CityObject> entry : map.entrySet()) {
CityObject co = entry.getValue(); CityObject co = entry.getValue();
...@@ -127,6 +133,12 @@ public class DatabaseHandler { ...@@ -127,6 +133,12 @@ public class DatabaseHandler {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Attempting to serialize CityObject: {} ", co); logger.trace("Attempting to serialize CityObject: {} ", co);
} }
if (co.isValidated()) {
ps.setBoolean(4, co.hasAnyError());
}
else {
ps.setNull(4, java.sql.Types.BOOLEAN);
}
try { try {
byte[] bytes = SerializationUtils.serialize(co); byte[] bytes = SerializationUtils.serialize(co);
ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
...@@ -161,7 +173,7 @@ public class DatabaseHandler { ...@@ -161,7 +173,7 @@ public class DatabaseHandler {
public CityObject unmarshallCityObject(GmlId id) { public CityObject unmarshallCityObject(GmlId id) {
try (Connection con = dataSource.getConnection()) { try (Connection con = dataSource.getConnection()) {
try (PreparedStatement ps = con.prepareStatement( try (PreparedStatement ps = con.prepareStatement(
"SELECT gmlid, bbox, data FROM features WHERE gmlid = ?")) { "SELECT data FROM features WHERE gmlid = ?")) {
ps.setString(1, id.toString()); ps.setString(1, id.toString());
ResultSet rs = ps.executeQuery(); ResultSet rs = ps.executeQuery();
if (rs.next()) { if (rs.next()) {
...@@ -188,6 +200,22 @@ public class DatabaseHandler { ...@@ -188,6 +200,22 @@ public class DatabaseHandler {
return null; 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() { public List<CityObject> getAllCityObjects() {
List<CityObject> cos = new ArrayList<>(); List<CityObject> cos = new ArrayList<>();
try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) { try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) {
......
...@@ -25,14 +25,12 @@ public class FeatureCache implements CityObjectCache{ ...@@ -25,14 +25,12 @@ public class FeatureCache implements CityObjectCache{
private static final Logger logger = LogManager.getLogger(FeatureCache.class); private static final Logger logger = LogManager.getLogger(FeatureCache.class);
private final LoadingCache<GmlId, CityObject> cache; private final LoadingCache<GmlId, CityObject> cache;
private DatabaseHandler handler; private final DatabaseHandler handler;
private final Map<String, DatabaseHandler> handlerList = new HashMap<>();
private AtomicInteger putsCounter = new AtomicInteger(0); private AtomicInteger putsCounter = new AtomicInteger(0);
private boolean parsingFinished = false; private boolean parsingFinished = false;
FeatureCache() { FeatureCache() {
handler = new DatabaseHandler(); handler = new DatabaseHandler();
handler.setupFeaturesTable();
cache = Caffeine.newBuilder().maximumSize(3000).removalListener((GmlId key, CityObject value, RemovalCause cause) -> { cache = Caffeine.newBuilder().maximumSize(3000).removalListener((GmlId key, CityObject value, RemovalCause cause) -> {
if (value != null && cause.wasEvicted()) { if (value != null && cause.wasEvicted()) {
handler.marshallCityObject(value); handler.marshallCityObject(value);
...@@ -84,14 +82,6 @@ public class FeatureCache implements CityObjectCache{ ...@@ -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) { public void preCacheFeatures(List<GmlId> ids) {
cache.getAll(ids); cache.getAll(ids);
} }
...@@ -120,6 +110,11 @@ public class FeatureCache implements CityObjectCache{ ...@@ -120,6 +110,11 @@ public class FeatureCache implements CityObjectCache{
parsingFinished = false; parsingFinished = false;
} }
@Override
public List<GmlId> getErrorFeatureIds() {
return handler.getIdsOfAllCityObjectsWithErrors();
}
public void finishParsing() { public void finishParsing() {
if (!parsingFinished) { if (!parsingFinished) {
......
...@@ -4,6 +4,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject; ...@@ -4,6 +4,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException; import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -48,4 +49,15 @@ public class UnconnectedCache implements CityObjectCache{ ...@@ -48,4 +49,15 @@ public class UnconnectedCache implements CityObjectCache{
public void resetCache(){ 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