From 3d3ff55b5b0f6001ef523e4d044a260664576184 Mon Sep 17 00:00:00 2001
From: Nikolaus Krismer <nikolaus.krismer@uibk.ac.at>
Date: Mon, 25 Aug 2014 19:39:46 +0200
Subject: [PATCH] not using LinkConnection anymore (needs more memory) reworked
 addLinks in IOutout interface utilizing jdk8 functionality in isochrone class

---
 .../inf/isochrone/algorithm/Isochrone.java    | 32 ++++++----
 .../it/unibz/inf/isochrone/db/Database.java   | 58 ++++++-------------
 .../inf/isochrone/network/LinkCollection.java | 31 ----------
 .../inf/isochrone/network/MemoryOutput.java   | 21 ++++---
 .../inf/isochrone/network/ComparisonTest.java |  4 +-
 .../isochrone/network/ReachabilityTest.java   |  2 +-
 6 files changed, 54 insertions(+), 94 deletions(-)
 delete mode 100644 src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java

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 49c4dfa9..75c98052 100644
--- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java
+++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java
@@ -5,7 +5,6 @@ import it.unibz.inf.isochrone.db.Database;
 import it.unibz.inf.isochrone.network.AbstractOutput;
 import it.unibz.inf.isochrone.network.IOutput;
 import it.unibz.inf.isochrone.network.Link;
-import it.unibz.inf.isochrone.network.LinkCollection;
 import it.unibz.inf.isochrone.network.Location;
 import it.unibz.inf.isochrone.network.MemoryOutput;
 import it.unibz.inf.isochrone.network.Node;
@@ -22,6 +21,8 @@ import java.util.Map;
 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
@@ -163,17 +164,22 @@ public abstract class Isochrone {
 		while ((node = nodeQueue.poll()) != null) {
 			final int nodeId = node.getId();
 
-			final LinkCollection links = new LinkCollection(calcAdjLinks(nodeId));
+			final Collection<Link> links = calcAdjLinks(nodeId);
 			output.addNode(node);
 			node.close();
 
 			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.getContinuousTargets());
 			if (qIsExpiring && node.isExpired()) {
 				removeNode(nodeId);
 			}
@@ -359,25 +365,27 @@ public abstract class Isochrone {
 		}
 	}
 
-	private NodeConnection prepareContinuousLinks(final Node node, final LinkCollection links) {
+	private NodeConnection prepareContinuousLinks(final Node node, final Collection<Link> links) {
 		final NodeConnection nConnection = new NodeConnection(node);
 		final double nodeDistance = node.getDistance();
 
-		final Collection<Link> cLinks = links.getContinuousTargets();
-		for (final Link link : cLinks) {
-			prepareLinkOffsets(link, nodeDistance);
-			addTargetNode(nConnection, node, link);
+		for (final Link link : links) {
+			if (link.isContinuous()) {
+				prepareLinkOffsets(link, nodeDistance);
+				addTargetNode(nConnection, node, link);
+			}
 		}
 
 		return nConnection;
 	}
 
-	private NodeConnection prepareDiscreteLinks(final Node node, final LinkCollection links) {
+	private NodeConnection prepareDiscreteLinks(final Node node, final Collection<Link> links) {
 		final NodeConnection nConnection = new NodeConnection(node);
 
-		final Collection<Link> dLinks = links.getDiscreteTargets();
-		for (final Link link : dLinks) {
-			addTargetNode(nConnection, node, link);
+		for (final Link link : links) {
+			if (!link.isContinuous()) {
+				addTargetNode(nConnection, node, link);
+			}
 		}
 
 		return nConnection;
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 aff4903a..50fd5d30 100644
--- a/src/main/java/it/unibz/inf/isochrone/db/Database.java
+++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java
@@ -155,7 +155,15 @@ public class Database {
 
 	// Public methods
 
-	private void addNodesAndLink(final Link link, final short degree, final Map<Integer, Node> nodes, final Map<Integer, Collection<Link>> adjList) {
+	private void addLink(final int id, final Link link, final Map<Integer, Collection<Link>> adjList) {
+		if (!adjList.containsKey(id)) {
+			adjList.put(id, new ArrayList<>());
+		}
+
+		adjList.get(id).add(link);
+	}
+
+	private int addNodes(final Link link, final short degree, final Map<Integer, Node> nodes) {
 		int n1, n2;
 		if (isIncoming) {
 			n1 = link.getStartNode();
@@ -167,11 +175,8 @@ public class Database {
 
 		addNode(n1, degree, nodes);
 		addNode(n2, nodes);
-		if (!adjList.containsKey(n2)) {
-			adjList.put(n2, new ArrayList<Link>());
-		}
 
-		adjList.get(n2).add(link);
+		return n2;
 	}
 
 	/**
@@ -354,12 +359,8 @@ public class Database {
 				final int targetId = rs.getInt("TARGET");
 				final short degree = rs.getShort("NODE_DEGREE");
 				final double length = rs.getDouble("LENGTH");
-				if (isIncoming) {
-					addNode(sourceId, degree, nodes);
-				} else {
-					addNode(targetId, degree, nodes);
-				}
 
+				addNode((isIncoming) ? sourceId : targetId, degree, nodes);
 				link = new Link(linkId, sourceId, targetId, length);
 			}
 		} catch (final SQLException e) {
@@ -473,17 +474,9 @@ public class Database {
 				final int sourceId = rs.getInt("SOURCE");
 				final short degree = rs.getShort("DEGREE");
 				final int targetId = rs.getInt("TARGET");
-				final byte edgeMode = rs.getByte("EDGE_MODE");
-				Link l = null;
-				if (edgeMode == NW_MODE_CONTINUOUS) {
-					final double length = rs.getDouble("LENGTH");
-					l = new Link(linkId, sourceId, targetId, length);
-				} else {
-					final short routeId = rs.getShort("ROUTE_ID");
-					l = new Link(linkId, sourceId, targetId, routeId);
-				}
 
-				addNodesAndLink(l, degree, nodes, adjList);
+				final Link link = new Link(linkId, sourceId, targetId, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID"));
+				addLink(addNodes(link, degree, nodes), link, adjList);
 			}
 		} catch (final SQLException e) {
 			System.err.println("Problems with node:" + node);
@@ -508,12 +501,8 @@ 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");
-				final double length = rs.getDouble("LENGTH");
-				final short routeId = rs.getShort("ROUTE_ID");
-				final byte linkType = rs.getByte("EDGE_MODE");
 
 				int start, end;
 				if (isIncoming) {
@@ -523,23 +512,21 @@ public class Database {
 					start = endNodeId;
 					end = startNodeId;
 				}
-				Node node;
+
+				final Node node;
 				if (!nodes.containsKey(end)) {
 					node = new Node(end);
 					nodes.put(end, node);
 				} else {
 					node = nodes.get(end);
 				}
+
 				if (node.getAdjLinks() == null) {
 					node.setAdjLinks(new ArrayList<Link>());
 				}
-				Link link;
 
-				if (linkType == NW_MODE_CONTINUOUS) {
-					link = new Link(linkId, startNodeId, endNodeId, length);
-				} else {
-					link = new Link(linkId, startNodeId, endNodeId, routeId);
-				}
+				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"));
 				node.addAdjLink(link);
 				links.put(linkId, link);
 				if (!nodes.containsKey(start)) {
@@ -639,14 +626,7 @@ public class Database {
 			end = adjNodeId;
 		}
 
-		final int linkId = rs.getInt("ID");
-		if (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) {
-			final double length = rs.getDouble("LENGTH");
-			return new Link(linkId, start, end, length);
-		}
-
-		final short routeId = rs.getShort("ROUTE_ID");
-		return new Link(linkId, start, end, routeId);
+		return new Link(rs.getInt("ID"), start, end, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID"));
 	}
 
 	/**
diff --git a/src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java b/src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java
deleted file mode 100644
index f8a6f79e..00000000
--- a/src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package it.unibz.inf.isochrone.network;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-public class LinkCollection {
-	private final Collection<Link> cTargets;
-	private final Collection<Link> dTargets;
-
-	public LinkCollection(final Collection<Link> links) {
-		cTargets = new ArrayList<>();
-		dTargets = new ArrayList<>();
-
-		for (final Link l : links) {
-			if (l.isContinuous()) {
-				cTargets.add(l);
-			} else {
-				dTargets.add(l);
-			}
-		}
-	}
-
-	public Collection<Link> getContinuousTargets() {
-		return cTargets;
-	}
-
-	public Collection<Link> getDiscreteTargets() {
-		return dTargets;
-	}
-
-}
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 0dc0100e..259b0599 100644
--- a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java
+++ b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java
@@ -1,33 +1,31 @@
 package it.unibz.inf.isochrone.network;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * A sample output class, which simply stores all nodes and returns if needed.
  * This is mainly used for testing purposes.
  */
 public class MemoryOutput extends AbstractOutput {
-	private final Map<Integer, Link> links;
-	private final Set<Node> nodes;
+	private final Collection<Link> links;
+	private final Collection<Node> nodes;
 
 	// Constructor
 
 	public MemoryOutput() {
-		links = new HashMap<>();
+		links = new ArrayList<>();
 		nodes = new HashSet<>();
 	}
 
 	// Getter
 
-	public Map<Integer, Link> getLinks() {
+	public Collection<Link> getLinks() {
 		return links;
 	}
 
-	public Set<Node> getNodes() {
+	public Collection<Node> getNodes() {
 		return nodes;
 	}
 
@@ -35,7 +33,12 @@ public class MemoryOutput extends AbstractOutput {
 
 	@Override
 	public void addLink(final Link link) {
-		links.put(link.getId(), link);
+		links.add(link);
+	}
+
+	@Override
+	public void addLinks(final Collection<Link> linkCollection) {
+		links.addAll(linkCollection);
 	}
 
 	@Override
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
index b90ddd17..e0489cb8 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
@@ -158,8 +158,8 @@ public final class ComparisonTest {
 				LOGGER.debug(" - comparing for isochrone duration: " + params.getDuration());
 				final MemoryOutput o1 = AlgorithmHelper.run(clazz1, params).getOutput();
 				final MemoryOutput o2 = AlgorithmHelper.run(clazz2, params).getOutput();
-				final Map<Integer, Link> l1 = o1.getLinks();
-				final Map<Integer, Link> l2 = o2.getLinks();
+				final Collection<Link> l1 = o1.getLinks();
+				final Collection<Link> l2 = o2.getLinks();
 
 				Assert.assertEquals(l1, l2,  n1 + " != " + n2);
 			}
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java
index 245facdf..4619ab33 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java
@@ -67,7 +67,7 @@ public class ReachabilityTest {
 
 		LOGGER.info("Checking nodes from FUB (15min isncoming isochrone)");
 		final AlgorithmResult result = AlgorithmHelper.run(MineX.class, PARAM_LOCAL, true);
-		final Collection<Link> resultLinks = result.getOutput().getLinks().values();
+		final Collection<Link> resultLinks = result.getOutput().getLinks();
 		LOGGER.info(" - found " + resultLinks.size() + " links");
 
 		boolean foundLink = false;
-- 
GitLab