Skip to content

Commit 11e27ef

Browse files
committed
Merge branch 'partial-revert-pr6245' into dev-2.x
2 parents 140e734 + 39203f3 commit 11e27ef

File tree

5 files changed

+140
-34
lines changed

5 files changed

+140
-34
lines changed

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

Lines changed: 98 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import graphql.schema.DataFetcher;
55
import graphql.schema.DataFetchingEnvironment;
66
import java.text.ParseException;
7+
import java.time.Instant;
78
import java.time.LocalDate;
89
import java.time.ZoneId;
910
import java.util.ArrayList;
@@ -23,6 +24,7 @@
2324
import org.opentripplanner.apis.gtfs.mapping.BikesAllowedMapper;
2425
import org.opentripplanner.apis.gtfs.model.TripOccupancy;
2526
import org.opentripplanner.apis.support.SemanticHash;
27+
import org.opentripplanner.model.Timetable;
2628
import org.opentripplanner.model.TripTimeOnDate;
2729
import org.opentripplanner.routing.alertpatch.EntitySelector;
2830
import org.opentripplanner.routing.alertpatch.TransitAlert;
@@ -35,6 +37,7 @@
3537
import org.opentripplanner.transit.model.site.StopLocation;
3638
import org.opentripplanner.transit.model.timetable.Direction;
3739
import org.opentripplanner.transit.model.timetable.Trip;
40+
import org.opentripplanner.transit.model.timetable.TripTimes;
3841
import org.opentripplanner.transit.service.TransitService;
3942
import org.opentripplanner.utils.time.ServiceDateUtils;
4043

@@ -126,13 +129,41 @@ public DataFetcher<Iterable<TransitAlert>> alerts() {
126129
@Override
127130
public DataFetcher<TripTimeOnDate> arrivalStoptime() {
128131
return environment -> {
129-
var serviceDate = getOptionalServiceDateArgument(environment);
130-
var trip = getSource(environment);
131-
var transitService = getTransitService(environment);
132-
var stopTimes = serviceDate
133-
.map(date -> transitService.getTripTimeOnDates(trip, date))
134-
.orElseGet(() -> transitService.getScheduledTripTimes(trip));
135-
return stopTimes.map(List::getLast).orElse(null);
132+
try {
133+
TransitService transitService = getTransitService(environment);
134+
TripPattern tripPattern = getTripPattern(environment);
135+
if (tripPattern == null) {
136+
return null;
137+
}
138+
Timetable timetable = tripPattern.getScheduledTimetable();
139+
140+
TripTimes tripTimes = timetable.getTripTimes(getSource(environment));
141+
if (tripTimes == null) {
142+
return null;
143+
}
144+
LocalDate serviceDate = null;
145+
Instant midnight = null;
146+
147+
var args = new GraphQLTypes.GraphQLTripArrivalStoptimeArgs(environment.getArguments());
148+
if (args.getGraphQLServiceDate() != null) {
149+
serviceDate = ServiceDateUtils.parseString(args.getGraphQLServiceDate());
150+
midnight = ServiceDateUtils.asStartOfService(
151+
serviceDate,
152+
transitService.getTimeZone()
153+
).toInstant();
154+
}
155+
156+
return new TripTimeOnDate(
157+
tripTimes,
158+
tripTimes.getNumStops() - 1,
159+
tripPattern,
160+
serviceDate,
161+
midnight
162+
);
163+
} catch (ParseException e) {
164+
// invalid date format
165+
return null;
166+
}
136167
};
137168
}
138169

@@ -149,13 +180,35 @@ public DataFetcher<String> blockId() {
149180
@Override
150181
public DataFetcher<TripTimeOnDate> departureStoptime() {
151182
return environment -> {
152-
var serviceDate = getOptionalServiceDateArgument(environment);
153-
var trip = getSource(environment);
154-
var transitService = getTransitService(environment);
155-
var stopTimes = serviceDate
156-
.map(date -> transitService.getTripTimeOnDates(trip, date))
157-
.orElseGet(() -> transitService.getScheduledTripTimes(trip));
158-
return stopTimes.map(List::getFirst).orElse(null);
183+
try {
184+
TransitService transitService = getTransitService(environment);
185+
TripPattern tripPattern = getTripPattern(environment);
186+
if (tripPattern == null) {
187+
return null;
188+
}
189+
Timetable timetable = tripPattern.getScheduledTimetable();
190+
191+
TripTimes tripTimes = timetable.getTripTimes(getSource(environment));
192+
if (tripTimes == null) {
193+
return null;
194+
}
195+
LocalDate serviceDate = null;
196+
Instant midnight = null;
197+
198+
var args = new GraphQLTypes.GraphQLTripDepartureStoptimeArgs(environment.getArguments());
199+
if (args.getGraphQLServiceDate() != null) {
200+
serviceDate = ServiceDateUtils.parseString(args.getGraphQLServiceDate());
201+
midnight = ServiceDateUtils.asStartOfService(
202+
serviceDate,
203+
transitService.getTimeZone()
204+
).toInstant();
205+
}
206+
207+
return new TripTimeOnDate(tripTimes, 0, tripPattern, serviceDate, midnight);
208+
} catch (ParseException e) {
209+
// invalid date format
210+
return null;
211+
}
159212
};
160213
}
161214

@@ -255,16 +308,37 @@ public DataFetcher<Iterable<TripTimeOnDate>> stoptimes() {
255308
@Override
256309
public DataFetcher<Iterable<TripTimeOnDate>> stoptimesForDate() {
257310
return environment -> {
258-
TransitService transitService = getTransitService(environment);
259-
Trip trip = getSource(environment);
260-
var args = new GraphQLTypes.GraphQLTripStoptimesForDateArgs(environment.getArguments());
261-
262-
ZoneId timeZone = transitService.getTimeZone();
263-
LocalDate serviceDate = args.getGraphQLServiceDate() != null
264-
? ServiceDateUtils.parseString(args.getGraphQLServiceDate())
265-
: LocalDate.now(timeZone);
266-
267-
return transitService.getTripTimeOnDates(trip, serviceDate).orElse(null);
311+
try {
312+
TransitService transitService = getTransitService(environment);
313+
Trip trip = getSource(environment);
314+
var args = new GraphQLTypes.GraphQLTripStoptimesForDateArgs(environment.getArguments());
315+
316+
ZoneId timeZone = transitService.getTimeZone();
317+
LocalDate serviceDate = args.getGraphQLServiceDate() != null
318+
? ServiceDateUtils.parseString(args.getGraphQLServiceDate())
319+
: LocalDate.now(timeZone);
320+
321+
TripPattern tripPattern = transitService.findPattern(trip, serviceDate);
322+
if (tripPattern == null) {
323+
return List.of();
324+
}
325+
326+
Instant midnight = ServiceDateUtils.asStartOfService(
327+
serviceDate,
328+
transitService.getTimeZone()
329+
).toInstant();
330+
Timetable timetable = transitService.findTimetable(tripPattern, serviceDate);
331+
return TripTimeOnDate.fromTripTimesWithScheduleFallback(
332+
timetable,
333+
trip,
334+
serviceDate,
335+
midnight,
336+
transitService
337+
);
338+
} catch (ParseException e) {
339+
// invalid date format
340+
return null;
341+
}
268342
};
269343
}
270344

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,12 @@ public DataFetcher<Iterable<TripTimeOnDate>> stopCalls() {
6262
if (arguments.timetable() == null) {
6363
return List.of();
6464
}
65-
return TripTimeOnDate.fromTripTimes(
65+
return TripTimeOnDate.fromTripTimesWithScheduleFallback(
6666
arguments.timetable(),
6767
arguments.trip(),
6868
arguments.serviceDate(),
69-
arguments.midnight()
69+
arguments.midnight(),
70+
getTransitService(environment)
7071
);
7172
};
7273
}

application/src/main/java/org/opentripplanner/model/TripTimeOnDate.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.opentripplanner.transit.model.timetable.Trip;
1717
import org.opentripplanner.transit.model.timetable.TripTimes;
1818
import org.opentripplanner.transit.model.timetable.booking.BookingInfo;
19+
import org.opentripplanner.transit.service.TransitService;
1920
import org.slf4j.Logger;
2021
import org.slf4j.LoggerFactory;
2122

@@ -80,6 +81,34 @@ public static List<TripTimeOnDate> fromTripTimes(Timetable table, Trip trip) {
8081
return out;
8182
}
8283

84+
/**
85+
* Must pass in both Timetable and Trip, because TripTimes do not have a reference to
86+
* StopPatterns.
87+
* <br>
88+
* If the timetable does not contain the trip, scheduledTimetable is used instead.
89+
*
90+
* @param table the timetable for the service day
91+
* @param serviceDate service day to set
92+
*/
93+
public static List<TripTimeOnDate> fromTripTimesWithScheduleFallback(
94+
Timetable table,
95+
Trip trip,
96+
LocalDate serviceDate,
97+
Instant midnight,
98+
TransitService transitService
99+
) {
100+
TripTimes times = table.getTripTimes(trip);
101+
if (times == null) {
102+
Timetable scheduledTimetable = transitService.findPattern(trip).getScheduledTimetable();
103+
return fromTripTimes(scheduledTimetable, trip);
104+
}
105+
List<TripTimeOnDate> out = new ArrayList<>();
106+
for (int i = 0; i < times.getNumStops(); ++i) {
107+
out.add(new TripTimeOnDate(times, i, table.getPattern(), serviceDate, midnight));
108+
}
109+
return out;
110+
}
111+
83112
/**
84113
* Must pass in both Timetable and Trip, because TripTimes do not have a reference to
85114
* StopPatterns.

application/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2494,6 +2494,12 @@ type Trip implements Node {
24942494
stops: [Stop!]!
24952495
"List of times when this trip arrives to or departs from a stop"
24962496
stoptimes: [Stoptime]
2497+
"""
2498+
List of times when this trip arrives to or departs from a stop on a given date, or
2499+
today if the date is not given. If the trip does not run on the given date, will
2500+
return the times of the next scheduled running date. This is a confusing call and
2501+
will be deprecated when a better API is implemented.
2502+
"""
24972503
stoptimesForDate(
24982504
"Date for which stoptimes are returned. Format: YYYYMMDD"
24992505
serviceDate: String

application/src/test/resources/org/opentripplanner/apis/gtfs/expectations/realtime-trip.json

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
"addedTrip": {
44
"gtfsId": "F:ADDED_TRIP",
55
"timetabledOrigin": null,
6-
"datedOrigin": {
7-
"realtimeDeparture": 0
8-
},
6+
"datedOrigin": null,
97
"timetabledDestination": null,
10-
"datedDestination": {
11-
"realtimeArrival": 900
12-
},
8+
"datedDestination": null,
139
"stoptimes": null,
1410
"stoptimesForDate": [
1511
{
@@ -48,13 +44,13 @@
4844
"scheduledDeparture": 41400
4945
},
5046
"datedOrigin": {
51-
"realtimeDeparture": 0
47+
"realtimeDeparture": 41400
5248
},
5349
"timetabledDestination": {
5450
"scheduledArrival": 42000
5551
},
5652
"datedDestination": {
57-
"realtimeArrival": 900
53+
"realtimeArrival": 42000
5854
},
5955
"stoptimes": [
6056
{

0 commit comments

Comments
 (0)