Skip to content

Commit 4f24820

Browse files
committed
Merge branch 'dev-2.x' into parallel-raptor-cache
2 parents 2ae8816 + 0fb152d commit 4f24820

File tree

93 files changed

+2885
-1401
lines changed

Some content is hidden

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

93 files changed

+2885
-1401
lines changed

application/src/client/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<link rel="icon" type="image/svg+xml" href="/img/otp-logo.svg" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>OTP Debug</title>
8-
<script type="module" crossorigin src="https://cdn.jsdelivr.net/gh/opentripplanner/debug-client-assets@main/2024/12/2024-12-17T11:50/assets/index-CMyj5Qyr.js"></script>
9-
<link rel="stylesheet" crossorigin href="https://cdn.jsdelivr.net/gh/opentripplanner/debug-client-assets@main/2024/12/2024-12-17T11:50/assets/index-BDL0-veX.css">
8+
<script type="module" crossorigin src="https://cdn.jsdelivr.net/gh/opentripplanner/debug-client-assets@main/2025/01/2025-01-02T15:56/assets/index-DODY0n0n.js"></script>
9+
<link rel="stylesheet" crossorigin href="https://cdn.jsdelivr.net/gh/opentripplanner/debug-client-assets@main/2025/01/2025-01-02T15:56/assets/index-BDL0-veX.css">
1010
</head>
1111
<body>
1212
<div id="root"></div>

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.apache.lucene.analysis.standard.StandardAnalyzer;
1919
import org.apache.lucene.codecs.Codec;
2020
import org.apache.lucene.codecs.PostingsFormat;
21-
import org.apache.lucene.codecs.lucene912.Lucene912Codec;
21+
import org.apache.lucene.codecs.lucene101.Lucene101Codec;
2222
import org.apache.lucene.document.Document;
2323
import org.apache.lucene.document.Field.Store;
2424
import org.apache.lucene.document.StoredField;
@@ -34,7 +34,7 @@
3434
import org.apache.lucene.search.FuzzyQuery;
3535
import org.apache.lucene.search.PrefixQuery;
3636
import org.apache.lucene.search.TermQuery;
37-
import org.apache.lucene.search.suggest.document.Completion912PostingsFormat;
37+
import org.apache.lucene.search.suggest.document.Completion101PostingsFormat;
3838
import org.apache.lucene.search.suggest.document.CompletionAnalyzer;
3939
import org.apache.lucene.search.suggest.document.ContextQuery;
4040
import org.apache.lucene.search.suggest.document.ContextSuggestField;
@@ -203,8 +203,8 @@ private StopCluster toStopCluster(Document document) {
203203

204204
static IndexWriterConfig iwcWithSuggestField(Analyzer analyzer, final Set<String> suggestFields) {
205205
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
206-
Codec filterCodec = new Lucene912Codec() {
207-
final PostingsFormat postingsFormat = new Completion912PostingsFormat();
206+
Codec filterCodec = new Lucene101Codec() {
207+
final PostingsFormat postingsFormat = new Completion101PostingsFormat();
208208

209209
@Override
210210
public PostingsFormat getPostingsFormatForField(String field) {
@@ -285,7 +285,7 @@ private Stream<Document> matchingDocuments(
285285
.stream(topDocs.scoreDocs)
286286
.map(scoreDoc -> {
287287
try {
288-
return searcher.doc(scoreDoc.doc);
288+
return searcher.storedFields().document(scoreDoc.doc);
289289
} catch (IOException e) {
290290
throw new RuntimeException(e);
291291
}
@@ -330,7 +330,7 @@ private Stream<Document> matchingDocuments(
330330
.stream(topDocs.scoreDocs)
331331
.map(scoreDoc -> {
332332
try {
333-
return searcher.doc(scoreDoc.doc);
333+
return searcher.storedFields().document(scoreDoc.doc);
334334
} catch (IOException e) {
335335
throw new RuntimeException(e);
336336
}

application/src/ext/java/org/opentripplanner/ext/parkAndRideApi/ParkAndRideResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public ParkAndRideResource(
4242
// - serverContext.graphFinder(). This needs at least a comment!
4343
// - This can be replaced with a search done with the SiteRepository
4444
// - if we have a radius search there.
45-
this.graphFinder = new DirectGraphFinder(serverContext.transitService()::findRegularStops);
45+
this.graphFinder = new DirectGraphFinder(serverContext.transitService()::findRegularStopsByBoundingBox);
4646
}
4747

4848
/** Envelopes are in latitude, longitude format */

application/src/ext/java/org/opentripplanner/ext/restapi/resources/IndexAPI.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public List<ApiStopShort> getStopsInRadius(
200200

201201
radius = Math.min(radius, MAX_STOP_SEARCH_RADIUS);
202202

203-
return new DirectGraphFinder(serverContext.transitService()::findRegularStops)
203+
return new DirectGraphFinder(serverContext.transitService()::findRegularStopsByBoundingBox)
204204
.findClosestStops(new Coordinate(lon, lat), radius)
205205
.stream()
206206
.map(it -> StopMapper.mapToApiShort(it.stop, it.distance))
@@ -221,10 +221,9 @@ public List<ApiStopShort> getStopsInRadius(
221221
new Coordinate(maxLon, maxLat)
222222
);
223223

224-
var stops = transitService().findRegularStops(envelope);
224+
var stops = transitService().findRegularStopsByBoundingBox(envelope);
225225
return stops
226226
.stream()
227-
.filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
228227
.map(StopMapper::mapToApiShort)
229228
.toList();
230229
}

application/src/ext/java/org/opentripplanner/ext/vectortiles/layers/stops/StopsLayerBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public StopsLayerBuilder(
4444

4545
protected List<Geometry> getGeometries(Envelope query) {
4646
return transitService
47-
.findRegularStops(query)
47+
.findRegularStopsByBoundingBox(query)
4848
.stream()
4949
.filter(filter)
5050
.map(stop -> {

application/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,9 +752,8 @@ public DataFetcher<Iterable<Object>> stopsByBbox() {
752752
);
753753

754754
Stream<RegularStop> stopStream = getTransitService(environment)
755-
.findRegularStops(envelope)
756-
.stream()
757-
.filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()));
755+
.findRegularStopsByBoundingBox(envelope)
756+
.stream();
758757

759758
if (args.getGraphQLFeeds() != null) {
760759
List<String> feedIds = args.getGraphQLFeeds();

application/src/main/java/org/opentripplanner/apis/transmodel/TransmodelGraphQLSchema.java

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static java.lang.Boolean.TRUE;
44
import static java.util.Collections.emptyList;
55
import static org.opentripplanner.apis.transmodel.mapping.SeverityMapper.getTransmodelSeverity;
6+
import static org.opentripplanner.apis.transmodel.mapping.TransitIdMapper.mapIDToDomain;
67
import static org.opentripplanner.apis.transmodel.mapping.TransitIdMapper.mapIDsToDomainNullSafe;
78
import static org.opentripplanner.apis.transmodel.model.EnumTypes.FILTER_PLACE_TYPE_ENUM;
89
import static org.opentripplanner.apis.transmodel.model.EnumTypes.MULTI_MODAL_MODE;
@@ -115,6 +116,7 @@
115116
import org.opentripplanner.routing.graphfinder.PlaceType;
116117
import org.opentripplanner.service.vehiclerental.model.VehicleRentalPlace;
117118
import org.opentripplanner.transit.api.model.FilterValues;
119+
import org.opentripplanner.transit.api.request.FindRegularStopsByBoundingBoxRequest;
118120
import org.opentripplanner.transit.api.request.TripRequest;
119121
import org.opentripplanner.transit.model.basic.TransitMode;
120122
import org.opentripplanner.transit.model.framework.FeedScopedId;
@@ -439,10 +441,7 @@ private GraphQLSchema create() {
439441
.build()
440442
)
441443
.dataFetcher(env ->
442-
StopPlaceType.fetchStopPlaceById(
443-
TransitIdMapper.mapIDToDomain(env.getArgument("id")),
444-
env
445-
)
444+
StopPlaceType.fetchStopPlaceById(mapIDToDomain(env.getArgument("id")), env)
446445
)
447446
.build()
448447
)
@@ -576,7 +575,7 @@ private GraphQLSchema create() {
576575
.dataFetcher(environment ->
577576
GqlUtil
578577
.getTransitService(environment)
579-
.getStopLocation(TransitIdMapper.mapIDToDomain(environment.getArgument("id")))
578+
.getStopLocation(mapIDToDomain(environment.getArgument("id")))
580579
)
581580
.build()
582581
)
@@ -610,7 +609,7 @@ private GraphQLSchema create() {
610609
}
611610
TransitService transitService = GqlUtil.getTransitService(environment);
612611
return ((List<String>) environment.getArgument("ids")).stream()
613-
.map(id -> transitService.getStopLocation(TransitIdMapper.mapIDToDomain(id)))
612+
.map(id -> transitService.getStopLocation(mapIDToDomain(id)))
614613
.collect(Collectors.toList());
615614
}
616615
if (environment.getArgument("name") == null) {
@@ -661,15 +660,22 @@ private GraphQLSchema create() {
661660
.build()
662661
)
663662
.argument(
664-
GraphQLArgument.newArgument().name("authority").type(Scalars.GraphQLString).build()
663+
GraphQLArgument
664+
.newArgument()
665+
.name("authority")
666+
.deprecate(
667+
"This is the Transmodel namespace or the GTFS feedID - avoid using this. Request a new field if necessary."
668+
)
669+
.type(Scalars.GraphQLString)
670+
.build()
665671
)
666672
.argument(
667673
GraphQLArgument
668674
.newArgument()
669675
.name("filterByInUse")
670676
.description("If true only quays with at least one visiting line are included.")
671677
.type(Scalars.GraphQLBoolean)
672-
.defaultValue(Boolean.FALSE)
678+
.defaultValueProgrammatic(Boolean.FALSE)
673679
.build()
674680
)
675681
.dataFetcher(environment -> {
@@ -683,24 +689,19 @@ private GraphQLSchema create() {
683689
environment.getArgument("maximumLatitude")
684690
)
685691
);
692+
693+
var authority = environment.<String>getArgument("authority");
694+
var filterInUse = environment.<Boolean>getArgument("filterByInUse");
695+
696+
FindRegularStopsByBoundingBoxRequest findRegularStopsByBoundingBoxRequest = FindRegularStopsByBoundingBoxRequest
697+
.of(envelope)
698+
.withFeedId(authority)
699+
.filterByInUse(filterInUse)
700+
.build();
701+
686702
return GqlUtil
687703
.getTransitService(environment)
688-
.findRegularStops(envelope)
689-
.stream()
690-
.filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
691-
.filter(stop ->
692-
environment.getArgument("authority") == null ||
693-
stop.getId().getFeedId().equalsIgnoreCase(environment.getArgument("authority"))
694-
)
695-
.filter(stop -> {
696-
boolean filterByInUse = TRUE.equals(environment.getArgument("filterByInUse"));
697-
boolean inUse = !GqlUtil
698-
.getTransitService(environment)
699-
.findPatterns(stop, true)
700-
.isEmpty();
701-
return !filterByInUse || inUse;
702-
})
703-
.collect(Collectors.toList());
704+
.findRegularStopsByBoundingBox(findRegularStopsByBoundingBoxRequest);
704705
})
705706
.build()
706707
)
@@ -1438,7 +1439,7 @@ private GraphQLSchema create() {
14381439
.build()
14391440
)
14401441
.dataFetcher(environment -> {
1441-
var bikeParkId = TransitIdMapper.mapIDToDomain(environment.getArgument("id"));
1442+
var bikeParkId = mapIDToDomain(environment.getArgument("id"));
14421443
return GqlUtil
14431444
.getVehicleParkingService(environment)
14441445
.listBikeParks()
@@ -1573,7 +1574,7 @@ private GraphQLSchema create() {
15731574
return GqlUtil
15741575
.getTransitService(environment)
15751576
.getTransitAlertService()
1576-
.getAlertById(TransitIdMapper.mapIDToDomain(situationNumber));
1577+
.getAlertById(mapIDToDomain(situationNumber));
15771578
})
15781579
.build()
15791580
)

application/src/main/java/org/opentripplanner/apis/transmodel/model/stop/StopPlaceType.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,8 @@ public static Collection<MonoOrMultiModalStation> fetchStopPlaces(
546546
);
547547

548548
Stream<Station> stations = transitService
549-
.findRegularStops(envelope)
549+
.findRegularStopsByBoundingBox(envelope)
550550
.stream()
551-
.filter(stop -> envelope.contains(stop.getCoordinate().asJtsCoordinate()))
552551
.map(StopLocation::getParentStation)
553552
.filter(Objects::nonNull)
554553
.distinct();

application/src/main/java/org/opentripplanner/apis/vectortiles/GraphInspectorVectorTileResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ private static LayerBuilder<?> createLayerBuilder(
183183
case RegularStop -> new StopLayerBuilder<>(
184184
layerParameters,
185185
locale,
186-
e -> context.transitService().findRegularStops(e)
186+
e -> context.transitService().findRegularStopsByBoundingBox(e)
187187
);
188188
case AreaStop -> new StopLayerBuilder<>(
189189
layerParameters,

application/src/main/java/org/opentripplanner/graph_builder/module/StreetLinkerModule.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public void linkTransitStops(Graph graph, TimetableRepository timetableRepositor
103103
continue;
104104
}
105105
// check if stop is already linked, to allow multiple idempotent linking cycles
106-
if (tStop.isConnectedToGraph()) {
106+
if (isAlreadyLinked(tStop, stopLocationsUsedForFlexTrips)) {
107107
continue;
108108
}
109109

@@ -127,6 +127,26 @@ public void linkTransitStops(Graph graph, TimetableRepository timetableRepositor
127127
LOG.info(progress.completeMessage());
128128
}
129129

130+
/**
131+
* Determines if a given transit stop vertex is already linked to the street network, taking into
132+
* account that flex stops need special linking to both a walkable and drivable edge. For example,
133+
* the {@link OsmBoardingLocationsModule}, which runs before this one, often links stops to
134+
* walkable edges only.
135+
*
136+
* @param stopVertex The transit stop vertex to be checked.
137+
* @param stopLocationsUsedForFlexTrips A set of stop locations that are used for flexible trips.
138+
*/
139+
private static boolean isAlreadyLinked(
140+
TransitStopVertex stopVertex,
141+
Set<StopLocation> stopLocationsUsedForFlexTrips
142+
) {
143+
if (stopLocationsUsedForFlexTrips.contains(stopVertex.getStop())) {
144+
return stopVertex.isLinkedToDrivableEdge() && stopVertex.isLinkedToWalkableEdge();
145+
} else {
146+
return stopVertex.isConnectedToGraph();
147+
}
148+
}
149+
130150
/**
131151
* Link a stop to the nearest "relevant" edges.
132152
* <p>

application/src/main/java/org/opentripplanner/graph_builder/module/nearbystops/StraightLineNearbyStopFinder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public StraightLineNearbyStopFinder(TransitService transitService, Duration dura
2222
// We need to accommodate straight line distance (in meters) but when streets are present we
2323
// use an earliest arrival search, which optimizes on time. Ideally we'd specify in meters,
2424
// but we don't have much of a choice here. Use the default walking speed to convert.
25-
this.directGraphFinder = new DirectGraphFinder(transitService::findRegularStops);
25+
this.directGraphFinder = new DirectGraphFinder(transitService::findRegularStopsByBoundingBox);
2626
}
2727

2828
/**

application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ public void populateProperties(WayPropertySet props) {
624624
props.setSlopeOverride(new BestMatchSpecifier("indoor=yes"), true);
625625
}
626626

627-
public void populateNotesAndNames(WayPropertySet props) {
627+
static void populateNotesAndNames(WayPropertySet props) {
628628
/* and the notes */
629629
// TODO: The curly brackets in the string below mean that the CreativeNamer should substitute in OSM tag values.
630630
// However they are not taken into account when passed to the translation function.
@@ -667,6 +667,7 @@ public void populateNotesAndNames(WayPropertySet props) {
667667
props.createNames("highway=footway", "name.pedestrian_path");
668668
props.createNames("highway=bridleway", "name.bridleway");
669669
props.createNames("highway=footway;bicycle=no", "name.pedestrian_path");
670+
props.createNames("highway=corridor", "name.corridor");
670671

671672
// Platforms
672673
props.createNames("otp:route_ref=*", "name.otp_route_ref");

application/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public interface OtpServerRequestContext {
121121
TraverseVisitor<State, Edge> traverseVisitor();
122122

123123
default GraphFinder graphFinder() {
124-
return GraphFinder.getInstance(graph(), transitService()::findRegularStops);
124+
return GraphFinder.getInstance(graph(), transitService()::findRegularStopsByBoundingBox);
125125
}
126126

127127
FlexParameters flexParameters();

application/src/main/java/org/opentripplanner/standalone/config/routerconfig/UpdatersConfig.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_AZURE_ET_UPDATER;
99
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_AZURE_SX_UPDATER;
1010
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_ET_GOOGLE_PUBSUB_UPDATER;
11+
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_ET_LITE;
1112
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_ET_UPDATER;
13+
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_SX_LITE;
1214
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.SIRI_SX_UPDATER;
1315
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.STOP_TIME_UPDATER;
1416
import static org.opentripplanner.standalone.config.routerconfig.UpdatersConfig.Type.VEHICLE_PARKING;
@@ -30,7 +32,9 @@
3032
import org.opentripplanner.standalone.config.routerconfig.updaters.MqttGtfsRealtimeUpdaterConfig;
3133
import org.opentripplanner.standalone.config.routerconfig.updaters.PollingTripUpdaterConfig;
3234
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriETGooglePubsubUpdaterConfig;
35+
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriETLiteUpdaterConfig;
3336
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriETUpdaterConfig;
37+
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriSXLiteUpdaterConfig;
3438
import org.opentripplanner.standalone.config.routerconfig.updaters.SiriSXUpdaterConfig;
3539
import org.opentripplanner.standalone.config.routerconfig.updaters.VehicleParkingUpdaterConfig;
3640
import org.opentripplanner.standalone.config.routerconfig.updaters.VehiclePositionsUpdaterConfig;
@@ -44,6 +48,8 @@
4448
import org.opentripplanner.updater.siri.updater.SiriETUpdaterParameters;
4549
import org.opentripplanner.updater.siri.updater.SiriSXUpdaterParameters;
4650
import org.opentripplanner.updater.siri.updater.google.SiriETGooglePubsubUpdaterParameters;
51+
import org.opentripplanner.updater.siri.updater.lite.SiriETLiteUpdaterParameters;
52+
import org.opentripplanner.updater.siri.updater.lite.SiriSXLiteUpdaterParameters;
4753
import org.opentripplanner.updater.trip.MqttGtfsRealtimeUpdaterParameters;
4854
import org.opentripplanner.updater.trip.PollingTripUpdaterParameters;
4955
import org.opentripplanner.updater.vehicle_parking.VehicleParkingUpdaterParameters;
@@ -182,6 +188,16 @@ public List<SiriSXUpdaterParameters> getSiriSXUpdaterParameters() {
182188
return getParameters(SIRI_SX_UPDATER);
183189
}
184190

191+
@Override
192+
public List<SiriETLiteUpdaterParameters> getSiriETLiteUpdaterParameters() {
193+
return getParameters(SIRI_ET_LITE);
194+
}
195+
196+
@Override
197+
public List<SiriSXLiteUpdaterParameters> getSiriSXLiteUpdaterParameters() {
198+
return getParameters(SIRI_SX_LITE);
199+
}
200+
185201
@Override
186202
public List<MqttGtfsRealtimeUpdaterParameters> getMqttGtfsRealtimeUpdaterParameters() {
187203
return getParameters(MQTT_GTFS_RT_UPDATER);
@@ -218,8 +234,10 @@ public enum Type {
218234
REAL_TIME_ALERTS(GtfsRealtimeAlertsUpdaterConfig::create),
219235
VEHICLE_POSITIONS(VehiclePositionsUpdaterConfig::create),
220236
SIRI_ET_UPDATER(SiriETUpdaterConfig::create),
237+
SIRI_ET_LITE(SiriETLiteUpdaterConfig::create),
221238
SIRI_ET_GOOGLE_PUBSUB_UPDATER(SiriETGooglePubsubUpdaterConfig::create),
222239
SIRI_SX_UPDATER(SiriSXUpdaterConfig::create),
240+
SIRI_SX_LITE(SiriSXLiteUpdaterConfig::create),
223241
SIRI_AZURE_ET_UPDATER(SiriAzureETUpdaterConfig::create),
224242
SIRI_AZURE_SX_UPDATER(SiriAzureSXUpdaterConfig::create);
225243

0 commit comments

Comments
 (0)