Skip to content

Commit 33a74fa

Browse files
author
bartosz
committed
Add implementation for Service Journey filter
1 parent 3f69e5e commit 33a74fa

File tree

9 files changed

+196
-31
lines changed

9 files changed

+196
-31
lines changed

src/main/java/org/opentripplanner/apis/transmodel/mapping/SelectRequestMapper.java

+5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ static SelectRequest mapSelectRequest(Map<String, List<?>> input) {
3232
selectRequestBuilder.withGroupOfRoutes(mapIDsToDomainNullSafe(groupOfLines));
3333
}
3434

35+
if (input.containsKey("serviceJourneys")) {
36+
var serviceJourneys = (List<String>) input.get("serviceJourneys");
37+
selectRequestBuilder.withTrips(mapIDsToDomainNullSafe(serviceJourneys));
38+
}
39+
3540
if (input.containsKey("transportModes")) {
3641
var tModes = new ArrayList<MainAndSubMode>();
3742

src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitDataCreator.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -181,18 +181,24 @@ private static List<TripPatternForDate> filterActiveTripPatterns(
181181
// TripPatternForDate objects that start on that particular day. This is to prevent duplicates.
182182
// This was previously a stream, but was unrolled for improved performance.
183183

184+
var hasTripFilters = filter.hasTripFilters();
184185
Predicate<TripTimes> tripTimesWithSubmodesPredicate = tripTimes ->
185-
filter.tripTimesPredicate(tripTimes, filter.hasSubModeFilters());
186+
filter.tripTimesPredicate(tripTimes, filter.hasSubModeFilters() || hasTripFilters);
187+
186188
Predicate<TripTimes> tripTimesWithoutSubmodesPredicate = tripTimes ->
187189
filter.tripTimesPredicate(tripTimes, false);
190+
188191
Collection<TripPatternForDate> tripPatternsForDate = transitLayer.getTripPatternsForDate(date);
189192
List<TripPatternForDate> result = new ArrayList<>(tripPatternsForDate.size());
193+
190194
for (TripPatternForDate p : tripPatternsForDate) {
191195
if (firstDay || p.getStartOfRunningPeriod().equals(date)) {
192196
if (filter.tripPatternPredicate(p)) {
193-
var tripTimesPredicate = p.getTripPattern().getPattern().getContainsMultipleModes()
197+
var tripTimesPredicate = hasTripFilters ||
198+
p.getTripPattern().getPattern().getContainsMultipleModes()
194199
? tripTimesWithSubmodesPredicate
195200
: tripTimesWithoutSubmodesPredicate;
201+
196202
TripPatternForDate tripPatternForDate = p.newWithFilteredTripTimes(tripTimesPredicate);
197203
if (tripPatternForDate != null) {
198204
result.add(tripPatternForDate);

src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RouteRequestTransitDataProviderFilter.java

+8
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public class RouteRequestTransitDataProviderFilter implements TransitDataProvide
3838

3939
private final boolean hasSubModeFilters;
4040

41+
private final boolean hasTripFilters;
42+
4143
public RouteRequestTransitDataProviderFilter(RouteRequest request) {
4244
this(
4345
request.journey().transfer().mode() == StreetMode.BIKE,
@@ -68,13 +70,19 @@ public RouteRequestTransitDataProviderFilter(
6870
this.bannedTrips = bannedTrips;
6971
this.filters = filters.toArray(TransitFilter[]::new);
7072
this.hasSubModeFilters = filters.stream().anyMatch(TransitFilter::isSubModePredicate);
73+
this.hasTripFilters = filters.stream().anyMatch(TransitFilter::isTripPredicate);
7174
}
7275

7376
@Override
7477
public boolean hasSubModeFilters() {
7578
return hasSubModeFilters;
7679
}
7780

81+
@Override
82+
public boolean hasTripFilters() {
83+
return hasTripFilters;
84+
}
85+
7886
public static BikeAccess bikeAccessForTrip(Trip trip) {
7987
if (trip.getBikesAllowed() != BikeAccess.UNKNOWN) {
8088
return trip.getBikesAllowed();

src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/TransitDataProviderFilter.java

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public interface TransitDataProviderFilter {
2020

2121
boolean hasSubModeFilters();
2222

23+
boolean hasTripFilters();
24+
2325
boolean tripTimesPredicate(TripTimes tripTimes, boolean withFilters);
2426

2527
/**

src/main/java/org/opentripplanner/routing/api/request/request/filter/SelectRequest.java

+39-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public static Builder of() {
2222
private final List<FeedScopedId> agencies;
2323
private final List<FeedScopedId> groupOfRoutes;
2424
private final List<FeedScopedId> routes;
25+
private final List<FeedScopedId> trips;
2526

2627
public SelectRequest(Builder builder) {
2728
if (builder.transportModes.isEmpty()) {
@@ -35,7 +36,17 @@ public SelectRequest(Builder builder) {
3536

3637
this.agencies = List.copyOf(builder.agencies);
3738
this.groupOfRoutes = List.copyOf(builder.groupOfRoutes);
38-
this.routes = builder.routes;
39+
this.routes = List.copyOf(builder.routes);
40+
this.trips = List.copyOf(builder.trips);
41+
}
42+
43+
public boolean isTripsOnly() {
44+
return (
45+
this.transportModeFilter == null &&
46+
this.agencies.isEmpty() &&
47+
this.groupOfRoutes.isEmpty() &&
48+
this.routes.isEmpty()
49+
);
3950
}
4051

4152
public boolean matches(TripPattern tripPattern) {
@@ -77,21 +88,32 @@ public boolean matches(TripPattern tripPattern) {
7788
public boolean matchesSelect(TripTimes tripTimes) {
7889
var trip = tripTimes.getTrip();
7990

80-
return (
91+
var tripFilter = this.getTrips();
92+
93+
var matchesTrip =
94+
(tripFilter == null || tripFilter.isEmpty()) || tripFilter.contains(trip.getId());
95+
var matchesTransportMode =
8196
this.transportModeFilter == null ||
82-
this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode())
83-
);
97+
this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode());
98+
99+
return matchesTrip && matchesTransportMode;
84100
}
85101

86102
/**
87103
* Matches the not clause of a transit filter request.
88104
*/
89105
public boolean matchesNot(TripTimes tripTimes) {
90106
var trip = tripTimes.getTrip();
91-
return (
107+
108+
var tripFilter = this.getTrips();
109+
110+
var matchesTrip =
111+
(tripFilter != null && !tripFilter.isEmpty()) && tripFilter.contains(trip.getId());
112+
var matchesTransportMode =
92113
this.transportModeFilter != null &&
93-
this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode())
94-
);
114+
this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode());
115+
116+
return matchesTrip || matchesTransportMode;
95117
}
96118

97119
@Override
@@ -120,6 +142,10 @@ public List<FeedScopedId> routes() {
120142
return routes;
121143
}
122144

145+
public List<FeedScopedId> getTrips() {
146+
return trips;
147+
}
148+
123149
private String transportModesToString() {
124150
if (transportModes == null) {
125151
return null;
@@ -146,6 +172,7 @@ public static class Builder {
146172
private List<FeedScopedId> agencies = new ArrayList<>();
147173
private List<FeedScopedId> groupOfRoutes = new ArrayList<>();
148174
private List<FeedScopedId> routes = new ArrayList<>();
175+
private List<FeedScopedId> trips = new ArrayList<>();
149176

150177
public Builder withTransportModes(List<MainAndSubMode> transportModes) {
151178
this.transportModes = transportModes;
@@ -186,6 +213,11 @@ public Builder withGroupOfRoutes(List<FeedScopedId> groupOfRoutes) {
186213
return this;
187214
}
188215

216+
public Builder withTrips(List<FeedScopedId> trips) {
217+
this.trips = trips;
218+
return this;
219+
}
220+
189221
public SelectRequest build() {
190222
return new SelectRequest(this);
191223
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@ public interface TransitFilter {
1717
default boolean isSubModePredicate() {
1818
return false;
1919
}
20+
21+
default boolean isTripPredicate() {
22+
return false;
23+
}
2024
}

src/main/java/org/opentripplanner/routing/api/request/request/filter/TransitFilterRequest.java

+21-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,27 @@ public boolean isSubModePredicate() {
5757
return false;
5858
}
5959

60+
@Override
61+
public boolean isTripPredicate() {
62+
for (var selectRequest : select) {
63+
if (selectRequest.getTrips() != null && !selectRequest.getTrips().isEmpty()) {
64+
return true;
65+
}
66+
}
67+
68+
for (var selectRequest : not) {
69+
if (selectRequest.getTrips() != null && !selectRequest.getTrips().isEmpty()) {
70+
return true;
71+
}
72+
}
73+
return false;
74+
}
75+
6076
@Override
6177
public boolean matchTripPattern(TripPattern tripPattern) {
62-
if (select.length != 0) {
78+
var tripPatternSelect = Arrays.stream(select).filter(s -> !s.isTripsOnly()).toArray();
79+
80+
if (tripPatternSelect.length != 0) {
6381
var anyMatch = false;
6482
for (SelectRequest s : select) {
6583
if (s.matches(tripPattern)) {
@@ -73,7 +91,8 @@ public boolean matchTripPattern(TripPattern tripPattern) {
7391
}
7492

7593
for (SelectRequest s : not) {
76-
if (s.matches(tripPattern)) {
94+
// We'll filter trips in the next step
95+
if (!s.isTripsOnly() && s.matches(tripPattern)) {
7796
return false;
7897
}
7998
}

src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitDataCreatorTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ public boolean hasSubModeFilters() {
144144
return false;
145145
}
146146

147+
@Override
148+
public boolean hasTripFilters() {
149+
return false;
150+
}
151+
147152
@Override
148153
public BitSet filterAvailableStops(
149154
RoutingTripPattern tripPattern,

0 commit comments

Comments
 (0)