Skip to content

Commit a3567cf

Browse files
committed
refactor: Introduce RegularTransferParameters and move all relevant parameters
1 parent 2308351 commit a3567cf

9 files changed

Lines changed: 208 additions & 135 deletions

File tree

application/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderModules.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,7 @@ static DirectTransferGenerator provideDirectTransferGenerator(
270270
timetableRepository,
271271
transferRepository,
272272
issueStore,
273-
config.maxTransferDuration,
274-
config.transferRequests,
275-
config.transferParametersForMode
273+
config.regularTransferParameters()
276274
);
277275
}
278276

@@ -290,7 +288,7 @@ static DirectTransferAnalyzer provideDirectTransferAnalyzer(
290288
linker,
291289
timetableRepository,
292290
issueStore,
293-
config.maxTransferDuration.toSeconds() * WalkPreferences.DEFAULT.speed()
291+
config.regularTransferParameters().maxDuration().toSeconds() * WalkPreferences.DEFAULT.speed()
294292
);
295293
}
296294

application/src/main/java/org/opentripplanner/graph_builder/module/transfer/DirectTransferGenerator.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.opentripplanner.graph_builder.module.nearbystops.StopResolver;
2121
import org.opentripplanner.graph_builder.module.nearbystops.StraightLineNearbyStopFinder;
2222
import org.opentripplanner.graph_builder.module.nearbystops.StreetNearbyStopFinder;
23+
import org.opentripplanner.graph_builder.module.transfer.api.RegularTransferParameters;
2324
import org.opentripplanner.graph_builder.module.transfer.api.TransferParametersForMode;
2425
import org.opentripplanner.graph_builder.module.transfer.filter.PatternConsideringNearbyStopFinder;
2526
import org.opentripplanner.routing.api.request.RouteRequest;
@@ -84,16 +85,14 @@ public DirectTransferGenerator(
8485
TimetableRepository timetableRepository,
8586
TransferRepository transferRepository,
8687
DataImportIssueStore issueStore,
87-
Duration defaultMaxTransferDuration,
88-
List<RouteRequest> transferRequests,
89-
Map<StreetMode, TransferParametersForMode> transferParametersForMode
88+
RegularTransferParameters parameters
9089
) {
9190
this.graph = graph;
9291
this.timetableRepository = timetableRepository;
9392
this.issueStore = issueStore;
94-
this.defaultMaxTransferDuration = defaultMaxTransferDuration;
95-
this.transferRequests = transferRequests;
96-
this.transferParametersForMode = transferParametersForMode;
93+
this.defaultMaxTransferDuration = parameters.maxDuration();
94+
this.transferRequests = parameters.requests();
95+
this.transferParametersForMode = parameters.parametersForMode();
9796
this.transferRepository = transferRepository;
9897
}
9998

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.opentripplanner.graph_builder.module.transfer.api;
2+
3+
import java.time.Duration;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.Objects;
8+
import org.opentripplanner.routing.api.request.RouteRequest;
9+
import org.opentripplanner.street.model.StreetMode;
10+
11+
public final class RegularTransferParameters {
12+
13+
private final Duration maxDuration;
14+
private final Map<StreetMode, TransferParametersForMode> parametersForMode;
15+
private final List<RouteRequest> requests;
16+
17+
public static RegularTransferParameters DEFAULT = new RegularTransferParameters();
18+
19+
private RegularTransferParameters() {
20+
this.maxDuration = Duration.ofMinutes(30);
21+
this.parametersForMode = Map.of();
22+
this.requests = List.of();
23+
}
24+
25+
public RegularTransferParameters(
26+
Duration maxDuration,
27+
Map<StreetMode, TransferParametersForMode> parametersForMode,
28+
List<RouteRequest> requests
29+
) {
30+
this.maxDuration = Objects.requireNonNull(maxDuration);
31+
this.parametersForMode = Map.copyOf(parametersForMode);
32+
this.requests = List.copyOf(requests);
33+
}
34+
35+
public static Builder of() {
36+
return new Builder(DEFAULT);
37+
}
38+
39+
public Duration maxDuration() {
40+
return maxDuration;
41+
}
42+
43+
public Map<StreetMode, TransferParametersForMode> parametersForMode() {
44+
return parametersForMode;
45+
}
46+
47+
public List<RouteRequest> requests() {
48+
return requests;
49+
}
50+
51+
public static class Builder {
52+
53+
private Duration maxDuration;
54+
private Map<StreetMode, TransferParametersForMode> parametersForMode = new HashMap<>();
55+
private List<RouteRequest> requests;
56+
57+
private Builder(RegularTransferParameters original) {
58+
this.maxDuration = original.maxDuration;
59+
this.parametersForMode.putAll(original.parametersForMode);
60+
this.requests = original.requests;
61+
}
62+
63+
public Builder withMaxDuration(Duration maxDuration) {
64+
this.maxDuration = maxDuration;
65+
return this;
66+
}
67+
68+
/// Note! This method replace/overwrite any existing content
69+
public Builder withParametersForMode(Map<StreetMode, TransferParametersForMode> map) {
70+
this.parametersForMode.clear();
71+
this.parametersForMode.putAll(map);
72+
return this;
73+
}
74+
75+
/// This method add values to the existing map and leave values for other modes as is.
76+
public Builder addParametersForMode(StreetMode mode, TransferParametersForMode value) {
77+
this.parametersForMode.put(mode, value);
78+
return this;
79+
}
80+
81+
public Builder withRequests(List<RouteRequest> requests) {
82+
this.requests = requests;
83+
return this;
84+
}
85+
86+
public RegularTransferParameters build() {
87+
return new RegularTransferParameters(maxDuration, parametersForMode, requests);
88+
}
89+
}
90+
}

application/src/main/java/org/opentripplanner/routing/via/configure/ViaModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ static ViaCoordinateTransferFactory providesViaTransferResolver(
2020
return new DefaultViaCoordinateTransferFactory(
2121
graph,
2222
transitService,
23-
buildConfig.maxTransferDuration
23+
buildConfig.regularTransferParameters().maxDuration()
2424
);
2525
}
2626
}

application/src/main/java/org/opentripplanner/standalone/config/BuildConfig.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@
1212
import com.fasterxml.jackson.databind.JsonNode;
1313
import com.fasterxml.jackson.databind.node.MissingNode;
1414
import java.net.URI;
15-
import java.time.Duration;
1615
import java.time.LocalDate;
1716
import java.time.ZoneId;
1817
import java.util.List;
19-
import java.util.Map;
2018
import java.util.Set;
2119
import java.util.regex.Pattern;
2220
import javax.annotation.Nullable;
@@ -35,26 +33,23 @@
3533
import org.opentripplanner.graph_builder.module.ned.parameter.DemExtractParametersList;
3634
import org.opentripplanner.graph_builder.module.osm.parameters.OsmExtractParameters;
3735
import org.opentripplanner.graph_builder.module.osm.parameters.OsmExtractParametersList;
38-
import org.opentripplanner.graph_builder.module.transfer.api.TransferParametersForMode;
36+
import org.opentripplanner.graph_builder.module.transfer.api.RegularTransferParameters;
3937
import org.opentripplanner.graph_builder.services.osm.EdgeNamer;
4038
import org.opentripplanner.gtfs.config.GtfsDefaultParameters;
4139
import org.opentripplanner.netex.config.NetexFeedParameters;
42-
import org.opentripplanner.routing.api.request.RouteRequest;
4340
import org.opentripplanner.standalone.config.buildconfig.DemConfig;
4441
import org.opentripplanner.standalone.config.buildconfig.GtfsConfig;
4542
import org.opentripplanner.standalone.config.buildconfig.IslandPruningConfig;
4643
import org.opentripplanner.standalone.config.buildconfig.NetexConfig;
4744
import org.opentripplanner.standalone.config.buildconfig.OsmConfig;
45+
import org.opentripplanner.standalone.config.buildconfig.RegularTransferConfig;
4846
import org.opentripplanner.standalone.config.buildconfig.S3BucketConfig;
49-
import org.opentripplanner.standalone.config.buildconfig.TransferConfig;
50-
import org.opentripplanner.standalone.config.buildconfig.TransferRequestConfig;
5147
import org.opentripplanner.standalone.config.buildconfig.TransitFeedConfig;
5248
import org.opentripplanner.standalone.config.buildconfig.TransitFeeds;
5349
import org.opentripplanner.standalone.config.framework.json.NodeAdapter;
5450
import org.opentripplanner.standalone.config.sandbox.DataOverlayConfigMapper;
5551
import org.opentripplanner.street.geometry.CompactElevationProfile;
5652
import org.opentripplanner.street.model.StreetConstants;
57-
import org.opentripplanner.street.model.StreetMode;
5853
import org.opentripplanner.utils.lang.ObjectUtils;
5954
import org.slf4j.Logger;
6055
import org.slf4j.LoggerFactory;
@@ -158,15 +153,13 @@ public class BuildConfig implements OtpDataStoreConfig {
158153
/** See {@link IslandPruningConfig}. */
159154
public final IslandPruningConfig islandPruning;
160155

161-
public final Duration maxTransferDuration;
162-
public final Map<StreetMode, TransferParametersForMode> transferParametersForMode;
163156
public final NetexFeedParameters netexDefaults;
164157
public final GtfsDefaultParameters gtfsDefaults;
165158

166159
public final DemExtractParameters demDefaults;
167160
public final OsmExtractParameters osmDefaults;
168161

169-
public final List<RouteRequest> transferRequests;
162+
private final RegularTransferParameters regularTransferParameters;
170163

171164
public final int maxAreaNodes;
172165

@@ -284,14 +277,9 @@ When set to true (it is false by default), the elevation module will include the
284277
"""
285278
)
286279
.asInt(1000);
287-
maxTransferDuration = root
288-
.of("maxTransferDuration")
289-
.since(V2_1)
290-
.summary(
291-
"Transfers up to this duration with a mode-specific speed value will be pre-calculated and included in the Graph."
292-
)
293-
.asDuration(Duration.ofMinutes(30));
294-
transferParametersForMode = TransferConfig.map(root, "transferParametersForMode");
280+
281+
this.regularTransferParameters = RegularTransferConfig.map(root);
282+
295283
maxStopToShapeSnapDistance = root
296284
.of("maxStopToShapeSnapDistance")
297285
.since(V2_1)
@@ -622,8 +610,6 @@ that we support remote input files (cloud storage or arbitrary URLs) not all dat
622610
edgeNamer = EdgeNamerFactory.fromConfig(root, "osmNaming");
623611
dataOverlay = DataOverlayConfigMapper.map(root, "dataOverlay");
624612

625-
transferRequests = TransferRequestConfig.map(root, "transferRequests");
626-
627613
gsConfig = GsConfig.fromConfig(root, "gsConfig");
628614

629615
if (logUnusedParams && LOG.isWarnEnabled()) {
@@ -726,6 +712,10 @@ public List<FeedScopedId> transitRouteToStationCentroid() {
726712
return transitRouteToStationCentroid;
727713
}
728714

715+
public RegularTransferParameters regularTransferParameters() {
716+
return regularTransferParameters;
717+
}
718+
729719
public int getSubwayAccessTimeSeconds() {
730720
// Convert access time in minutes to seconds
731721
return (int) (subwayAccessTime * 60.0);

application/src/main/java/org/opentripplanner/standalone/config/buildconfig/RegularTransferConfig.java

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,104 @@
11
package org.opentripplanner.standalone.config.buildconfig;
22

3+
import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_1;
34
import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_7;
45
import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_9;
56

7+
import java.util.EnumMap;
8+
import java.util.List;
9+
import org.opentripplanner.graph_builder.module.transfer.api.RegularTransferParameters;
610
import org.opentripplanner.graph_builder.module.transfer.api.TransferParametersForMode;
11+
import org.opentripplanner.routing.api.request.RouteRequest;
712
import org.opentripplanner.standalone.config.framework.json.NodeAdapter;
13+
import org.opentripplanner.standalone.config.framework.json.OtpVersion;
14+
import org.opentripplanner.standalone.config.routerequest.RouteRequestConfig;
15+
import org.opentripplanner.street.model.StreetMode;
816

9-
public class TransferParametersMapper {
17+
public class RegularTransferConfig {
1018

11-
public static TransferParametersForMode map(NodeAdapter c) {
19+
public static RegularTransferParameters map(NodeAdapter root) {
20+
var builder = RegularTransferParameters.of();
21+
var dft = RegularTransferParameters.DEFAULT;
22+
23+
builder.withMaxDuration(
24+
root
25+
.of("maxTransferDuration")
26+
.since(V2_1)
27+
.summary(
28+
"Transfers up to this duration with a mode-specific speed value will be pre-calculated and included in the Graph."
29+
)
30+
.asDuration(dft.maxDuration())
31+
);
32+
33+
builder.withParametersForMode(
34+
root
35+
.of("transferParametersForMode")
36+
.since(V2_7)
37+
.summary("Configures mode-specific properties for transfer calculations.")
38+
.description(
39+
"""
40+
This field enables configuring mode-specific parameters for transfer calculations.
41+
To configure mode-specific parameters, the modes should also be used in the `transferRequests` field in the build config.
42+
43+
**Example**
44+
45+
```JSON
46+
// build-config.json
47+
{
48+
"transferParametersForMode": {
49+
"CAR": {
50+
"disableDefaultTransfers": true,
51+
"carsAllowedStopMaxTransferDuration": "3h"
52+
},
53+
"BIKE": {
54+
"maxTransferDuration": "30m",
55+
"carsAllowedStopMaxTransferDuration": "3h"
56+
}
57+
}
58+
}
59+
```
60+
"""
61+
)
62+
.asEnumMap(
63+
StreetMode.class,
64+
RegularTransferConfig::mapParametersForMode,
65+
new EnumMap<>(StreetMode.class)
66+
)
67+
);
68+
69+
builder.withRequests(
70+
root
71+
.of("transferRequests")
72+
.since(OtpVersion.V2_1)
73+
.summary("Routing requests to use for pre-calculating stop-to-stop transfers.")
74+
.description(
75+
"""
76+
It will use the street network if OSM data has already been loaded into the graph. Otherwise it
77+
will use straight-line distance between stops.
78+
79+
If not set, the default behavior is to generate stop-to-stop transfers using the default request
80+
with street mode set to WALK. Use this to change the default or specify more than one way to
81+
transfer.
82+
83+
**Example**
84+
85+
```JSON
86+
// build-config.json
87+
{
88+
"transferRequests": [
89+
{ "modes": "WALK" },
90+
{ "modes": "WALK", "wheelchairAccessibility": { "enabled": true }}
91+
]
92+
}
93+
```
94+
"""
95+
)
96+
.asObjects(List.of(RouteRequest.defaultValue()), RouteRequestConfig::mapRouteRequest)
97+
);
98+
return builder.build();
99+
}
100+
101+
private static TransferParametersForMode mapParametersForMode(NodeAdapter c) {
12102
TransferParametersForMode.Builder builder = new TransferParametersForMode.Builder();
13103
builder.withMaxTransferDuration(
14104
c
@@ -70,6 +160,7 @@ The default transfers are calculated based on a configurable range (configurable
70160
.since(V2_9)
71161
.asDuration(TransferParametersForMode.DEFAULT_BIKES_ALLOWED_STOP_MAX_TRANSFER_DURATION)
72162
);
163+
73164
builder.withDisableDefaultTransfers(
74165
c
75166
.of("disableDefaultTransfers")

0 commit comments

Comments
 (0)