Skip to content

Commit ab278cd

Browse files
committed
caching edge flags
1 parent 5b98e8e commit ab278cd

1 file changed

Lines changed: 55 additions & 15 deletions

File tree

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

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ public final boolean next() {
579579
}
580580

581581
void goToNext() {
582+
refreshFlags = true;
582583
edgePointer = store.toEdgePointer(nextEdgeId);
583584
edgeId = nextEdgeId;
584585
int nodeA = store.getNodeA(edgePointer);
@@ -616,6 +617,7 @@ public int length() {
616617
@Override
617618
public boolean next() {
618619
edgeId++;
620+
refreshFlags = true;
619621
if (edgeId >= store.getEdges())
620622
return false;
621623
edgePointer = store.toEdgePointer(edgeId);
@@ -656,11 +658,16 @@ static class EdgeIteratorStateImpl implements EdgeIteratorState {
656658
boolean reverse = false;
657659
int edgeId = -1;
658660
private final EdgeBytesAccess edgeAccess;
661+
private final byte[] cachedBytes;
662+
private final EdgeBytesAccessArray cachedAccess;
663+
boolean refreshFlags = true;
659664

660665
public EdgeIteratorStateImpl(BaseGraph baseGraph) {
661666
this.baseGraph = baseGraph;
662667
edgeAccess = baseGraph.getEdgeBytesAccess();
663668
store = baseGraph.store;
669+
cachedBytes = new byte[baseGraph.getBytesForFlags()];
670+
cachedAccess = new EdgeBytesAccessArray(cachedBytes);
664671
}
665672

666673
/**
@@ -673,7 +680,7 @@ final boolean init(int edgeId, int expectedAdjNode) {
673680
edgePointer = store.toEdgePointer(edgeId);
674681
baseNode = store.getNodeA(edgePointer);
675682
adjNode = store.getNodeB(edgePointer);
676-
683+
refreshFlags = true;
677684
if (expectedAdjNode == adjNode || expectedAdjNode == Integer.MIN_VALUE) {
678685
reverse = false;
679686
return true;
@@ -697,7 +704,7 @@ final void init(int edgeKey) {
697704
edgePointer = store.toEdgePointer(edgeId);
698705
baseNode = store.getNodeA(edgePointer);
699706
adjNode = store.getNodeB(edgePointer);
700-
707+
refreshFlags = true;
701708
if (edgeKey % 2 == 0) {
702709
reverse = false;
703710
} else {
@@ -729,39 +736,50 @@ public EdgeIteratorState setDistance(double dist) {
729736
return this;
730737
}
731738

739+
void refreshFlagsIfNecessary() {
740+
if (refreshFlags) {
741+
edgeAccess.getBytes(edgeId, 0, cachedBytes, 0, cachedBytes.length);
742+
refreshFlags = false;
743+
}
744+
}
745+
732746
@Override
733747
public BytesRef getFlags() {
734-
byte[] bytes = new byte[store.getBytesForFlags()];
735-
edgeAccess.getBytes(edgeId, 0, bytes, 0, bytes.length);
736-
return new BytesRef(bytes, 0, bytes.length); // TODO use just byte[] as public API?
748+
refreshFlagsIfNecessary();
749+
return new BytesRef(cachedBytes, 0, cachedBytes.length); // TODO use just byte[] as public API?
737750
}
738751

739752
@Override
740753
public final EdgeIteratorState setFlags(BytesRef edgeFlags) {
741754
assert edgeId < store.getEdges() : "must be edge but was shortcut: " + edgeId + " >= " + store.getEdges() + ". Use setFlagsAndWeight";
742755
edgeAccess.setBytes(edgeId, 0, edgeFlags.bytes, 0, edgeFlags.bytes.length);
756+
refreshFlags = true;
743757
return this;
744758
}
745759

746760
@Override
747761
public boolean get(BooleanEncodedValue property) {
748-
return property.getBool(reverse, edgeId, edgeAccess);
762+
refreshFlagsIfNecessary();
763+
return property.getBool(reverse, edgeId, cachedAccess);
749764
}
750765

751766
@Override
752767
public EdgeIteratorState set(BooleanEncodedValue property, boolean value) {
753768
property.setBool(reverse, edgeId, edgeAccess, value);
769+
refreshFlags = true;
754770
return this;
755771
}
756772

757773
@Override
758774
public boolean getReverse(BooleanEncodedValue property) {
759-
return property.getBool(!reverse, edgeId, edgeAccess);
775+
refreshFlagsIfNecessary();
776+
return property.getBool(!reverse, edgeId, cachedAccess);
760777
}
761778

762779
@Override
763780
public EdgeIteratorState setReverse(BooleanEncodedValue property, boolean value) {
764781
property.setBool(!reverse, edgeId, edgeAccess, value);
782+
refreshFlags = true;
765783
return this;
766784
}
767785

@@ -771,28 +789,33 @@ public EdgeIteratorState set(BooleanEncodedValue property, boolean fwd, boolean
771789
throw new IllegalArgumentException("EncodedValue " + property.getName() + " supports only one direction");
772790
property.setBool(reverse, edgeId, edgeAccess, fwd);
773791
property.setBool(!reverse, edgeId, edgeAccess, bwd);
792+
refreshFlags = true;
774793
return this;
775794
}
776795

777796
@Override
778797
public int get(IntEncodedValue property) {
779-
return property.getInt(reverse, edgeId, edgeAccess);
798+
refreshFlagsIfNecessary();
799+
return property.getInt(reverse, edgeId, cachedAccess);
780800
}
781801

782802
@Override
783803
public EdgeIteratorState set(IntEncodedValue property, int value) {
784804
property.setInt(reverse, edgeId, edgeAccess, value);
805+
refreshFlags = true;
785806
return this;
786807
}
787808

788809
@Override
789810
public int getReverse(IntEncodedValue property) {
790-
return property.getInt(!reverse, edgeId, edgeAccess);
811+
refreshFlagsIfNecessary();
812+
return property.getInt(!reverse, edgeId, cachedAccess);
791813
}
792814

793815
@Override
794816
public EdgeIteratorState setReverse(IntEncodedValue property, int value) {
795817
property.setInt(!reverse, edgeId, edgeAccess, value);
818+
refreshFlags = true;
796819
return this;
797820
}
798821

@@ -802,28 +825,33 @@ public EdgeIteratorState set(IntEncodedValue property, int fwd, int bwd) {
802825
throw new IllegalArgumentException("EncodedValue " + property.getName() + " supports only one direction");
803826
property.setInt(reverse, edgeId, edgeAccess, fwd);
804827
property.setInt(!reverse, edgeId, edgeAccess, bwd);
828+
refreshFlags = true;
805829
return this;
806830
}
807831

808832
@Override
809833
public double get(DecimalEncodedValue property) {
810-
return property.getDecimal(reverse, edgeId, edgeAccess);
834+
refreshFlagsIfNecessary();
835+
return property.getDecimal(reverse, edgeId, cachedAccess);
811836
}
812837

813838
@Override
814839
public EdgeIteratorState set(DecimalEncodedValue property, double value) {
815840
property.setDecimal(reverse, edgeId, edgeAccess, value);
841+
refreshFlags = true;
816842
return this;
817843
}
818844

819845
@Override
820846
public double getReverse(DecimalEncodedValue property) {
821-
return property.getDecimal(!reverse, edgeId, edgeAccess);
847+
refreshFlagsIfNecessary();
848+
return property.getDecimal(!reverse, edgeId, cachedAccess);
822849
}
823850

824851
@Override
825852
public EdgeIteratorState setReverse(DecimalEncodedValue property, double value) {
826853
property.setDecimal(!reverse, edgeId, edgeAccess, value);
854+
refreshFlags = true;
827855
return this;
828856
}
829857

@@ -833,28 +861,33 @@ public EdgeIteratorState set(DecimalEncodedValue property, double fwd, double bw
833861
throw new IllegalArgumentException("EncodedValue " + property.getName() + " supports only one direction");
834862
property.setDecimal(reverse, edgeId, edgeAccess, fwd);
835863
property.setDecimal(!reverse, edgeId, edgeAccess, bwd);
864+
refreshFlags = true;
836865
return this;
837866
}
838867

839868
@Override
840869
public <T extends Enum<?>> T get(EnumEncodedValue<T> property) {
841-
return property.getEnum(reverse, edgeId, edgeAccess);
870+
refreshFlagsIfNecessary();
871+
return property.getEnum(reverse, edgeId, cachedAccess);
842872
}
843873

844874
@Override
845875
public <T extends Enum<?>> EdgeIteratorState set(EnumEncodedValue<T> property, T value) {
846876
property.setEnum(reverse, edgeId, edgeAccess, value);
877+
refreshFlags = true;
847878
return this;
848879
}
849880

850881
@Override
851882
public <T extends Enum<?>> T getReverse(EnumEncodedValue<T> property) {
852-
return property.getEnum(!reverse, edgeId, edgeAccess);
883+
refreshFlagsIfNecessary();
884+
return property.getEnum(!reverse, edgeId, cachedAccess);
853885
}
854886

855887
@Override
856888
public <T extends Enum<?>> EdgeIteratorState setReverse(EnumEncodedValue<T> property, T value) {
857889
property.setEnum(!reverse, edgeId, edgeAccess, value);
890+
refreshFlags = true;
858891
return this;
859892
}
860893

@@ -864,28 +897,33 @@ public <T extends Enum<?>> EdgeIteratorState set(EnumEncodedValue<T> property, T
864897
throw new IllegalArgumentException("EncodedValue " + property.getName() + " supports only one direction");
865898
property.setEnum(reverse, edgeId, edgeAccess, fwd);
866899
property.setEnum(!reverse, edgeId, edgeAccess, bwd);
900+
refreshFlags = true;
867901
return this;
868902
}
869903

870904
@Override
871905
public String get(StringEncodedValue property) {
872-
return property.getString(reverse, edgeId, edgeAccess);
906+
refreshFlagsIfNecessary();
907+
return property.getString(reverse, edgeId, cachedAccess);
873908
}
874909

875910
@Override
876911
public EdgeIteratorState set(StringEncodedValue property, String value) {
877912
property.setString(reverse, edgeId, edgeAccess, value);
913+
refreshFlags = true;
878914
return this;
879915
}
880916

881917
@Override
882918
public String getReverse(StringEncodedValue property) {
883-
return property.getString(!reverse, edgeId, edgeAccess);
919+
refreshFlagsIfNecessary();
920+
return property.getString(!reverse, edgeId, cachedAccess);
884921
}
885922

886923
@Override
887924
public EdgeIteratorState setReverse(StringEncodedValue property, String value) {
888925
property.setString(!reverse, edgeId, edgeAccess, value);
926+
refreshFlags = true;
889927
return this;
890928
}
891929

@@ -895,11 +933,13 @@ public EdgeIteratorState set(StringEncodedValue property, String fwd, String bwd
895933
throw new IllegalArgumentException("EncodedValue " + property.getName() + " supports only one direction");
896934
property.setString(reverse, edgeId, edgeAccess, fwd);
897935
property.setString(!reverse, edgeId, edgeAccess, bwd);
936+
refreshFlags = true;
898937
return this;
899938
}
900939

901940
@Override
902941
public final EdgeIteratorState copyPropertiesFrom(EdgeIteratorState edge) {
942+
refreshFlags = true;
903943
return baseGraph.copyProperties(edge, this);
904944
}
905945

0 commit comments

Comments
 (0)