Commit 3a45b8d9 authored by Luna Riegel's avatar Luna Riegel
Browse files

Refactor: Rework handling of DatabaseHandler returns

parent ee22bc29
...@@ -70,6 +70,10 @@ public class DatabaseHandler { ...@@ -70,6 +70,10 @@ public class DatabaseHandler {
} }
} }
/**
* Saves a CityObject to the embedded database, updating an existing entry if it exists.
* @param co the CityObject
*/
public static void marshallCityObject(CityObject co) { public static void marshallCityObject(CityObject co) {
try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) { try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) {
try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?, ?)")) { try (PreparedStatement ps = con.prepareStatement("MERGE INTO features VALUES (?, ?, ?, ?)")) {
...@@ -91,6 +95,11 @@ public class DatabaseHandler { ...@@ -91,6 +95,11 @@ public class DatabaseHandler {
} }
} }
/**
* Retrieves a CityObject from the embedded database.
* @param id the gmlId of the requested Feature
* @return the Feature, or null if no entry was found
*/
public static CityObject unmarshallCityObject(GmlId id) { public static CityObject unmarshallCityObject(GmlId id) {
try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) { try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) {
try (PreparedStatement ps = con.prepareStatement("SELECT gmlid, bbox, data, type FROM features WHERE gmlid = ?")) { try (PreparedStatement ps = con.prepareStatement("SELECT gmlid, bbox, data, type FROM features WHERE gmlid = ?")) {
...@@ -150,16 +159,22 @@ public class DatabaseHandler { ...@@ -150,16 +159,22 @@ public class DatabaseHandler {
return cos; return cos;
} }
public static List<CityObject> getBufferIntersectingObjects(CityObject co, double bufferSize) { public static List<GmlId> getBufferIntersectingObjects(CityObject co, double bufferSize) {
List<CityObject> intersectingObjects = new ArrayList<>(); return getBufferIntersectingObjects(co.getGmlId(), bufferSize);
}
public static List<GmlId> getBufferIntersectingObjects(GmlId gmlID, double bufferSize) {
List<GmlId> intersectingObjects = new ArrayList<>();
try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) { try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) {
try (PreparedStatement ps = con.prepareStatement("SELECT gmlid, bbox, data, type FROM features AS tab1" + try (PreparedStatement ps = con.prepareStatement("SELECT gmlid FROM features AS tab1" +
" WHERE ST_INTERSECTS(ST_BUFFER(tab1.bbox,?), (SELECT bbox FROM features WHERE gmlid = ?)) AND tab1.gmlid <> ?")) { " WHERE ST_INTERSECTS(ST_BUFFER(tab1.bbox,?), (SELECT bbox FROM features WHERE gmlid = ?)) AND tab1.gmlid <> ?")) {
ps.setDouble(1, bufferSize); ps.setDouble(1, bufferSize);
ps.setString(2, co.getGmlId().toString()); ps.setString(2, gmlID.toString());
ps.setString(3, co.getGmlId().toString()); ps.setString(3, gmlID.toString());
ResultSet rs = ps.executeQuery(); ResultSet rs = ps.executeQuery();
intersectingObjects.addAll(retrieveCityObjects(rs)); while (rs.next()) {
intersectingObjects.add(new GmlId(rs.getString("gmlid")));
}
} }
} catch (SQLException e) { } catch (SQLException e) {
logger.error("Connection to database failed while trying to get buffer intersecting objects!"); logger.error("Connection to database failed while trying to get buffer intersecting objects!");
...@@ -168,22 +183,8 @@ public class DatabaseHandler { ...@@ -168,22 +183,8 @@ public class DatabaseHandler {
return intersectingObjects; return intersectingObjects;
} }
public static List<CityObject> getBBoxIntersectingObjects(CityObject co) { public static List<GmlId> getBBoxIntersectingObjects(CityObject co) {
List<CityObject> intersectingObjects = new ArrayList<>(); return getBBoxIntersectingObjects(co.getGmlId());
try (Connection con = new ConnectionWrapper(H2GISDBFactory.openSpatialDataBase(DB_NAME))) {
try (PreparedStatement ps = con.prepareStatement("SELECT gmlid, bbox, data, type FROM features AS tab1" +
" WHERE ST_INTERSECTS(tab1.bbox, (SELECT bbox FROM features WHERE gmlid = ?)) AND tab1.gmlid <> ?")) {
ps.setString(1, co.getGmlId().toString());
ps.setString(2, co.getGmlId().toString());
ResultSet rs = ps.executeQuery();
intersectingObjects.addAll(retrieveCityObjects(rs));
}
} catch (SQLException e) {
logger.error("Connection to database failed while trying to get bbox intersecting objects!");
logger.debug(e.getMessage());
}
return intersectingObjects;
} }
public static List<GmlId> getBBoxIntersectingObjects(GmlId id) { public static List<GmlId> getBBoxIntersectingObjects(GmlId id) {
......
...@@ -7,6 +7,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon; ...@@ -7,6 +7,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryTestUtils; import de.hft.stuttgart.citydoctor2.datastructure.GeometryTestUtils;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Lod; import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
...@@ -144,11 +145,13 @@ public class DataBaseHandlerTest { ...@@ -144,11 +145,13 @@ public class DataBaseHandlerTest {
DatabaseHandler.marshallCityObject(b4); DatabaseHandler.marshallCityObject(b4);
assertEquals(4, DatabaseHandler.getFeatureCount()); assertEquals(4, DatabaseHandler.getFeatureCount());
List<CityObject> objects = DatabaseHandler.getBBoxIntersectingObjects(b); List<GmlId> objects = DatabaseHandler.getBBoxIntersectingObjects(b);
assertEquals(1, objects.size()); assertEquals(1, objects.size());
assertEquals(4, DatabaseHandler.getFeatureCount()); assertEquals(4, DatabaseHandler.getFeatureCount());
assertCityObjectEquality(b2, objects.get(0)); CityObject co = DatabaseHandler.unmarshallCityObject(objects.get(0));
assertNotNull(co);
assertCityObjectEquality(b2, co);
} }
...@@ -223,11 +226,13 @@ public class DataBaseHandlerTest { ...@@ -223,11 +226,13 @@ public class DataBaseHandlerTest {
DatabaseHandler.marshallCityObject(b4); DatabaseHandler.marshallCityObject(b4);
assertEquals(4, DatabaseHandler.getFeatureCount()); assertEquals(4, DatabaseHandler.getFeatureCount());
List<CityObject> objects = DatabaseHandler.getBufferIntersectingObjects(b, Math.sqrt(2)); List<GmlId> objects = DatabaseHandler.getBufferIntersectingObjects(b, Math.sqrt(2));
assertEquals(1, objects.size()); assertEquals(1, objects.size());
assertEquals(4, DatabaseHandler.getFeatureCount()); assertEquals(4, DatabaseHandler.getFeatureCount());
assertCityObjectEquality(b2, objects.get(0)); CityObject co = DatabaseHandler.unmarshallCityObject(objects.get(0));
assertNotNull(co);
assertCityObjectEquality(b2, co);
} }
......
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