Skip to content

Commit 19f8a2c

Browse files
Merge pull request #5223 from opentripplanner/vertex-labels
Deduplicate vertex labels to save memory
2 parents c9f60c6 + 1452a51 commit 19f8a2c

File tree

71 files changed

+686
-912
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+686
-912
lines changed

src/ext/java/org/opentripplanner/ext/geocoder/GeocoderResource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ private Collection<? extends SearchResult> queryCorners(String query, boolean au
131131
return LuceneIndex
132132
.forServer(serverContext)
133133
.queryStreetVertices(query, autocomplete)
134-
.map(v -> new SearchResult(v.getLat(), v.getLon(), stringifyStreetVertex(v), v.getLabel()))
134+
.map(v ->
135+
new SearchResult(v.getLat(), v.getLon(), stringifyStreetVertex(v), v.getLabelString())
136+
)
135137
.collect(Collectors.toList());
136138
}
137139

src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.opentripplanner.routing.graph.Graph;
4242
import org.opentripplanner.standalone.api.OtpServerRequestContext;
4343
import org.opentripplanner.street.model.vertex.StreetVertex;
44+
import org.opentripplanner.street.model.vertex.VertexLabel;
4445
import org.opentripplanner.transit.model.framework.FeedScopedId;
4546
import org.opentripplanner.transit.model.site.StopLocation;
4647
import org.opentripplanner.transit.model.site.StopLocationsGroup;
@@ -139,9 +140,9 @@ public LuceneIndex(Graph graph, TransitService transitService) {
139140
addToIndex(
140141
directoryWriter,
141142
StreetVertex.class,
142-
streetVertex.getLabel(),
143+
streetVertex.getLabelString(),
143144
streetVertex.getIntersectionName(),
144-
streetVertex.getLabel(),
145+
streetVertex.getLabelString(),
145146
streetVertex.getLat(),
146147
streetVertex.getLon(),
147148
Set.of()
@@ -181,7 +182,7 @@ public Stream<StopLocationsGroup> queryStopLocationGroups(String query, boolean
181182

182183
public Stream<StreetVertex> queryStreetVertices(String query, boolean autocomplete) {
183184
return matchingDocuments(StreetVertex.class, query, autocomplete)
184-
.map(document -> (StreetVertex) graph.getVertex(document.get(ID)));
185+
.map(document -> (StreetVertex) graph.getVertex(VertexLabel.string(document.get(ID))));
185186
}
186187

187188
/**

src/main/java/org/opentripplanner/framework/i18n/I18NString.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static boolean hasValue(I18NString value) {
2626
*/
2727
String toString(Locale locale);
2828

29-
public static I18NString assertHasValue(I18NString value) {
29+
static I18NString assertHasValue(I18NString value) {
3030
if (value == null || value.toString().isBlank()) {
3131
throw new IllegalArgumentException(
3232
"Value can not be null, empty or just whitespace: " +
@@ -35,4 +35,11 @@ public static I18NString assertHasValue(I18NString value) {
3535
}
3636
return value;
3737
}
38+
39+
/**
40+
* Create an instance from a string.
41+
*/
42+
static I18NString of(String value) {
43+
return new NonLocalizedString(value);
44+
}
3845
}

src/main/java/org/opentripplanner/graph_builder/module/AddTransitModelEntitiesToGraph.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,12 @@ private void createElevatorEdgesAndAddThemToGraph(
260260

261261
ElevatorOffboardVertex fromOffboardVertex = vertexFactory.elevatorOffboard(
262262
fromVertex,
263-
fromVertex.getLabel() + "_" + pathway.getId(),
263+
elevatorLabel(fromVertex, pathway),
264264
fromLevel.name().toString()
265265
);
266266
ElevatorOffboardVertex toOffboardVertex = vertexFactory.elevatorOffboard(
267267
toVertex,
268-
toVertex.getLabel() + "_" + pathway.getId() + "_offboard",
268+
elevatorLabel(toVertex, pathway),
269269
toLevel.name().toString()
270270
);
271271

@@ -284,12 +284,12 @@ private void createElevatorEdgesAndAddThemToGraph(
284284

285285
ElevatorOnboardVertex fromOnboardVertex = vertexFactory.elevatorOnboard(
286286
fromVertex,
287-
fromVertex.getLabel() + "_" + pathway.getId(),
287+
elevatorLabel(fromVertex, pathway),
288288
fromLevel.name().toString()
289289
);
290290
ElevatorOnboardVertex toOnboardVertex = vertexFactory.elevatorOnboard(
291291
toVertex,
292-
toVertex.getLabel() + "_" + pathway.getId(),
292+
elevatorLabel(toVertex, pathway),
293293
toLevel.name().toString()
294294
);
295295

@@ -336,6 +336,10 @@ private void createElevatorEdgesAndAddThemToGraph(
336336
}
337337
}
338338

339+
private static String elevatorLabel(StationElementVertex fromVertex, Pathway pathway) {
340+
return "%s_%s".formatted(fromVertex.getLabel(), pathway.getId());
341+
}
342+
339343
private StopLevel getStopLevel(StationElementVertex vertex) {
340344
StationElement<?, ?> fromStation = vertex.getStationElement();
341345
var level = fromStation.level();

src/main/java/org/opentripplanner/graph_builder/module/islandpruning/GraphIsland.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.locationtech.jts.geom.Geometry;
44
import org.opentripplanner.graph_builder.issue.api.DataImportIssue;
55
import org.opentripplanner.street.model.vertex.Vertex;
6+
import org.opentripplanner.street.model.vertex.VertexLabel;
67

78
public record GraphIsland(
89
Subgraph island,
@@ -42,14 +43,13 @@ public String getMessage() {
4243

4344
@Override
4445
public String getHTMLMessage() {
45-
String label = island.getRepresentativeVertex().getLabel();
46-
if (label.startsWith("osm:")) {
47-
String osmNodeId = label.split(":")[2];
46+
VertexLabel label = island.getRepresentativeVertex().getLabel();
47+
if (label instanceof VertexLabel.OsmNodeLabel osmLabel) {
4848
return String.format(
4949
HTMLFMT,
5050
traversalMode,
51-
osmNodeId,
52-
osmNodeId,
51+
osmLabel.nodeId(),
52+
osmLabel.nodeId(),
5353
island.streetSize(),
5454
island.stopSize(),
5555
this.nothru,

src/main/java/org/opentripplanner/graph_builder/module/islandpruning/PruneIslands.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.Map;
1212
import java.util.Queue;
1313
import java.util.Set;
14+
import java.util.stream.Collectors;
1415
import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore;
1516
import org.opentripplanner.graph_builder.issues.GraphConnectivity;
1617
import org.opentripplanner.graph_builder.issues.IsolatedStop;
@@ -31,6 +32,7 @@
3132
import org.opentripplanner.street.model.vertex.StreetVertex;
3233
import org.opentripplanner.street.model.vertex.TransitStopVertex;
3334
import org.opentripplanner.street.model.vertex.Vertex;
35+
import org.opentripplanner.street.model.vertex.VertexLabel;
3436
import org.opentripplanner.street.search.TraverseMode;
3537
import org.opentripplanner.street.search.request.StreetSearchRequest;
3638
import org.opentripplanner.street.search.state.State;
@@ -504,7 +506,7 @@ private boolean restrictOrRemove(
504506
if (traverseMode == TraverseMode.WALK) {
505507
// note: do not unlink stop if only CAR mode is pruned
506508
// maybe this needs more logic for flex routing cases
507-
List<String> stopLabels = new ArrayList<>();
509+
List<VertexLabel> stopLabels = new ArrayList<>();
508510
for (Iterator<Vertex> vIter = island.stopIterator(); vIter.hasNext();) {
509511
Vertex v = vIter.next();
510512
stopLabels.add(v.getLabel());
@@ -517,7 +519,13 @@ private boolean restrictOrRemove(
517519
if (island.stopSize() > 0) {
518520
// issue about stops that got unlinked in pruning
519521
issueStore.add(
520-
new PrunedStopIsland(island, nothru, restricted, removed, String.join(", ", stopLabels))
522+
new PrunedStopIsland(
523+
island,
524+
nothru,
525+
restricted,
526+
removed,
527+
stopLabels.stream().map(Object::toString).collect(Collectors.joining(","))
528+
)
521529
);
522530
}
523531
}

src/main/java/org/opentripplanner/graph_builder/module/islandpruning/PrunedStopIsland.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.locationtech.jts.geom.Geometry;
44
import org.opentripplanner.graph_builder.issue.api.DataImportIssue;
55
import org.opentripplanner.street.model.vertex.Vertex;
6+
import org.opentripplanner.street.model.vertex.VertexLabel;
67

78
public record PrunedStopIsland(
89
Subgraph island,
@@ -34,13 +35,12 @@ public String getMessage() {
3435

3536
@Override
3637
public String getHTMLMessage() {
37-
String label = island.getRepresentativeVertex().getLabel();
38-
if (label.startsWith("osm:")) {
39-
String osmNodeId = label.split(":")[2];
38+
VertexLabel label = island.getRepresentativeVertex().getLabel();
39+
if (label instanceof VertexLabel.OsmNodeLabel osmLabel) {
4040
return String.format(
4141
HTMLFMT,
42-
osmNodeId,
43-
osmNodeId,
42+
osmLabel.nodeId(),
43+
osmLabel.nodeId(),
4444
island.streetSize(),
4545
island.stopSize(),
4646
this.stopLabels,

src/main/java/org/opentripplanner/graph_builder/module/osm/ElevatorProcessor.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,15 @@ public void buildElevatorEdges(Graph graph) {
8484
for (OSMLevel level : levels) {
8585
// get the node to build the elevator out from
8686
OsmVertex sourceVertex = vertices.get(level);
87-
String sourceVertexLabel = sourceVertex.getLabel();
8887
String levelName = level.longName;
8988

90-
createElevatorVertices(graph, onboardVertices, sourceVertex, sourceVertexLabel, levelName);
89+
createElevatorVertices(
90+
graph,
91+
onboardVertices,
92+
sourceVertex,
93+
sourceVertex.getLabelString(),
94+
levelName
95+
);
9196
}
9297
int travelTime = parseDuration(node).orElse(-1);
9398

@@ -121,7 +126,7 @@ public void buildElevatorEdges(Graph graph) {
121126
for (int i = 0; i < nodes.size(); i++) {
122127
Long node = nodes.get(i);
123128
var sourceVertex = vertexGenerator.intersectionNodes().get(node);
124-
String sourceVertexLabel = sourceVertex.getLabel();
129+
String sourceVertexLabel = sourceVertex.getLabelString();
125130
String levelName = elevatorWay.getId() + " / " + i;
126131
createElevatorVertices(
127132
graph,
@@ -151,24 +156,20 @@ private static void createElevatorVertices(
151156
Graph graph,
152157
ArrayList<Vertex> onboardVertices,
153158
IntersectionVertex sourceVertex,
154-
String sourceVertexLabel,
159+
String label,
155160
String levelName
156161
) {
157162
var factory = new VertexFactory(graph);
158163
ElevatorOffboardVertex offboardVertex = factory.elevatorOffboard(
159164
sourceVertex,
160-
sourceVertexLabel,
165+
label,
161166
levelName
162167
);
163168

164169
FreeEdge.createFreeEdge(sourceVertex, offboardVertex);
165170
FreeEdge.createFreeEdge(offboardVertex, sourceVertex);
166171

167-
ElevatorOnboardVertex onboardVertex = factory.elevatorOnboard(
168-
sourceVertex,
169-
sourceVertexLabel,
170-
levelName
171-
);
172+
ElevatorOnboardVertex onboardVertex = factory.elevatorOnboard(sourceVertex, label, levelName);
172173

173174
ElevatorBoardEdge.createElevatorBoardEdge(offboardVertex, onboardVertex);
174175
ElevatorAlightEdge.createElevatorAlightEdge(

src/main/java/org/opentripplanner/graph_builder/module/osm/ParkingProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ private List<VehicleParking.VehicleParkingEntranceCreator> createParkingEntrance
435435
List<VehicleParking.VehicleParkingEntranceCreator> entrances = new ArrayList<>();
436436
var sortedAccessVertices = accessVertices
437437
.stream()
438-
.sorted(Comparator.comparing(vn -> vn.vertex().getLabel()))
438+
.sorted(Comparator.comparing(vn -> vn.vertex().getLabelString()))
439439
.toList();
440440

441441
for (var access : sortedAccessVertices) {

src/main/java/org/opentripplanner/graph_builder/module/osm/VertexGenerator.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.opentripplanner.routing.graph.Graph;
1616
import org.opentripplanner.street.model.edge.ElevatorEdge;
1717
import org.opentripplanner.street.model.vertex.BarrierVertex;
18-
import org.opentripplanner.street.model.vertex.ExitVertex;
1918
import org.opentripplanner.street.model.vertex.IntersectionVertex;
2019
import org.opentripplanner.street.model.vertex.OsmBoardingLocationVertex;
2120
import org.opentripplanner.street.model.vertex.OsmVertex;
@@ -28,7 +27,6 @@
2827
class VertexGenerator {
2928

3029
private static final String nodeLabelFormat = "osm:node:%d";
31-
private static final String levelnodeLabelFormat = nodeLabelFormat + ":level:%s";
3230

3331
private final Map<Long, IntersectionVertex> intersectionNodes = new HashMap<>();
3432

@@ -67,19 +65,17 @@ IntersectionVertex getVertexForOsmNode(OSMNode node, OSMWithTags way) {
6765
iv = intersectionNodes.get(nid);
6866
if (iv == null) {
6967
Coordinate coordinate = node.getCoordinate();
70-
String label = String.format(nodeLabelFormat, node.getId());
7168
String highway = node.getTag("highway");
7269
if ("motorway_junction".equals(highway)) {
7370
String ref = node.getTag("ref");
7471
if (ref != null) {
75-
ExitVertex ev = vertexFactory.exit(nid, coordinate, label);
76-
ev.setExitName(ref);
77-
iv = ev;
72+
iv = vertexFactory.exit(nid, coordinate, ref);
7873
}
7974
}
8075

8176
/* If the OSM node represents a transit stop and has a ref=(stop_code) tag, make a special vertex for it. */
8277
if (node.isBoardingLocation()) {
78+
String label = String.format(nodeLabelFormat, node.getId());
8379
var refs = node.getMultiTagValues(boardingAreaRefTags);
8480
if (!refs.isEmpty()) {
8581
String name = node.getTag("name");
@@ -94,7 +90,7 @@ IntersectionVertex getVertexForOsmNode(OSMNode node, OSMWithTags way) {
9490
}
9591

9692
if (node.isBarrier()) {
97-
BarrierVertex bv = vertexFactory.barrier(nid, coordinate, label);
93+
BarrierVertex bv = vertexFactory.barrier(nid, coordinate);
9894
bv.setBarrierPermissions(
9995
OsmFilter.getPermissionsForEntity(node, BarrierVertex.defaultBarrierPermissions)
10096
);
@@ -104,7 +100,6 @@ IntersectionVertex getVertexForOsmNode(OSMNode node, OSMWithTags way) {
104100
if (iv == null) {
105101
iv =
106102
vertexFactory.osm(
107-
label,
108103
coordinate,
109104
node,
110105
node.hasHighwayTrafficLight(),
@@ -177,9 +172,7 @@ private OsmVertex recordLevel(OSMNode node, OSMWithTags way) {
177172
multiLevelNodes.put(nodeId, vertices);
178173
}
179174
if (!vertices.containsKey(level)) {
180-
Coordinate coordinate = node.getCoordinate();
181-
String label = String.format(levelnodeLabelFormat, node.getId(), level.shortName);
182-
OsmVertex vertex = vertexFactory.osm(label, coordinate, node, false, false);
175+
OsmVertex vertex = vertexFactory.levelledOsm(node, level.shortName);
183176
vertices.put(level, vertex);
184177

185178
return vertex;

0 commit comments

Comments
 (0)