public SortedSet<Edge> connectedEdges() { final SortedSet<Edge> result = new TreeSet<>(); result.addAll(inEdges()); result.addAll(outEdges()); return result; }
/** * @return All the {@link Edge}s connected and pointing to the start {@link Node} of this * {@link Edge}. If this {@link Edge} is a two-way road, then the reversed {@link Edge} * will be included in the set. */ public Set<Edge> inEdges() { return this.start().inEdges(); }
@Override public JsonObject geoJsonProperties() { final JsonObject properties = super.geoJsonProperties(); final JsonArray inEdgesArray = new JsonArray(); final JsonArray outEdgesArray = new JsonArray(); for (final Edge edge : this.inEdges()) { inEdgesArray.add(new JsonPrimitive(edge.getIdentifier())); } for (final Edge edge : this.outEdges()) { outEdgesArray.add(new JsonPrimitive(edge.getIdentifier())); } // Adding a JSON array with the edge IDs. // In the RFC spec, nested objects are ok in properties. // https://tools.ietf.org/html/rfc7946#section-1.5 properties.add("inEdges", inEdgesArray); properties.add("outEdges", outEdgesArray); return properties; }
@Override public SortedSet<Edge> inEdges() { return subNode().inEdges().stream() .map(edge -> new DynamicEdge(dynamicAtlas(), edge.getIdentifier())) .collect(Collectors.toCollection(TreeSet::new)); }
/** * Create a full copy of the given node. * * @param node * the {@link Node} to deep copy * @return the new {@link CompleteNode} */ public static CompleteNode from(final Node node) { return new CompleteNode(node.getIdentifier(), node.getLocation(), node.getTags(), node.inEdges().stream().map(Edge::getIdentifier) .collect(Collectors.toCollection(TreeSet::new)), node.outEdges().stream().map(Edge::getIdentifier) .collect(Collectors.toCollection(TreeSet::new)), node.relations().stream().map(Relation::getIdentifier).collect(Collectors.toSet())); }
@Override public SortedSet<Edge> inEdges() { return attachedEdgesFromOverlappingNodes(node -> node.inEdges(), multiAtlas().getNodeIdentifiersToRemovedInEdges()); }
add(properties, "inEdges", ((Node) source).inEdges(), identifierMapper); add(properties, "outEdges", ((Node) source).outEdges(), identifierMapper);
private boolean differentNodes(final Node baseNode, final Node alterNode) { try { if (!baseNode.getLocation().equals(alterNode.getLocation())) { return true; } if (differentEdgeSet(baseNode.inEdges(), alterNode.inEdges())) { return true; } if (differentEdgeSet(baseNode.outEdges(), alterNode.outEdges())) { return true; } return false; } catch (final Exception e) { throw new CoreException("Unable to compare nodes {} and {}", baseNode, alterNode, e); } }
@Override public String toString() { return "[Node: id=" + this.getIdentifier() + ", location=" + this.getLocation() + ", inEdges=" + connectedEdgesIdentifiers(() -> inEdges()) + ", outEdges=" + connectedEdgesIdentifiers(() -> outEdges()) + ", " + tagString() + "]"; }
@Override public String toDiffViewFriendlyString() { final String relationsString = this.parentRelationsAsDiffViewFriendlyString(); return "[Node: id=" + this.getIdentifier() + ", location=" + this.getLocation() + ", inEdges=" + connectedEdgesIdentifiers(() -> inEdges()) + ", outEdges=" + connectedEdgesIdentifiers(() -> outEdges()) + ", relations=(" + relationsString + "), " + tagString() + "]"; }
((Node) this).inEdges() .forEach(edge -> inEdges.add(edge != null ? edge.getIdentifier() : "null")); ((Node) this).outEdges()
protected void validateNodeToEdgeConnectivity() { for (final Node node : this.atlas.nodes()) { for (final Edge edge : node.inEdges()) { if (edge == null) { throw new CoreException( "Node {} is logically disconnected from some referenced in edge.", node.getIdentifier()); } } for (final Edge edge : node.outEdges()) { if (edge == null) { throw new CoreException("Node {} is logically disconnected from some out edge.", node.getIdentifier()); } } } }
@Test public void connectivityTest() { this.multi.forEach(atlasItem -> logger.trace(atlasItem.toString())); // Out edges of CC2: 987 Assert.assertEquals(1, this.multi.edge(6).end().outEdges().size()); Assert.assertEquals(987, this.multi.edge(6).end().outEdges().iterator().next().getIdentifier()); Assert.assertEquals(2, this.multi.edge(-9).end().outEdges().size()); Assert.assertEquals(2, this.multi.edge(-9).end().inEdges().size()); Assert.assertEquals(2, this.multi.edge(987).start().inEdges().size()); }
@Test public void testFull() { final Atlas atlas = this.rule.getAtlas(); final Node source = atlas.node(1); final CompleteNode result = CompleteNode.from(source); Assert.assertEquals(source.getIdentifier(), result.getIdentifier()); Assert.assertEquals(source.bounds(), result.bounds()); Assert.assertEquals(source.getLocation(), result.getLocation()); Assert.assertEquals( source.inEdges().stream().map(Edge::getIdentifier) .collect(Collectors.toCollection(TreeSet::new)), result.inEdges().stream().map(Edge::getIdentifier) .collect(Collectors.toCollection(TreeSet::new))); Assert.assertEquals( source.outEdges().stream().map(Edge::getIdentifier) .collect(Collectors.toCollection(TreeSet::new)), result.outEdges().stream().map(Edge::getIdentifier) .collect(Collectors.toCollection(TreeSet::new))); Assert.assertEquals(source.getTags(), result.getTags()); Assert.assertEquals( source.relations().stream().map(Relation::getIdentifier) .collect(Collectors.toSet()), result.relations().stream().map(Relation::getIdentifier) .collect(Collectors.toSet())); }
multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_1_ID_LONG).inEdges().isEmpty()); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_1_ID_LONG).outEdges() .contains(multiAtlas.edge(123456789120001L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).inEdges() .contains(multiAtlas.edge(123456789120001L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).inEdges() .contains(multiAtlas.edge(223456789120000L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).outEdges() Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_3_ID_LONG).inEdges() .contains(multiAtlas.edge(123456789120002L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_3_ID_LONG).outEdges() multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_4_ID_LONG).inEdges().isEmpty()); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_4_ID_LONG).outEdges() .contains(multiAtlas.edge(223456789120000L)));
edge.getIdentifier()); if (end.inEdges().stream() .noneMatch(edgeAtNode -> edgeAtNode.getIdentifier() == edge.getIdentifier()))
multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_1_ID_LONG).inEdges().isEmpty()); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_1_ID_LONG).outEdges() .contains(multiAtlas.edge(123456789120001L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).inEdges() .contains(multiAtlas.edge(123456789120001L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).outEdges() Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_3_ID_LONG).inEdges() .contains(multiAtlas.edge(123456789120002L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_3_ID_LONG).outEdges()
multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_1_ID_LONG).inEdges().isEmpty()); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_1_ID_LONG).outEdges() .contains(multiAtlas.edge(123456789120001L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).inEdges() .contains(multiAtlas.edge(123456789120001L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_2_ID_LONG).outEdges() Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_3_ID_LONG).inEdges() .contains(multiAtlas.edge(123456789120002L))); Assert.assertTrue(multiAtlas.node(MultiAtlasBorderFixerTestRule.POINT_3_ID_LONG).outEdges()
@Test public void testConnectivity() { final Node node123 = this.atlas.node(123); final Node node1234 = this.atlas.node(1234); final Node node12345 = this.atlas.node(12345); final Edge edge9 = this.atlas.edge(9); final Edge edgeMinus9 = this.atlas.edge(-9); final Edge edge98 = this.atlas.edge(98); final Edge edge987 = this.atlas.edge(987); Assert.assertTrue(edge9.end().outEdges().contains(edge98)); Assert.assertTrue(edge9.end().outEdges().contains(edgeMinus9)); Assert.assertTrue(edge98.end().outEdges().contains(edge987)); Assert.assertTrue(edge987.end().outEdges().contains(edge9)); Assert.assertTrue(edge9.start().inEdges().contains(edge987)); Assert.assertTrue(edge9.start().inEdges().contains(edgeMinus9)); Assert.assertTrue(edge98.start().inEdges().contains(edge9)); Assert.assertTrue(edge987.start().inEdges().contains(edge98)); Assert.assertEquals(node123, edge9.start()); Assert.assertEquals(node123, edgeMinus9.end()); Assert.assertEquals(node123, edge987.end()); Assert.assertEquals(node1234, edge9.end()); Assert.assertEquals(node1234, edgeMinus9.start()); Assert.assertEquals(node1234, edge98.start()); Assert.assertEquals(node12345, edge98.end()); Assert.assertEquals(node12345, edge987.start()); }
protected void validateNodeToEdgeLocationAccuracy() { for (final Node node : this.atlas.nodes()) { final Location nodeLocation = node.getLocation(); for (final Edge edge : node.outEdges()) { final Location edgeStartLocation = edge.asPolyLine().first(); if (!nodeLocation.equals(edgeStartLocation)) { throw new CoreException( "Edge {} with start location {} does not match with its start Node {} at location: {}", edge.getIdentifier(), edgeStartLocation, edge.start().getIdentifier(), nodeLocation); } } for (final Edge edge : node.inEdges()) { final Location edgeEndLocation = edge.asPolyLine().last(); if (!nodeLocation.equals(edgeEndLocation)) { throw new CoreException( "Edge {} with end location {} does not match with its end Node {} at location: {}", edge.getIdentifier(), edgeEndLocation, edge.end().getIdentifier(), nodeLocation); } } } } }