Skip to content

Commit d349c1a

Browse files
committed
refactor: Encapsulate timetable inside TimetableSnapshot.
This call to the updates listener exposed the internal map of timetable. The callee did only use the map to fetch data, so we could easily change the callback from a map to a function. NOTE! There is a functional change in this commit! The `TimetableSnapshot#clearTimetables(...)` uses the TripPattern.id.feedScope to filter, not the TripPattern.route.id.feedScope. These should have tha same value, but it is possible to mess up here. ```Java private boolean clearTimetables(String feedId) { return timetables.keySet().removeIf(id -> feedId.equals(id.getFeedId())); } ```
1 parent ce19c8c commit d349c1a

5 files changed

Lines changed: 23 additions & 25 deletions

File tree

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/mappers/RealTimeRaptorTransitDataUpdater.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
import java.util.Map;
1111
import java.util.Set;
1212
import java.util.SortedSet;
13+
import java.util.function.Function;
1314
import java.util.stream.Collectors;
1415
import org.opentripplanner.framework.application.OTPFeature;
1516
import org.opentripplanner.routing.algorithm.raptoradapter.transit.RaptorTransitData;
1617
import org.opentripplanner.routing.algorithm.raptoradapter.transit.TripPatternForDate;
1718
import org.opentripplanner.routing.algorithm.raptoradapter.transit.constrainedtransfer.TransferIndexGenerator;
19+
import org.opentripplanner.transit.model.framework.FeedScopedId;
1820
import org.opentripplanner.transit.model.network.TripPattern;
1921
import org.opentripplanner.transit.model.timetable.Timetable;
2022
import org.opentripplanner.transit.model.timetable.TimetableSnapshotUpdateSucessListener;
@@ -95,7 +97,7 @@ public RealTimeRaptorTransitDataUpdater(TimetableRepository timetableRepository)
9597
@Override
9698
public void update(
9799
Collection<Timetable> updatedTimetables,
98-
Map<TripPattern, SortedSet<Timetable>> timetables
100+
Function<FeedScopedId, SortedSet<Timetable>> timetableProvider
99101
) {
100102
if (!timetableRepository.hasRealtimeRaptorTransitData()) {
101103
return;
@@ -218,7 +220,7 @@ public void update(
218220
if (!pattern.isCreatedByRealtimeUpdater()) {
219221
continue;
220222
}
221-
var oldTimeTable = timetables.get(pattern);
223+
var oldTimeTable = timetableProvider.apply(pattern.getId());
222224
if (oldTimeTable != null) {
223225
var toRemove = oldTimeTable
224226
.stream()

application/src/main/java/org/opentripplanner/transit/model/timetable/TimetableSnapshot.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public class TimetableSnapshot {
102102
* The compound key approach better reflects the fact that there should be only one Timetable per
103103
* TripPattern and date.
104104
*/
105-
private final Map<TripPattern, SortedSet<Timetable>> timetables;
105+
private final Map<FeedScopedId, SortedSet<Timetable>> timetables;
106106

107107
/**
108108
* For cases where the trip pattern (sequence of stops visited) has been changed by a realtime
@@ -168,7 +168,7 @@ public TimetableSnapshot() {
168168
}
169169

170170
private TimetableSnapshot(
171-
Map<TripPattern, SortedSet<Timetable>> timetables,
171+
Map<FeedScopedId, SortedSet<Timetable>> timetables,
172172
Map<TripIdAndServiceDate, TripPattern> realTimeNewTripPatternsForModifiedTrips,
173173
Map<FeedScopedId, Route> realtimeAddedRoutes,
174174
Map<FeedScopedId, Trip> realtimeAddedTrips,
@@ -196,7 +196,7 @@ private TimetableSnapshot(
196196
* the originally scheduled timetable if there are no updates in this snapshot.
197197
*/
198198
public Timetable resolve(TripPattern pattern, @Nullable LocalDate serviceDate) {
199-
SortedSet<Timetable> sortedTimetables = timetables.get(pattern);
199+
SortedSet<Timetable> sortedTimetables = timetables.get(pattern.getId());
200200

201201
if (sortedTimetables != null && serviceDate != null) {
202202
for (Timetable timetable : sortedTimetables) {
@@ -390,7 +390,7 @@ public TimetableSnapshot commit(
390390
);
391391

392392
if (updatesEventListener != null) {
393-
updatesEventListener.update(dirtyTimetables.values(), timetables);
393+
updatesEventListener.update(dirtyTimetables.values(), timetables::get);
394394
}
395395

396396
this.dirtyTimetables.clear();
@@ -445,7 +445,7 @@ public boolean revertTripToScheduledTripPattern(FeedScopedId tripId, LocalDate s
445445
realTimeNewTripPatternsForModifiedTrips.remove(new TripIdAndServiceDate(tripId, serviceDate));
446446
// Remove times for the trip from any timetables
447447
// under that now-obsolete realtime-added pattern.
448-
SortedSet<Timetable> sortedTimetables = this.timetables.get(pattern);
448+
SortedSet<Timetable> sortedTimetables = this.timetables.get(pattern.getId());
449449
if (sortedTimetables != null) {
450450
TripTimes tripTimesToRemove = null;
451451
for (Timetable timetable : sortedTimetables) {
@@ -488,9 +488,9 @@ public boolean purgeExpiredData(LocalDate serviceDate) {
488488
validateNotReadOnly();
489489

490490
boolean modified = false;
491-
for (Iterator<TripPattern> it = timetables.keySet().iterator(); it.hasNext();) {
492-
TripPattern pattern = it.next();
493-
SortedSet<Timetable> sortedTimetables = timetables.get(pattern);
491+
for (Iterator<FeedScopedId> it = timetables.keySet().iterator(); it.hasNext();) {
492+
FeedScopedId patternId = it.next();
493+
SortedSet<Timetable> sortedTimetables = timetables.get(patternId);
494494
SortedSet<Timetable> toKeepTimetables = new TreeSet<>(new SortedTimetableComparator());
495495
for (Timetable timetable : sortedTimetables) {
496496
if (serviceDate.isBefore(timetable.getServiceDate())) {
@@ -503,7 +503,7 @@ public boolean purgeExpiredData(LocalDate serviceDate) {
503503
if (toKeepTimetables.isEmpty()) {
504504
it.remove();
505505
} else {
506-
timetables.put(pattern, ImmutableSortedSet.copyOfSorted(toKeepTimetables));
506+
timetables.put(patternId, ImmutableSortedSet.copyOfSorted(toKeepTimetables));
507507
}
508508
}
509509

@@ -557,7 +557,7 @@ public boolean isEmpty() {
557557
* @return true if the timetable changed as a result of the call
558558
*/
559559
private boolean clearTimetables(String feedId) {
560-
return timetables.keySet().removeIf(tripPattern -> feedId.equals(tripPattern.getFeedId()));
560+
return timetables.keySet().removeIf(id -> feedId.equals(id.getFeedId()));
561561
}
562562

563563
/**
@@ -617,7 +617,7 @@ private void addPatternToIndex(TripPattern tripPattern) {
617617
* The SortedSet is made immutable to prevent change after snapshot publication.
618618
*/
619619
private void swapTimetable(TripPattern pattern, Timetable original, Timetable updated) {
620-
SortedSet<Timetable> sortedTimetables = timetables.get(pattern);
620+
SortedSet<Timetable> sortedTimetables = timetables.get(pattern.getId());
621621
if (sortedTimetables == null) {
622622
sortedTimetables = new TreeSet<>(new SortedTimetableComparator());
623623
} else {
@@ -632,7 +632,7 @@ private void swapTimetable(TripPattern pattern, Timetable original, Timetable up
632632
sortedTimetables.remove(original);
633633
}
634634
sortedTimetables.add(updated);
635-
timetables.put(pattern, ImmutableSortedSet.copyOfSorted(sortedTimetables));
635+
timetables.put(pattern.getId(), ImmutableSortedSet.copyOfSorted(sortedTimetables));
636636

637637
// if the timetable was already modified by a previous real-time update in the same snapshot
638638
// and for the same service date,
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.opentripplanner.transit.model.timetable;
22

33
import java.util.Collection;
4-
import java.util.Map;
54
import java.util.SortedSet;
6-
import org.opentripplanner.transit.model.network.TripPattern;
5+
import java.util.function.Function;
6+
import org.opentripplanner.transit.model.framework.FeedScopedId;
77

88
/**
99
* When the {@link TimetableSnapshot} is updated and the commit method has completed this
@@ -13,6 +13,6 @@
1313
public interface TimetableSnapshotUpdateSucessListener {
1414
void update(
1515
Collection<Timetable> updatedTimetables,
16-
Map<TripPattern, SortedSet<Timetable>> timetables
16+
Function<FeedScopedId, SortedSet<Timetable>> timetables
1717
);
1818
}

application/src/test/java/org/opentripplanner/transit/model/TimetableRepositoryArchitectureTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import org.opentripplanner._support.arch.ArchComponent;
1717
import org.opentripplanner._support.arch.Package;
1818

19-
@Disabled
2019
public class TimetableRepositoryArchitectureTest {
2120

2221
private static final Package TRANSIT_FRAMEWORK = TRANSIT_MODEL.subPackage("framework");

application/src/test/java/org/opentripplanner/transit/model/timetable/TimetableSnapshotTest.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
import java.util.Map;
1717
import java.util.SortedSet;
1818
import java.util.concurrent.atomic.AtomicBoolean;
19+
import java.util.function.Function;
1920
import org.junit.jupiter.api.BeforeAll;
2021
import org.junit.jupiter.api.Test;
2122
import org.opentripplanner.ConstantsForTests;
2223
import org.opentripplanner.TestOtpModel;
2324
import org.opentripplanner._support.time.ZoneIds;
2425
import org.opentripplanner.model.StopTime;
25-
import org.opentripplanner.routing.algorithm.raptoradapter.transit.mappers.RealTimeRaptorTransitDataUpdater;
2626
import org.opentripplanner.transit.model.framework.Deduplicator;
2727
import org.opentripplanner.transit.model.framework.FeedScopedId;
2828
import org.opentripplanner.transit.model.network.TripPattern;
@@ -84,21 +84,18 @@ void testUniqueDirtyTimetablesAfterMultipleUpdates() {
8484

8585
AtomicBoolean updateIsCalled = new AtomicBoolean();
8686

87-
RealTimeRaptorTransitDataUpdater raptorTransitData = new RealTimeRaptorTransitDataUpdater(
88-
null
89-
) {
87+
var updateListener = new TimetableSnapshotUpdateSucessListener() {
9088
@Override
9189
public void update(
9290
Collection<Timetable> updatedTimetables,
93-
Map<TripPattern, SortedSet<Timetable>> timetables
91+
Function<FeedScopedId, SortedSet<Timetable>> timetableProvider
9492
) {
9593
updateIsCalled.set(true);
9694
assertThat(updatedTimetables).hasSize(1);
97-
assertThat(timetables).hasSize(1);
9895
}
9996
};
10097

101-
snapshot.commit(raptorTransitData, true);
98+
snapshot.commit(updateListener, true);
10299

103100
assertTrue(updateIsCalled.get());
104101
}

0 commit comments

Comments
 (0)