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 75c980520caacd431219e0ea46531cba91583fa1..fab4c2ab02ffd5ca47624f18d1ff38c0205c4a3d 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java @@ -22,7 +22,6 @@ import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.Set; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * The Isochrone algorithm as described in the paper. As the @@ -34,6 +33,14 @@ import java.util.stream.Collectors; * algorithms which define the loading of the data from the database. */ public abstract class Isochrone { + private static final Predicate<Link> PREDICATE_LINK_CONT = new Predicate<Link>() { + private final Double dMin = Double.MIN_VALUE; + + @Override + public boolean test(final Link link) { + return link.isContinuous() && !dMin.equals(link.getStartOffset()); + } + }; private final Collection<Integer> dateCodes; private final AbstractQueue<Node> nodeQueue; private final long qDuration; @@ -170,16 +177,11 @@ public abstract class Isochrone { cConnections = prepareContinuousLinks(node, links); updateNodeQueue(expandContinuousLinks(cConnections)); - output.addLinks(links.stream().filter(new Predicate<Link>() { - @Override - public boolean test(final Link link) { - return link.isContinuous(); - } - }).collect(Collectors.toList())); dConnections = prepareDiscreteLinks(node, links); updateNodeQueue(expandDiscreteLinks(dConnections)); + output.addLinks(links.parallelStream().filter(PREDICATE_LINK_CONT)); if (qIsExpiring && node.isExpired()) { removeNode(nodeId); } @@ -229,7 +231,7 @@ public abstract class Isochrone { } } else { nConnection.addLink(targetNode, link); - } + } } /** diff --git a/src/main/java/it/unibz/inf/isochrone/db/Database.java b/src/main/java/it/unibz/inf/isochrone/db/Database.java index 50fd5d304c589943655f95966fdad992348f608c..ad9dea6d986d7d78fca489cdf9868c036a1a555f 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/Database.java +++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java @@ -475,7 +475,13 @@ public class Database { final short degree = rs.getShort("DEGREE"); final int targetId = rs.getInt("TARGET"); - final Link link = new Link(linkId, sourceId, targetId, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID")); + Link link = null; + if (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) { + link = new Link(linkId, sourceId, targetId, rs.getDouble("LENGTH")); + } else { + link = new Link(linkId, sourceId, targetId, rs.getShort("ROUTE_ID")); + } + addLink(addNodes(link, degree, nodes), link, adjList); } } catch (final SQLException e) { @@ -501,6 +507,7 @@ public class Database { try { rs = stmt.executeQuery(); while (rs.next()) { + final int linkId = rs.getInt("ID"); final int startNodeId = rs.getInt("SOURCE"); final int endNodeId = rs.getInt("TARGET"); @@ -525,8 +532,12 @@ public class Database { node.setAdjLinks(new ArrayList<Link>()); } - final int linkId = rs.getInt("ID"); - final Link link = new Link(linkId, startNodeId, endNodeId, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID")); + final Link link; + if (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) { + link = new Link(linkId, startNodeId, endNodeId, rs.getDouble("LENGTH")); + } else { + link = new Link(linkId, startNodeId, endNodeId, rs.getShort("ROUTE_ID")); + } node.addAdjLink(link); links.put(linkId, link); if (!nodes.containsKey(start)) { @@ -617,6 +628,8 @@ public class Database { // Private methods private Link createLinkFromResultSet(final int nodeId, final int adjNodeId, final ResultSet rs) throws SQLException { + final int linkId = rs.getInt("ID"); + int start, end; if (isIncoming) { start = adjNodeId; @@ -626,7 +639,14 @@ public class Database { end = adjNodeId; } - return new Link(rs.getInt("ID"), start, end, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID")); + final Link link; + if (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) { + link = new Link(linkId, start, end, rs.getDouble("LENGTH")); + } else { + link = new Link(linkId, start, end, rs.getShort("ROUTE_ID")); + } + + return link; } /** @@ -755,7 +775,7 @@ public class Database { */ private static void addNode(final int nodeId, final short nrAdjLinks, final Map<Integer, Node> nodes) { if (nodes == null) { - return; + return; // Just for safety } final Node node = nodes.get(nodeId); diff --git a/src/main/java/it/unibz/inf/isochrone/network/AbstractOutput.java b/src/main/java/it/unibz/inf/isochrone/network/AbstractOutput.java index 35af77965d146918de516d522514aebd6988a4a0..93b03759578ab6171bb7c3dc19081e9beebe08a0 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/AbstractOutput.java +++ b/src/main/java/it/unibz/inf/isochrone/network/AbstractOutput.java @@ -1,8 +1,22 @@ package it.unibz.inf.isochrone.network; import java.util.Collection; +import java.util.function.Consumer; +import java.util.stream.Stream; public abstract class AbstractOutput implements IOutput { + private final Consumer<Link> linkConsumer = new Consumer<Link>() { + @Override + public void accept(final Link link) { + addLink(link); + } + }; + private final Consumer<Node> nodeConsumer = new Consumer<Node>() { + @Override + public void accept(final Node node) { + addNode(node); + } + }; /** * This is called after all links and nodes are stored in this output. @@ -22,10 +36,18 @@ public abstract class AbstractOutput implements IOutput { } } + public void addLinks(final Stream<Link> linkStream) { + linkStream.forEach(linkConsumer); + } + public void addNodes(final Collection<Node> nodes) { for (final Node node : nodes) { addNode(node); } } + public void addNodes(final Stream<Node> nodeStream) { + nodeStream.forEach(nodeConsumer); + } + } 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 259b05994f9f4ff1532f75271f100eb89f7d2a6c..a9774553ac7b56103451d565f143db49381bcab8 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java +++ b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java @@ -1,8 +1,7 @@ package it.unibz.inf.isochrone.network; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; +import java.util.LinkedHashSet; /** * A sample output class, which simply stores all nodes and returns if needed. @@ -15,8 +14,8 @@ public class MemoryOutput extends AbstractOutput { // Constructor public MemoryOutput() { - links = new ArrayList<>(); - nodes = new HashSet<>(); + links = new LinkedHashSet<>(); + nodes = new LinkedHashSet<>(); } // Getter