@@ -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