listNextStopTimesForStop method
Future<({Set<String> routeIds, List<({Date date, String routeId, StopTime time, Trip trip})> stopTimes})>
listNextStopTimesForStop(
- GtfsDataset dataset,
- Stop stop, {
- LoadCriterion? tripCriterion,
- LoadCriterion? stopTimesCriterion,
Implementation
Future<
({
List<({StopTime time, Trip trip, Date date, String routeId})> stopTimes,
Set<String> routeIds,
})
>
listNextStopTimesForStop(
GtfsDataset dataset,
Stop stop, {
LoadCriterion? tripCriterion,
LoadCriterion? stopTimesCriterion,
}) async {
final now = DateTime.now();
final today = Date.fromDatetime(now);
final next24Hours = now.add(Duration(days: 1));
final tomorrow = Date.fromDatetime(next24Hours);
final Map<String, List<StopTime>> tripIdsToCheck = {};
await for (final stopTime in dataset.stopTimes.streamResource(
LoadCriterion.and(
stopTimesCriterion ?? LoadCriterion.passAll(),
LoadCriterion([
'stop_id',
], (requestedFields) => requestedFields[0] == stop.id),
),
)) {
tripIdsToCheck[stopTime.tripId] =
tripIdsToCheck[stopTime.tripId] ?? [stopTime];
}
final totalActiveServices = await dataset.calendar.listServicesForDateRange(
now,
next24Hours,
);
final List<({StopTime time, Trip trip, Date date, String routeId})>
foundStopTimes = [];
final Set<String> routeIds = {};
await for (final trip in dataset.trips.streamResource(
LoadCriterion.and(
tripCriterion ?? LoadCriterion.passAll(),
LoadCriterion([
'trip_id',
], (requestedFields) => tripIdsToCheck.containsKey(requestedFields[0])),
),
)) {
for (final day in [today, tomorrow]) {
if (totalActiveServices[day]!.contains(trip.serviceId)) {
for (final stopTime in tripIdsToCheck[trip.id]!) {
final departureTime = stopTime.departureTime!.relativeToDate(day);
if ((departureTime.isAtSameMomentAs(now) ||
departureTime.isAfter(now)) &&
(departureTime.isAtSameMomentAs(next24Hours) ||
departureTime.isBefore(next24Hours))) {
routeIds.add(trip.routeId);
foundStopTimes.add((
time: stopTime,
trip: trip,
date: day,
routeId: trip.routeId,
));
}
}
}
}
}
return (routeIds: routeIds, stopTimes: foundStopTimes);
}