From b0508faba7cfb28be19c44ef30356bd586030477 Mon Sep 17 00:00:00 2001 From: Joel Lappalainen Date: Fri, 17 Feb 2023 00:04:15 +0200 Subject: [PATCH 1/3] Use headsign from original pattern if stops are the same --- .../transit/model/network/TripPattern.java | 7 +- .../trip/TimetableSnapshotSourceTest.java | 7 ++ src/test/resources/testagency/trips.txt | 68 +++++++++---------- 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java index 804095d0c5e..5e400337d87 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java +++ b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java @@ -402,7 +402,12 @@ public TripPattern getOriginalTripPattern() { } public I18NString getTripHeadsign() { - var tripTimes = scheduledTimetable.getRepresentativeTripTimes(); + var representativeTripTimes = scheduledTimetable.getRepresentativeTripTimes(); + var tripTimes = representativeTripTimes == null && + originalTripPattern != null && + getStops().equals(originalTripPattern.getStops()) + ? originalTripPattern.getScheduledTimetable().getRepresentativeTripTimes() + : representativeTripTimes; if (tripTimes == null) { return null; } diff --git a/src/test/java/org/opentripplanner/updater/trip/TimetableSnapshotSourceTest.java b/src/test/java/org/opentripplanner/updater/trip/TimetableSnapshotSourceTest.java index a7d17e8fa26..a1fd370a8fc 100644 --- a/src/test/java/org/opentripplanner/updater/trip/TimetableSnapshotSourceTest.java +++ b/src/test/java/org/opentripplanner/updater/trip/TimetableSnapshotSourceTest.java @@ -34,6 +34,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.opentripplanner.ConstantsForTests; import org.opentripplanner.TestOtpModel; +import org.opentripplanner.framework.i18n.NonLocalizedString; import org.opentripplanner.framework.time.ServiceDateUtils; import org.opentripplanner.model.PickDrop; import org.opentripplanner.model.Timetable; @@ -669,6 +670,12 @@ public void scheduledTripWithSkippedAndNoData() { assertFalse(newTripPattern.canBoard(1)); assertTrue(newTripPattern.canBoard(2)); + assertEquals(new NonLocalizedString("foo"), newTripPattern.getTripHeadsign()); + assertEquals( + newTripPattern.getOriginalTripPattern().getTripHeadsign(), + newTripPattern.getTripHeadsign() + ); + final int newTimetableForTodayModifiedTripIndex = newTimetableForToday.getTripIndex( scheduledTripId ); diff --git a/src/test/resources/testagency/trips.txt b/src/test/resources/testagency/trips.txt index 03128f3c09b..9441c8c25e3 100755 --- a/src/test/resources/testagency/trips.txt +++ b/src/test/resources/testagency/trips.txt @@ -1,34 +1,34 @@ -route_id,service_id,trip_id,shape_id,block_id,wheelchair_accessible,trip_bikes_allowed,direction_id -1,alldays,1.1,,,1,, -1,alldays,1.2,,,1,, -1,alldays,1.3,,,1,, -2,alldays,2.1,,,0,2, -2,alldays,2.2,,,0,2, -3,alldays,3.1,,,1,, -3,alldays,3.2,,,1,, -4,weekdays,4.1,4,,,, -4,weekdays,4.2,4,,,, -4,weekdays,4.3,4,,,, -5,alldays,5.1,5,,,, -6,alldays,6.1,,block.1,,, -7,alldays,7.1,,block.1,,, -6,alldays,6.2,,block.2,,, -7,alldays,7.2,,block.2,,, -8,alldays,8.1,,block.2,,, -9,alldays,9.1,,,,1, -10,alldays,10.1,,,,, -10,alldays,10.2,,,,, -10,alldays,10.3,,,,, -10,alldays,10.4,,,,, -10,alldays,10.5,,,,, -11,alldays,11.1,,,,, -12,alldays,12.1,,,,, -13,alldays,13.1,,,,, -14,alldays,14.1,,,,, -14,alldays,14.2,,,,, -15,alldays,15.1,5,,,, -16,alldays,16.1,,,,, -17,alldays,17.1,,,,, -18,alldays,18.1,,,,,N -18,alldays,18.1back,,,1,,S -18,alldays,18.bogus,,,,, +route_id,service_id,trip_id,shape_id,block_id,wheelchair_accessible,trip_bikes_allowed,direction_id,trip_headsign +1,alldays,1.1,,,1,,,foo +1,alldays,1.2,,,1,,,foo +1,alldays,1.3,,,1,,,foo +2,alldays,2.1,,,0,2,,foo +2,alldays,2.2,,,0,2,,foo +3,alldays,3.1,,,1,,,foo +3,alldays,3.2,,,1,,,foo +4,weekdays,4.1,4,,,,,foo +4,weekdays,4.2,4,,,,,foo +4,weekdays,4.3,4,,,,,foo +5,alldays,5.1,5,,,,,foo +6,alldays,6.1,,block.1,,,,foo +7,alldays,7.1,,block.1,,,,foo +6,alldays,6.2,,block.2,,,,foo +7,alldays,7.2,,block.2,,,,foo +8,alldays,8.1,,block.2,,,,foo +9,alldays,9.1,,,,1,,foo +10,alldays,10.1,,,,,,foo +10,alldays,10.2,,,,,,foo +10,alldays,10.3,,,,,,foo +10,alldays,10.4,,,,,,foo +10,alldays,10.5,,,,,,foo +11,alldays,11.1,,,,,,foo +12,alldays,12.1,,,,,,foo +13,alldays,13.1,,,,,,foo +14,alldays,14.1,,,,,,foo +14,alldays,14.2,,,,,,foo +15,alldays,15.1,5,,,,,foo +16,alldays,16.1,,,,,,foo +17,alldays,17.1,,,,,,foo +18,alldays,18.1,,,,,N,foo +18,alldays,18.1back,,,1,,S,foo +18,alldays,18.bogus,,,,,,foo From 507716c59d185e5bf4ae456ed76d162fb740be4b Mon Sep 17 00:00:00 2001 From: Joel Lappalainen Date: Fri, 17 Feb 2023 15:26:32 +0200 Subject: [PATCH 2/3] Clean code --- .../transit/model/network/TripPattern.java | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java index 5e400337d87..7589debbf8e 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java +++ b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java @@ -401,17 +401,18 @@ public TripPattern getOriginalTripPattern() { return originalTripPattern; } + /** + * Returns trip headsign from the scheduled timetables or from the original pattern's scheduled + * timetables if this pattern is added by realtime and the stop sequence has not changed apart + * from pickup/dropoff values. + * + * @return trip headsign + */ public I18NString getTripHeadsign() { - var representativeTripTimes = scheduledTimetable.getRepresentativeTripTimes(); - var tripTimes = representativeTripTimes == null && - originalTripPattern != null && - getStops().equals(originalTripPattern.getStops()) - ? originalTripPattern.getScheduledTimetable().getRepresentativeTripTimes() - : representativeTripTimes; - if (tripTimes == null) { - return null; - } - return tripTimes.getTrip().getHeadsign(); + var tripTimes = scheduledTimetable.getRepresentativeTripTimes(); + return tripTimes == null + ? getTripHeadsignFromOriginalPattern() + : getTripHeadSignFromTripTimes(tripTimes); } public I18NString getStopHeadsign(int stopIndex) { @@ -472,4 +473,30 @@ public boolean sameAs(@Nonnull TripPattern other) { public TripPatternBuilder copy() { return new TripPatternBuilder(this); } + + /** + * Checks if the stops in this trip pattern are the same as in the original pattern (if this trip + * is added through a realtime update. The pickup and dropoff values don't have to be the same. + */ + private boolean containsSameStopsAsOriginalPattern() { + return originalTripPattern != null && getStops().equals(originalTripPattern.getStops()); + } + + /** + * Helper method for getting the trip headsign from the {@link TripTimes}. + */ + private I18NString getTripHeadSignFromTripTimes(TripTimes tripTimes) { + return tripTimes != null ? tripTimes.getTrip().getHeadsign() : null; + } + + /** + * Returns trip headsign from the original pattern if one exists. + */ + private I18NString getTripHeadsignFromOriginalPattern() { + if (containsSameStopsAsOriginalPattern()) { + var tripTimes = originalTripPattern.getScheduledTimetable().getRepresentativeTripTimes(); + return getTripHeadSignFromTripTimes(tripTimes); + } + return null; + } } From fb866cb6b17ebdac62742a5a5633afd2417ab219 Mon Sep 17 00:00:00 2001 From: Joel Lappalainen Date: Fri, 17 Feb 2023 15:36:43 +0200 Subject: [PATCH 3/3] Lessen feature envy --- .../opentripplanner/transit/model/network/TripPattern.java | 2 +- .../opentripplanner/transit/model/timetable/TripTimes.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java index 7589debbf8e..05d4375c7ba 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java +++ b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java @@ -486,7 +486,7 @@ private boolean containsSameStopsAsOriginalPattern() { * Helper method for getting the trip headsign from the {@link TripTimes}. */ private I18NString getTripHeadSignFromTripTimes(TripTimes tripTimes) { - return tripTimes != null ? tripTimes.getTrip().getHeadsign() : null; + return tripTimes != null ? tripTimes.getTripHeadsign() : null; } /** diff --git a/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java b/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java index c3fc4aaccf1..51da6adb856 100644 --- a/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java +++ b/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java @@ -212,6 +212,13 @@ public List getHeadsignVias(final int stop) { return List.of(headsignVias[stop]); } + /** + * @return the whole trip's headsign. Individual stops can have different headsigns. + */ + public I18NString getTripHeadsign() { + return trip.getHeadsign(); + } + /** @return the time in seconds after midnight that the vehicle arrives at the stop. */ public int getScheduledArrivalTime(final int stop) { return scheduledArrivalTimes[stop] + timeShift;