From 86b08b7568ecfd4c0316b3af8540229a2fb9fd7a Mon Sep 17 00:00:00 2001 From: MadWasp79 Date: Wed, 1 Jul 2020 13:29:56 +0300 Subject: [PATCH] fix cache and incomplete route offset --- .../osmand/binary/BinaryMapIndexReader.java | 12 +++---- .../BinaryMapTransportReaderAdapter.java | 7 ++-- .../osmand/data/IncompleteTransportRoute.java | 6 +++- .../router/TransportStopsRouteReader.java | 33 +++++++------------ 4 files changed, 24 insertions(+), 34 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java index 3e3b92a41e..c8f84796b9 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java @@ -111,7 +111,7 @@ public class BinaryMapIndexReader { /*private*/ List transportIndexes = new ArrayList(); /*private*/ List routingIndexes = new ArrayList(); /*private*/ List indexes = new ArrayList(); - Map> incompleteTransportRoutes = null; + TLongObjectHashMap incompleteTransportRoutes = null; protected CodedInputStream codedIS; @@ -2655,22 +2655,20 @@ public class BinaryMapIndexReader { } } - public Map> getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException { + + public TLongObjectHashMap getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException { if (incompleteTransportRoutes == null) { - incompleteTransportRoutes = new HashMap>(); + incompleteTransportRoutes = new TLongObjectHashMap<>(); for (TransportIndex ti : transportIndexes) { if (ti.incompleteRoutesLength > 0) { - TLongObjectHashMap indexIncompleteRoutes = new TLongObjectHashMap(); codedIS.seek(ti.incompleteRoutesOffset); int oldLimit = codedIS.pushLimit(ti.incompleteRoutesLength); - transportAdapter.readIncompleteRoutesList(indexIncompleteRoutes, ti.filePointer); + transportAdapter.readIncompleteRoutesList(incompleteTransportRoutes, ti.filePointer); codedIS.popLimit(oldLimit); - incompleteTransportRoutes.put(ti, indexIncompleteRoutes); } } } return incompleteTransportRoutes; } - } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java index 1f7a4ad6d5..1e733e50f6 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java @@ -253,7 +253,6 @@ public class BinaryMapTransportReaderAdapter { public void readIncompleteRoutesList(TLongObjectHashMap incompleteRoutes, int transportIndexStart) throws IOException { boolean end = false; - int offset = codedIS.getTotalBytesRead(); while (!end) { int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -264,7 +263,7 @@ public class BinaryMapTransportReaderAdapter { case OsmandOdb.IncompleteTransportRoutes.ROUTES_FIELD_NUMBER: int l = codedIS.readRawVarint32(); int olds = codedIS.pushLimit(l); - net.osmand.data.IncompleteTransportRoute ir = readIncompleteRoute(offset, transportIndexStart); + net.osmand.data.IncompleteTransportRoute ir = readIncompleteRoute(transportIndexStart); net.osmand.data.IncompleteTransportRoute itr = incompleteRoutes.get(ir.getRouteId()); if(itr != null) { itr.setNextLinkedRoute(ir); @@ -282,7 +281,7 @@ public class BinaryMapTransportReaderAdapter { } - public net.osmand.data.IncompleteTransportRoute readIncompleteRoute(int readOffset, int transportIndexStart) throws IOException { + public net.osmand.data.IncompleteTransportRoute readIncompleteRoute(int transportIndexStart) throws IOException { net.osmand.data.IncompleteTransportRoute dataObject = new net.osmand.data.IncompleteTransportRoute(); boolean end = false; while(!end){ @@ -300,7 +299,7 @@ public class BinaryMapTransportReaderAdapter { if (delta > transportIndexStart) { dataObject.setRouteOffset(delta); } else { - dataObject.setRouteOffset(readOffset - delta); + dataObject.setRouteOffset(transportIndexStart + delta); } break; case OsmandOdb.IncompleteTransportRoute.OPERATOR_FIELD_NUMBER : diff --git a/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java b/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java index 84be533a5f..9518f1237d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java @@ -13,7 +13,11 @@ public class IncompleteTransportRoute { } public void setNextLinkedRoute(IncompleteTransportRoute nextLinkedRoute) { - this.nextLinkedRoute = nextLinkedRoute; + if (this.nextLinkedRoute == null) { + this.nextLinkedRoute = nextLinkedRoute; + } else { + this.nextLinkedRoute.setNextLinkedRoute(nextLinkedRoute); + } } public long getRouteId() { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java b/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java index fd4b88e393..7428196332 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java @@ -389,32 +389,21 @@ public class TransportStopsRouteReader { List allRoutes = null; for (BinaryMapIndexReader bmir : routesFilesCache.keySet()) { // here we could limit routeMap indexes by only certain bbox around start / end (check comment on field) - if (!bmir.getIncompleteTransportRoutes().isEmpty()) { - for (Entry> entry : bmir.getIncompleteTransportRoutes().entrySet()) { - IncompleteTransportRoute ptr = entry.getValue().get(baseRoute.getId()); - if (ptr != null) { - TIntArrayList lst = new TIntArrayList(); - while (ptr != null) { - lst.add(ptr.getRouteOffset()); - ptr = ptr.getNextLinkedRoute(); - } - if (lst.size() > 0) { - if (allRoutes == null) { - allRoutes = new ArrayList(); - } - allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection()); - } + IncompleteTransportRoute ptr = bmir.getIncompleteTransportRoutes().get(baseRoute.getId()); + if (ptr != null) { + TIntArrayList lst = new TIntArrayList(); + while (ptr != null) { + lst.add(ptr.getRouteOffset()); + ptr = ptr.getNextLinkedRoute(); + } + if (lst.size() > 0) { + if (allRoutes == null) { + allRoutes = new ArrayList(); } + allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection()); } } } return allRoutes; } - - - - - - - }