Skip to content

Commit faf6205

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

File tree

10 files changed

+206
-33
lines changed

10 files changed

+206
-33
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

+13-2
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,34 @@ private static List<TripPatternForDate> filterActiveTripPatterns(
176176
boolean firstDay,
177177
TransitDataProviderFilter filter
178178
) {
179+
System.out.println("filter active trip patterns");
180+
179181
// On the first search day we want to add both TripPatternsForDate objects that start that day
180182
// and any previous day, while on subsequent search days we only want to add the
181183
// TripPatternForDate objects that start on that particular day. This is to prevent duplicates.
182184
// This was previously a stream, but was unrolled for improved performance.
183185

186+
var hasTripFilters = filter.hasTripFilters();
184187
Predicate<TripTimes> tripTimesWithSubmodesPredicate = tripTimes ->
185-
filter.tripTimesPredicate(tripTimes, filter.hasSubModeFilters());
188+
filter.tripTimesPredicate(tripTimes, filter.hasSubModeFilters() || hasTripFilters);
189+
186190
Predicate<TripTimes> tripTimesWithoutSubmodesPredicate = tripTimes ->
187191
filter.tripTimesPredicate(tripTimes, false);
192+
188193
Collection<TripPatternForDate> tripPatternsForDate = transitLayer.getTripPatternsForDate(date);
189194
List<TripPatternForDate> result = new ArrayList<>(tripPatternsForDate.size());
195+
196+
System.out.println("tripPatternsForDate: {}" + tripPatternsForDate.size());
197+
190198
for (TripPatternForDate p : tripPatternsForDate) {
191199
if (firstDay || p.getStartOfRunningPeriod().equals(date)) {
200+
System.out.println("*");
192201
if (filter.tripPatternPredicate(p)) {
193-
var tripTimesPredicate = p.getTripPattern().getPattern().getContainsMultipleModes()
202+
203+
var tripTimesPredicate = hasTripFilters || p.getTripPattern().getPattern().getContainsMultipleModes()
194204
? tripTimesWithSubmodesPredicate
195205
: tripTimesWithoutSubmodesPredicate;
206+
196207
TripPatternForDate tripPatternForDate = p.newWithFilteredTripTimes(tripTimesPredicate);
197208
if (tripPatternForDate != null) {
198209
result.add(tripPatternForDate);

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

+10
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();
@@ -85,6 +93,7 @@ public static BikeAccess bikeAccessForTrip(Trip trip) {
8593

8694
@Override
8795
public boolean tripPatternPredicate(TripPatternForDate tripPatternForDate) {
96+
System.out.println("tripPatternPredicate");
8897
for (TransitFilter filter : filters) {
8998
if (filter.matchTripPattern(tripPatternForDate.getTripPattern().getPattern())) {
9099
return true;
@@ -95,6 +104,7 @@ public boolean tripPatternPredicate(TripPatternForDate tripPatternForDate) {
95104

96105
@Override
97106
public boolean tripTimesPredicate(TripTimes tripTimes, boolean withFilters) {
107+
System.out.println("tripTimesPredicate");
98108
final Trip trip = tripTimes.getTrip();
99109

100110
if (requireBikesAllowed) {

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

+32-9
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,14 @@ 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+
44+
public boolean isTripsOnly() {
45+
return this.transportModeFilter == null && this.agencies.isEmpty() &&
46+
this.groupOfRoutes.isEmpty() && this.routes.isEmpty();
3947
}
4048

4149
public boolean matches(TripPattern tripPattern) {
@@ -77,21 +85,26 @@ public boolean matches(TripPattern tripPattern) {
7785
public boolean matchesSelect(TripTimes tripTimes) {
7886
var trip = tripTimes.getTrip();
7987

80-
return (
81-
this.transportModeFilter == null ||
82-
this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode())
83-
);
88+
var tripFilter = this.getTrips();
89+
90+
var matchesTrip = (tripFilter == null || tripFilter.isEmpty()) || tripFilter.contains(trip.getId());
91+
var matchesTransportMode = this.transportModeFilter == null || this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode());
92+
93+
return matchesTrip && matchesTransportMode;
8494
}
8595

8696
/**
8797
* Matches the not clause of a transit filter request.
8898
*/
8999
public boolean matchesNot(TripTimes tripTimes) {
90100
var trip = tripTimes.getTrip();
91-
return (
92-
this.transportModeFilter != null &&
93-
this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode())
94-
);
101+
102+
var tripFilter = this.getTrips();
103+
104+
var matchesTrip = (tripFilter != null && !tripFilter.isEmpty()) && tripFilter.contains(trip.getId());
105+
var matchesTransportMode = this.transportModeFilter != null && this.transportModeFilter.match(trip.getMode(), trip.getNetexSubMode());
106+
107+
return matchesTrip || matchesTransportMode;
95108
}
96109

97110
@Override
@@ -120,6 +133,10 @@ public List<FeedScopedId> routes() {
120133
return routes;
121134
}
122135

136+
public List<FeedScopedId> getTrips() {
137+
return trips;
138+
}
139+
123140
private String transportModesToString() {
124141
if (transportModes == null) {
125142
return null;
@@ -146,6 +163,7 @@ public static class Builder {
146163
private List<FeedScopedId> agencies = new ArrayList<>();
147164
private List<FeedScopedId> groupOfRoutes = new ArrayList<>();
148165
private List<FeedScopedId> routes = new ArrayList<>();
166+
private List<FeedScopedId> trips = new ArrayList<>();
149167

150168
public Builder withTransportModes(List<MainAndSubMode> transportModes) {
151169
this.transportModes = transportModes;
@@ -186,6 +204,11 @@ public Builder withGroupOfRoutes(List<FeedScopedId> groupOfRoutes) {
186204
return this;
187205
}
188206

207+
public Builder withTrips(List<FeedScopedId> trips) {
208+
this.trips = trips;
209+
return this;
210+
}
211+
189212
public SelectRequest build() {
190213
return new SelectRequest(this);
191214
}

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

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

60+
@Override
61+
public boolean isTripPredicate() {
62+
for (var selectRequest : select) {
63+
if (
64+
selectRequest.getTrips() != null &&
65+
!selectRequest.getTrips().isEmpty()
66+
) {
67+
return true;
68+
}
69+
}
70+
71+
for (var selectRequest : not) {
72+
if (
73+
selectRequest.getTrips() != null &&
74+
!selectRequest.getTrips().isEmpty()
75+
) {
76+
return true;
77+
}
78+
}
79+
return false;
80+
}
81+
6082
@Override
6183
public boolean matchTripPattern(TripPattern tripPattern) {
62-
if (select.length != 0) {
84+
var tripPatternSelect = Arrays.stream(select).filter(s -> !s.isTripsOnly()).toArray();
85+
86+
if (tripPatternSelect.length != 0) {
6387
var anyMatch = false;
6488
for (SelectRequest s : select) {
6589
if (s.matches(tripPattern)) {
@@ -73,7 +97,8 @@ public boolean matchTripPattern(TripPattern tripPattern) {
7397
}
7498

7599
for (SelectRequest s : not) {
76-
if (s.matches(tripPattern)) {
100+
// We'll filter trips in the next step
101+
if (!s.isTripsOnly() && s.matches(tripPattern)) {
77102
return false;
78103
}
79104
}

src/test/java/org/opentripplanner/routing/algorithm/FilterTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -769,4 +769,6 @@ public void testGroupOfLinesExcludeFunctionality() {
769769
assertEquals(1, bannedPatterns.size());
770770
assertTrue(bannedPatterns.contains(id(JOURNEY_PATTERN_ID_1)));
771771
}
772+
773+
772774
}

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

+6
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,
@@ -152,5 +157,6 @@ public BitSet filterAvailableStops(
152157
) {
153158
return boardingPossible;
154159
}
160+
155161
}
156162
}

0 commit comments

Comments
 (0)