fix cache and incomplete route offset

This commit is contained in:
MadWasp79 2020-07-01 13:29:56 +03:00
parent 9db069dd05
commit 86b08b7568
4 changed files with 24 additions and 34 deletions

View file

@ -111,7 +111,7 @@ public class BinaryMapIndexReader {
/*private*/ List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>(); /*private*/ List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>();
/*private*/ List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>(); /*private*/ List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>();
/*private*/ List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>(); /*private*/ List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>();
Map<TransportIndex, TLongObjectHashMap<IncompleteTransportRoute>> incompleteTransportRoutes = null; TLongObjectHashMap<IncompleteTransportRoute> incompleteTransportRoutes = null;
protected CodedInputStream codedIS; protected CodedInputStream codedIS;
@ -2655,22 +2655,20 @@ public class BinaryMapIndexReader {
} }
} }
public Map<TransportIndex, TLongObjectHashMap<IncompleteTransportRoute>> getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException {
public TLongObjectHashMap<IncompleteTransportRoute> getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException {
if (incompleteTransportRoutes == null) { if (incompleteTransportRoutes == null) {
incompleteTransportRoutes = new HashMap<TransportIndex, TLongObjectHashMap<IncompleteTransportRoute>>(); incompleteTransportRoutes = new TLongObjectHashMap<>();
for (TransportIndex ti : transportIndexes) { for (TransportIndex ti : transportIndexes) {
if (ti.incompleteRoutesLength > 0) { if (ti.incompleteRoutesLength > 0) {
TLongObjectHashMap<IncompleteTransportRoute> indexIncompleteRoutes = new TLongObjectHashMap<IncompleteTransportRoute>();
codedIS.seek(ti.incompleteRoutesOffset); codedIS.seek(ti.incompleteRoutesOffset);
int oldLimit = codedIS.pushLimit(ti.incompleteRoutesLength); int oldLimit = codedIS.pushLimit(ti.incompleteRoutesLength);
transportAdapter.readIncompleteRoutesList(indexIncompleteRoutes, ti.filePointer); transportAdapter.readIncompleteRoutesList(incompleteTransportRoutes, ti.filePointer);
codedIS.popLimit(oldLimit); codedIS.popLimit(oldLimit);
incompleteTransportRoutes.put(ti, indexIncompleteRoutes);
} }
} }
} }
return incompleteTransportRoutes; return incompleteTransportRoutes;
} }
} }

View file

@ -253,7 +253,6 @@ public class BinaryMapTransportReaderAdapter {
public void readIncompleteRoutesList(TLongObjectHashMap<net.osmand.data.IncompleteTransportRoute> incompleteRoutes, int transportIndexStart) throws IOException { public void readIncompleteRoutesList(TLongObjectHashMap<net.osmand.data.IncompleteTransportRoute> incompleteRoutes, int transportIndexStart) throws IOException {
boolean end = false; boolean end = false;
int offset = codedIS.getTotalBytesRead();
while (!end) { while (!end) {
int t = codedIS.readTag(); int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);
@ -264,7 +263,7 @@ public class BinaryMapTransportReaderAdapter {
case OsmandOdb.IncompleteTransportRoutes.ROUTES_FIELD_NUMBER: case OsmandOdb.IncompleteTransportRoutes.ROUTES_FIELD_NUMBER:
int l = codedIS.readRawVarint32(); int l = codedIS.readRawVarint32();
int olds = codedIS.pushLimit(l); 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()); net.osmand.data.IncompleteTransportRoute itr = incompleteRoutes.get(ir.getRouteId());
if(itr != null) { if(itr != null) {
itr.setNextLinkedRoute(ir); 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(); net.osmand.data.IncompleteTransportRoute dataObject = new net.osmand.data.IncompleteTransportRoute();
boolean end = false; boolean end = false;
while(!end){ while(!end){
@ -300,7 +299,7 @@ public class BinaryMapTransportReaderAdapter {
if (delta > transportIndexStart) { if (delta > transportIndexStart) {
dataObject.setRouteOffset(delta); dataObject.setRouteOffset(delta);
} else { } else {
dataObject.setRouteOffset(readOffset - delta); dataObject.setRouteOffset(transportIndexStart + delta);
} }
break; break;
case OsmandOdb.IncompleteTransportRoute.OPERATOR_FIELD_NUMBER : case OsmandOdb.IncompleteTransportRoute.OPERATOR_FIELD_NUMBER :

View file

@ -13,7 +13,11 @@ public class IncompleteTransportRoute {
} }
public void setNextLinkedRoute(IncompleteTransportRoute nextLinkedRoute) { public void setNextLinkedRoute(IncompleteTransportRoute nextLinkedRoute) {
this.nextLinkedRoute = nextLinkedRoute; if (this.nextLinkedRoute == null) {
this.nextLinkedRoute = nextLinkedRoute;
} else {
this.nextLinkedRoute.setNextLinkedRoute(nextLinkedRoute);
}
} }
public long getRouteId() { public long getRouteId() {

View file

@ -389,32 +389,21 @@ public class TransportStopsRouteReader {
List<TransportRoute> allRoutes = null; List<TransportRoute> allRoutes = null;
for (BinaryMapIndexReader bmir : routesFilesCache.keySet()) { for (BinaryMapIndexReader bmir : routesFilesCache.keySet()) {
// here we could limit routeMap indexes by only certain bbox around start / end (check comment on field) // here we could limit routeMap indexes by only certain bbox around start / end (check comment on field)
if (!bmir.getIncompleteTransportRoutes().isEmpty()) { IncompleteTransportRoute ptr = bmir.getIncompleteTransportRoutes().get(baseRoute.getId());
for (Entry<TransportIndex, TLongObjectHashMap<IncompleteTransportRoute>> entry : bmir.getIncompleteTransportRoutes().entrySet()) { if (ptr != null) {
IncompleteTransportRoute ptr = entry.getValue().get(baseRoute.getId()); TIntArrayList lst = new TIntArrayList();
if (ptr != null) { while (ptr != null) {
TIntArrayList lst = new TIntArrayList(); lst.add(ptr.getRouteOffset());
while (ptr != null) { ptr = ptr.getNextLinkedRoute();
lst.add(ptr.getRouteOffset()); }
ptr = ptr.getNextLinkedRoute(); if (lst.size() > 0) {
} if (allRoutes == null) {
if (lst.size() > 0) { allRoutes = new ArrayList<TransportRoute>();
if (allRoutes == null) {
allRoutes = new ArrayList<TransportRoute>();
}
allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection());
}
} }
allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection());
} }
} }
} }
return allRoutes; return allRoutes;
} }
} }