diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java index eb31149193e4340b2f975284d537478a94a6a87a..26a41172451922e57d7cd1a5412574fb8e4bf927 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java @@ -128,6 +128,8 @@ public abstract class Isochrone { * @return the computed output (stored in the output given by the parameter) */ public <T extends Output> T compute(final T output) { + output.beforeCalculation(); + if (!query.getNodes().isEmpty()) { exploreInitialNodes(query.getNodes()); } else { @@ -159,6 +161,7 @@ public abstract class Isochrone { output.addNode(n); } + output.afterCalculation(); return output; } diff --git a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java index 523e8210a38ace090cec0cf89b216faebc523039..40000e9dfd8ad5624a7e7ea06a4eda189468da6f 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java +++ b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java @@ -41,4 +41,15 @@ public class MemoryOutput implements Output { public void addNode(final Node node) { nodes.add(node); } + + @Override + public void afterCalculation() { + // No post-processing of calculated isochrone + } + + @Override + public void beforeCalculation() { + // No pre-processing of calculated isochrone + } + } diff --git a/src/main/java/it/unibz/inf/isochrone/network/Output.java b/src/main/java/it/unibz/inf/isochrone/network/Output.java index 84104741f2de0299f271aab192032658f918289d..a69f87b1707e474d38e347f3fa98ab743b0de550 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/Output.java +++ b/src/main/java/it/unibz/inf/isochrone/network/Output.java @@ -19,4 +19,16 @@ public interface Output { */ void addNode(Node node); + /** + * This is called after all links and nodes are stored in this output. + * Can be useful to save results in the database (or similar) + */ + void afterCalculation(); + + /** + * This is called before links and/or nodes are stored in this output. + * Can be useful to set up some datatypes (clear maps, ...). + */ + void beforeCalculation(); + } diff --git a/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java b/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java index adb025f2a00f4a8af9c376405562cae77f1785e7..f7375287af8e811ecd8d4ef956721a23a6e34308 100644 --- a/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java +++ b/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java @@ -20,20 +20,24 @@ import org.apache.commons.dbutils.DbUtils; * An output which stores links and vertices to the database for calculating the bounding box. */ public class BBoxOutput extends MemoryOutput { - private BBox boundingBox; - private boolean isSavedInDatabase; + private final DatabaseWeb db; + private final Direction direction; private final String query; private final int serverSRID; + private BBox boundingBox; + private boolean isSavedInDatabase; // Constructors - public BBoxOutput(final ConfigDataset config) { + public BBoxOutput(final ConfigDataset config, final DatabaseWeb db, final Direction direction) { super(); - final String cfgEdgeTable = config.getEdgeTableEntry().getTableName(); + this.db = db; + this.direction = direction; serverSRID = config.getServerSRID(); isSavedInDatabase = false; + final String cfgEdgeTable = config.getEdgeTableEntry().getTableName(); query = "SELECT ST_XMin(mbr.geo) min_x, ST_yMin(mbr.geo) min_y, ST_XMax(mbr.geo) max_x, ST_yMax(mbr.geo) max_y FROM " + "(SELECT st_transform(ST_SetSRID(st_extent(\"GEOMETRY\"),?),?) GEO FROM " + cfgEdgeTable + ") MBR"; } @@ -56,6 +60,15 @@ public class BBoxOutput extends MemoryOutput { super.addNode(node); } + @Override + public void afterCalculation() { + db.storeLinks(getLinks().values(), direction); + db.storeVertices(getNodes()); + db.updateVertexTable(); + + isSavedInDatabase = true; + } + public BBox getBoundingBox() { if (!isSavedInDatabase) { throw new IllegalStateException("Can not calculate bounding box, since results have not been saved to database"); @@ -67,6 +80,8 @@ public class BBoxOutput extends MemoryOutput { return boundingBox; } + // Private methods + private void calculateBoundingBox() { final ConfigIsochrone configIso = ConfigIsochrone.getInstance(); final Connection connection = configIso.getConnection(); @@ -93,12 +108,4 @@ public class BBoxOutput extends MemoryOutput { DbUtils.closeQuietly(statement); } } - - public void saveInDatabase(final DatabaseWeb db, final Direction direction) { - db.storeLinks(getLinks().values(), direction); - db.storeVertices(getNodes()); - db.updateVertexTable(); - - isSavedInDatabase = true; - } } diff --git a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java index fabbefdc73aa16eae321a8734a2d918da4002cec..aac24fe8908f8809139b1b44bb3cee2e2ff6c905 100644 --- a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java +++ b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java @@ -56,7 +56,7 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response final ConfigClient config = ConfigClient.getInstance(clientId, dataset); - // register layers which have not been preregistered in ServiceConfiguration class + // register layers which have not been pre-registered in ServiceConfiguration class if (!config.isRegistered()) { registerTableAndLayers(ConfigIsochrone.getInstance().getConnection(), config); } @@ -68,10 +68,8 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response truncateTables(config); final Query query = new Query(direction, request.getSpeed(), request.getDmax(), request.getDate(), true, request.getMode()); query.setLocations(locationsFromQueryNodes(request.getQueryNodes(), db)); - final Isochrone isochrone = getAlgorithm(request.getAlgorithm(), config, query); - final BBoxOutput output = isochrone.compute(new BBoxOutput(config)); - output.saveInDatabase(db, direction); + final BBoxOutput output = isochrone.compute(new BBoxOutput(config, db, direction)); final long timeIsochrone = System.currentTimeMillis() - startComputationTiming; long startCoverageTiming = 0;