Skip to content

Commit 6987806

Browse files
authored
Merge pull request graphhopper#1226 from ammagamma/allchedgeiterator_skippededges_fix
Makes AllCHEdgesIteratorImpl read/write skipped edges to/from shortcuts DataAccess
2 parents 1b1c22c + 562efde commit 6987806

File tree

5 files changed

+65
-10
lines changed

5 files changed

+65
-10
lines changed

core/src/main/java/com/graphhopper/routing/util/AbstractFlagEncoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -674,8 +674,8 @@ public double getDouble(long flags, int key) {
674674
}
675675

676676
/**
677-
* @param way: needed to retrieve tags
678-
* @param speed: speed guessed e.g. from the road type or other tags
677+
* @param way needed to retrieve tags
678+
* @param speed speed guessed e.g. from the road type or other tags
679679
* @return The assumed speed.
680680
*/
681681
protected double applyMaxSpeed(ReaderWay way, double speed) {

core/src/main/java/com/graphhopper/routing/util/BikeCommonFlagEncoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@ public long handleRelationTags(ReaderRelation relation, long oldRelationFlags) {
325325
* just only 90%.
326326
* <p>
327327
*
328-
* @param way: needed to retrieve tags
329-
* @param speed: speed guessed e.g. from the road type or other tags
328+
* @param way needed to retrieve tags
329+
* @param speed speed guessed e.g. from the road type or other tags
330330
* @return The assumed average speed.
331331
*/
332332
@Override

core/src/main/java/com/graphhopper/routing/util/CarFlagEncoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,8 @@ public String getWayInfo(ReaderWay way) {
335335
}
336336

337337
/**
338-
* @param way: needed to retrieve tags
339-
* @param speed: speed guessed e.g. from the road type or other tags
338+
* @param way needed to retrieve tags
339+
* @param speed speed guessed e.g. from the road type or other tags
340340
* @return The assumed speed
341341
*/
342342
protected double applyBadSurfaceSpeed(ReaderWay way, double speed) {

core/src/main/java/com/graphhopper/storage/CHGraphImpl.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -599,18 +599,25 @@ public int getMaxId() {
599599

600600
@Override
601601
public final void setSkippedEdges(int edge1, int edge2) {
602-
baseGraph.edges.setInt(edgePointer + S_SKIP_EDGE1, edge1);
603-
baseGraph.edges.setInt(edgePointer + S_SKIP_EDGE2, edge2);
602+
checkShortcut(true, "setSkippedEdges");
603+
if (EdgeIterator.Edge.isValid(edge1) != EdgeIterator.Edge.isValid(edge2)) {
604+
throw new IllegalStateException("Skipped edges of a shortcut needs "
605+
+ "to be both valid or invalid but they were not " + edge1 + ", " + edge2);
606+
}
607+
shortcuts.setInt(edgePointer + S_SKIP_EDGE1, edge1);
608+
shortcuts.setInt(edgePointer + S_SKIP_EDGE2, edge2);
604609
}
605610

606611
@Override
607612
public final int getSkippedEdge1() {
608-
return baseGraph.edges.getInt(edgePointer + S_SKIP_EDGE1);
613+
checkShortcut(true, "getSkippedEdge1");
614+
return shortcuts.getInt(edgePointer + S_SKIP_EDGE1);
609615
}
610616

611617
@Override
612618
public final int getSkippedEdge2() {
613-
return baseGraph.edges.getInt(edgePointer + S_SKIP_EDGE2);
619+
checkShortcut(true, "getSkippedEdge2");
620+
return shortcuts.getInt(edgePointer + S_SKIP_EDGE2);
614621
}
615622

616623
@Override
@@ -634,5 +641,13 @@ public final double getWeight() {
634641
public int getMergeStatus(long flags) {
635642
return PrepareEncoder.getScMergeStatus(getDirectFlags(), flags);
636643
}
644+
645+
void checkShortcut(boolean shouldBeShortcut, String methodName) {
646+
if (isShortcut()) {
647+
if (!shouldBeShortcut)
648+
throw new IllegalStateException("Cannot call " + methodName + " on shortcut " + getEdge());
649+
} else if (shouldBeShortcut)
650+
throw new IllegalStateException("Method " + methodName + " only for shortcuts " + getEdge());
651+
}
637652
}
638653
}

core/src/test/java/com/graphhopper/storage/GraphHopperStorageCHTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,46 @@ public void testSimpleShortcutCreationAndTraversal() {
344344
assertEquals(GHUtility.asSet(3, 4), GHUtility.getNeighbors(vehicleOutExplorer.setBaseNode(1)));
345345
}
346346

347+
@Test
348+
public void testAddShortcutSkippedEdgesWriteRead() {
349+
graph = createGHStorage();
350+
final EdgeIteratorState edge1 = graph.edge(1, 3, 10, true);
351+
final EdgeIteratorState edge2 = graph.edge(3, 4, 10, true);
352+
graph.freeze();
353+
354+
CHGraph lg = graph.getGraph(CHGraph.class);
355+
lg.shortcut(1, 4);
356+
357+
AllCHEdgesIterator iter = lg.getAllEdges();
358+
iter.next();
359+
iter.next();
360+
iter.next();
361+
assertTrue(iter.isShortcut());
362+
iter.setSkippedEdges(edge1.getEdge(), edge2.getEdge());
363+
assertEquals(edge1.getEdge(), iter.getSkippedEdge1());
364+
assertEquals(edge2.getEdge(), iter.getSkippedEdge2());
365+
}
366+
367+
@Test
368+
public void testAddShortcutSkippedEdgesWriteRead_writeWithCHEdgeIterator() {
369+
graph = createGHStorage();
370+
final EdgeIteratorState edge1 = graph.edge(1, 3, 10, true);
371+
final EdgeIteratorState edge2 = graph.edge(3, 4, 10, true);
372+
graph.freeze();
373+
374+
CHGraph lg = graph.getGraph(CHGraph.class);
375+
CHEdgeIteratorState shortcut = lg.shortcut(1, 4);
376+
shortcut.setSkippedEdges(edge1.getEdge(), edge2.getEdge());
377+
378+
AllCHEdgesIterator iter = lg.getAllEdges();
379+
iter.next();
380+
iter.next();
381+
iter.next();
382+
assertTrue(iter.isShortcut());
383+
assertEquals(edge1.getEdge(), iter.getSkippedEdge1());
384+
assertEquals(edge2.getEdge(), iter.getSkippedEdge2());
385+
}
386+
347387
@Test
348388
public void testShortcutCreationAndAccessForManyVehicles() {
349389
FlagEncoder tmpCar = new CarFlagEncoder();

0 commit comments

Comments
 (0)