Skip to content

Commit 3b5f09e

Browse files
Implement basic flex filtering
1 parent cc2fe88 commit 3b5f09e

File tree

10 files changed

+71
-13
lines changed

10 files changed

+71
-13
lines changed

application/src/ext-test/java/org/opentripplanner/ext/flex/trip/ScheduledDeviatedTripIntegrationTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ void calculateDirectFare() {
104104
graph,
105105
new DefaultTransitService(timetableRepository),
106106
FlexParameters.defaultValues(),
107+
List.of(),
107108
OffsetDateTime.parse("2021-11-12T10:15:24-05:00").toInstant(),
108109
null,
109110
1,

application/src/ext/java/org/opentripplanner/ext/flex/FlexIndex.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import com.google.common.collect.ArrayListMultimap;
44
import com.google.common.collect.HashMultimap;
55
import com.google.common.collect.Multimap;
6+
import java.util.ArrayList;
67
import java.util.Collection;
78
import java.util.HashMap;
9+
import java.util.List;
810
import java.util.Map;
911
import org.opentripplanner.ext.flex.trip.FlexTrip;
1012
import org.opentripplanner.model.PathTransfer;
@@ -23,7 +25,7 @@ public class FlexIndex {
2325

2426
private final Multimap<StopLocation, FlexTrip<?, ?>> flexTripsByStop = HashMultimap.create();
2527

26-
private final Map<FeedScopedId, Route> routeById = new HashMap<>();
28+
private final List<Route> flexRoutes;
2729

2830
private final Map<FeedScopedId, FlexTrip<?, ?>> tripById = new HashMap<>();
2931

@@ -33,8 +35,9 @@ public FlexIndex(TimetableRepository timetableRepository) {
3335
transfersToStop.put(transfer.to, transfer);
3436
transfersFromStop.put(transfer.from, transfer);
3537
}
38+
var routes = new ArrayList<Route>();
3639
for (FlexTrip<?, ?> flexTrip : timetableRepository.getAllFlexTrips()) {
37-
routeById.put(flexTrip.getTrip().getRoute().getId(), flexTrip.getTrip().getRoute());
40+
routes.add(flexTrip.getTrip().getRoute());
3841
tripById.put(flexTrip.getTrip().getId(), flexTrip);
3942
for (StopLocation stop : flexTrip.getStops()) {
4043
if (stop instanceof GroupStop groupStop) {
@@ -46,6 +49,7 @@ public FlexIndex(TimetableRepository timetableRepository) {
4649
}
4750
}
4851
}
52+
this.flexRoutes = List.copyOf(routes);
4953
}
5054

5155
public Collection<PathTransfer> getTransfersToStop(StopLocation stopLocation) {
@@ -60,12 +64,8 @@ public Collection<PathTransfer> getTransfersFromStop(StopLocation stopLocation)
6064
return flexTripsByStop.get(stopLocation);
6165
}
6266

63-
public Route getRouteById(FeedScopedId id) {
64-
return routeById.get(id);
65-
}
66-
6767
public Collection<Route> getAllFlexRoutes() {
68-
return routeById.values();
68+
return flexRoutes;
6969
}
7070

7171
public FlexTrip<?, ?> getTripById(FeedScopedId id) {

application/src/ext/java/org/opentripplanner/ext/flex/FlexRouter.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.opentripplanner.model.PathTransfer;
2424
import org.opentripplanner.model.plan.Itinerary;
2525
import org.opentripplanner.routing.algorithm.mapping.GraphPathToItineraryMapper;
26+
import org.opentripplanner.routing.api.request.request.filter.TransitFilter;
2627
import org.opentripplanner.routing.graph.Graph;
2728
import org.opentripplanner.routing.graphfinder.NearbyStop;
2829
import org.opentripplanner.street.model.vertex.TransitStopVertex;
@@ -39,6 +40,7 @@ public class FlexRouter {
3940
private final Graph graph;
4041
private final TransitService transitService;
4142
private final FlexParameters flexParameters;
43+
private final List<TransitFilter> filters;
4244
private final Collection<NearbyStop> streetAccesses;
4345
private final Collection<NearbyStop> streetEgresses;
4446
private final FlexIndex flexIndex;
@@ -57,7 +59,7 @@ public FlexRouter(
5759
Graph graph,
5860
TransitService transitService,
5961
FlexParameters flexParameters,
60-
Instant requestedTime,
62+
List<TransitFilter> filters, Instant requestedTime,
6163
@Nullable Instant requestedBookingTime,
6264
int additionalPastSearchDays,
6365
int additionalFutureSearchDays,
@@ -67,6 +69,7 @@ public FlexRouter(
6769
this.graph = graph;
6870
this.transitService = transitService;
6971
this.flexParameters = flexParameters;
72+
this.filters = filters;
7073
this.streetAccesses = streetAccesses;
7174
this.streetEgresses = egressTransfers;
7275
this.flexIndex = transitService.getFlexIndex();
@@ -114,7 +117,9 @@ public List<Itinerary> createFlexOnlyItineraries(boolean arriveBy) {
114117
callbackService,
115118
accessFlexPathCalculator,
116119
egressFlexPathCalculator,
117-
flexParameters.maxTransferDuration()
120+
flexParameters.maxTransferDuration(),
121+
transitService,
122+
filters
118123
)
119124
.calculateDirectFlexPaths(streetAccesses, streetEgresses, dates, requestedTime, arriveBy);
120125

@@ -139,7 +144,9 @@ public Collection<FlexAccessEgress> createFlexAccesses() {
139144
return new FlexAccessFactory(
140145
callbackService,
141146
accessFlexPathCalculator,
142-
flexParameters.maxTransferDuration()
147+
flexParameters.maxTransferDuration(),
148+
transitService,
149+
filters
143150
)
144151
.createFlexAccesses(streetAccesses, dates);
145152
}

application/src/ext/java/org/opentripplanner/ext/flex/template/ClosestTrip.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Map;
88
import java.util.Objects;
99
import org.opentripplanner.ext.flex.trip.FlexTrip;
10+
import org.opentripplanner.routing.api.request.request.filter.TransitFilter;
1011
import org.opentripplanner.routing.graphfinder.NearbyStop;
1112
import org.opentripplanner.transit.model.timetable.booking.RoutingBookingInfo;
1213
import org.opentripplanner.utils.lang.IntUtils;

application/src/ext/java/org/opentripplanner/ext/flex/template/FlexAccessFactory.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,25 @@
55
import java.util.List;
66
import org.opentripplanner.ext.flex.FlexAccessEgress;
77
import org.opentripplanner.ext.flex.flexpathcalculator.FlexPathCalculator;
8+
import org.opentripplanner.routing.api.request.request.filter.TransitFilter;
89
import org.opentripplanner.routing.graphfinder.NearbyStop;
10+
import org.opentripplanner.transit.service.TransitService;
911

1012
public class FlexAccessFactory {
1113

1214
private final FlexAccessEgressCallbackAdapter callbackService;
15+
private final FlexTransitFilter filter;
1316
private final FlexTemplateFactory templateFactory;
1417

1518
public FlexAccessFactory(
1619
FlexAccessEgressCallbackAdapter callbackService,
1720
FlexPathCalculator pathCalculator,
18-
Duration maxTransferDuration
21+
Duration maxTransferDuration,
22+
TransitService transitService,
23+
List<TransitFilter> filters
1924
) {
2025
this.callbackService = callbackService;
26+
this.filter = new FlexTransitFilter(transitService, filters);
2127
this.templateFactory = FlexTemplateFactory.of(pathCalculator, maxTransferDuration);
2228
}
2329

@@ -40,7 +46,9 @@ List<FlexAccessTemplate> calculateFlexAccessTemplates(
4046
var closestFlexTrips = ClosestTrip.of(callbackService, streetAccesses, dates, true);
4147
return closestFlexTrips
4248
.stream()
49+
.filter(filter::matchesTransitFilters)
4350
.flatMap(it -> templateFactory.createAccessTemplates(it).stream())
4451
.toList();
4552
}
53+
4654
}

application/src/ext/java/org/opentripplanner/ext/flex/template/FlexDirectPathFactory.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,38 @@
1010
import java.util.List;
1111
import java.util.Optional;
1212
import org.opentripplanner.ext.flex.flexpathcalculator.FlexPathCalculator;
13+
import org.opentripplanner.routing.api.request.request.filter.TransitFilter;
1314
import org.opentripplanner.routing.graphfinder.NearbyStop;
1415
import org.opentripplanner.street.model.vertex.Vertex;
1516
import org.opentripplanner.street.search.state.EdgeTraverser;
1617
import org.opentripplanner.street.search.state.State;
1718
import org.opentripplanner.transit.model.site.StopLocation;
1819
import org.opentripplanner.transit.model.timetable.booking.RoutingBookingInfo;
20+
import org.opentripplanner.transit.service.TransitService;
1921

2022
public class FlexDirectPathFactory {
2123

2224
private final FlexAccessEgressCallbackAdapter callbackService;
2325
private final FlexPathCalculator accessPathCalculator;
2426
private final FlexPathCalculator egressPathCalculator;
2527
private final Duration maxTransferDuration;
28+
private final TransitService transitService;
29+
private final List<TransitFilter> filters;
2630

2731
public FlexDirectPathFactory(
2832
FlexAccessEgressCallbackAdapter callbackService,
2933
FlexPathCalculator accessPathCalculator,
3034
FlexPathCalculator egressPathCalculator,
31-
Duration maxTransferDuration
35+
Duration maxTransferDuration,
36+
TransitService transitService,
37+
List<TransitFilter> filters
3238
) {
3339
this.callbackService = callbackService;
3440
this.accessPathCalculator = accessPathCalculator;
3541
this.egressPathCalculator = egressPathCalculator;
3642
this.maxTransferDuration = maxTransferDuration;
43+
this.transitService = transitService;
44+
this.filters = filters;
3745
}
3846

3947
public Collection<DirectFlexPath> calculateDirectFlexPaths(
@@ -48,7 +56,9 @@ public Collection<DirectFlexPath> calculateDirectFlexPaths(
4856
var flexAccessTemplates = new FlexAccessFactory(
4957
callbackService,
5058
accessPathCalculator,
51-
maxTransferDuration
59+
maxTransferDuration,
60+
transitService,
61+
filters
5262
)
5363
.calculateFlexAccessTemplates(streetAccesses, dates);
5464

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.opentripplanner.ext.flex.template;
2+
3+
import java.util.List;
4+
import java.util.Objects;
5+
import org.opentripplanner.routing.api.request.request.filter.TransitFilter;
6+
import org.opentripplanner.transit.service.TransitService;
7+
8+
class FlexTransitFilter {
9+
10+
private final TransitService transitService;
11+
private final List<TransitFilter> filters;
12+
13+
FlexTransitFilter(TransitService transitService, List<TransitFilter> filters) {
14+
this.transitService = transitService;
15+
this.filters = filters;
16+
}
17+
18+
boolean matchesTransitFilters(ClosestTrip trip) {
19+
var t = trip.flexTrip().getTrip() ;
20+
var pattern = Objects.requireNonNull(transitService.findPattern(t), "flex trip doesn't have a pattern.");
21+
for (TransitFilter filter : filters) {
22+
if (filter.matchTripPattern(pattern)) {
23+
return true;
24+
}
25+
}
26+
return false;
27+
}
28+
}

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectFlexRouter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public static List<Itinerary> route(
5858
serverContext.graph(),
5959
serverContext.transitService(),
6060
serverContext.flexParameters(),
61+
request.journey().transit().filters(),
6162
request.dateTime(),
6263
request.bookingTime(),
6364
additionalSearchDays.additionalSearchDaysInPast(),

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/FlexAccessEgressRouter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public static Collection<FlexAccessEgress> routeAccessEgress(
6161
serverContext.graph(),
6262
transitService,
6363
config,
64+
request.journey().transit().filters(),
6465
request.dateTime(),
6566
request.bookingTime(),
6667
searchDays.additionalSearchDaysInPast(),

application/src/main/java/org/opentripplanner/routing/api/request/request/filter/TransitFilter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.opentripplanner.routing.api.request.request.filter;
22

33
import org.opentripplanner.transit.model.network.TripPattern;
4+
import org.opentripplanner.transit.model.timetable.Trip;
45
import org.opentripplanner.transit.model.timetable.TripTimes;
56

67
public interface TransitFilter {

0 commit comments

Comments
 (0)