From fcdc1cc9057071b37983c7f8d8b7edb6499c7db0 Mon Sep 17 00:00:00 2001 From: "philip.cline" Date: Thu, 6 Jul 2023 15:30:45 -0400 Subject: [PATCH 1/3] fix(exceptions): allow exception overlap in backend --- .../java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java b/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java index 61f6bb8cf..647c497aa 100644 --- a/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java +++ b/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -135,7 +136,12 @@ public FeedLoadResult exportTables() { for (Calendar cal : calendars) { Service service = new Service(cal.service_id); service.calendar = cal; - for (ScheduleException ex : exceptions) { + List calendarExceptions = exceptions.stream().filter(ex -> + ex.addedService.contains(cal.service_id) || + ex.removedService.contains(cal.service_id) || + ex.customSchedule.contains(cal.service_id) + ).collect(Collectors.toList()); + for (ScheduleException ex : calendarExceptions) { if (ex.exemplar.equals(ScheduleException.ExemplarServiceDescriptor.SWAP) && (!ex.addedService.contains(cal.service_id) && !ex.removedService.contains(cal.service_id))) { // Skip swap exception if cal is not referenced by added or removed service. From 677ba68d91cf7e9f7609373bd6b3d031e90ed797 Mon Sep 17 00:00:00 2001 From: "philip.cline" Date: Fri, 7 Jul 2023 09:07:16 -0400 Subject: [PATCH 2/3] refactor(exceptions): update to avoid merge conflict --- src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java b/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java index 647c497aa..63821baa3 100644 --- a/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java +++ b/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java @@ -159,7 +159,7 @@ public FeedLoadResult exportTables() { calendarDate.date = date; calendarDate.service_id = cal.service_id; calendarDate.exception_type = ex.serviceRunsOn(cal) ? 1 : 2; - LOG.info("Adding exception {} (type={}) for calendar {} on date {}", ex.name, calendarDate.exception_type, cal.service_id, date.toString()); + LOG.info("Adding exception {} (type={}) for calendar {} on date {}", ex.name, calendarDate.exception_type, cal.service_id, date); if (service.calendar_dates.containsKey(date)) throw new IllegalArgumentException("Duplicate schedule exceptions on " + date.toString()); From e51456e60c8761f646a7bcb71e600676c49606aa Mon Sep 17 00:00:00 2001 From: "philip.cline" Date: Wed, 12 Jul 2023 08:35:43 -0400 Subject: [PATCH 3/3] refactor(exceptions): inline exceptions filtering for For loop --- .../gtfs/loader/JdbcGtfsExporter.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java b/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java index 63821baa3..cd3b25aef 100644 --- a/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java +++ b/src/main/java/com/conveyal/gtfs/loader/JdbcGtfsExporter.java @@ -68,6 +68,17 @@ public JdbcGtfsExporter(String feedId, String outFile, DataSource dataSource, bo this.fromEditor = fromEditor; } + /** + * Utility method to check if an exception uses a specific service. + */ + public Boolean exceptionInvolvesService(ScheduleException ex, String serviceId) { + return ( + ex.addedService.contains(serviceId) || + ex.removedService.contains(serviceId) || + ex.customSchedule.contains(serviceId) + ); + } + /** * Export primary entity tables as well as Pattern and PatternStops tables. * @@ -136,12 +147,10 @@ public FeedLoadResult exportTables() { for (Calendar cal : calendars) { Service service = new Service(cal.service_id); service.calendar = cal; - List calendarExceptions = exceptions.stream().filter(ex -> - ex.addedService.contains(cal.service_id) || - ex.removedService.contains(cal.service_id) || - ex.customSchedule.contains(cal.service_id) - ).collect(Collectors.toList()); - for (ScheduleException ex : calendarExceptions) { + for (ScheduleException ex : exceptions.stream() + .filter(ex -> exceptionInvolvesService(ex, cal.service_id)) + .collect(Collectors.toList()) + ) { if (ex.exemplar.equals(ScheduleException.ExemplarServiceDescriptor.SWAP) && (!ex.addedService.contains(cal.service_id) && !ex.removedService.contains(cal.service_id))) { // Skip swap exception if cal is not referenced by added or removed service.