Skip to content

Commit fa60b78

Browse files
authored
Merge pull request #5973 from entur/encapsulate_transit_model_index
Encapsulate transit model index
2 parents b9813cf + fc53d94 commit fa60b78

File tree

20 files changed

+176
-140
lines changed

20 files changed

+176
-140
lines changed

src/ext-test/java/org/opentripplanner/ext/siri/AddedTripBuilderTest.java

+10-17
Original file line numberDiff line numberDiff line change
@@ -154,37 +154,33 @@ void testAddedTrip() {
154154
assertEquals(SubMode.of(SUB_MODE), route.getNetexSubmode(), "submode should be mapped");
155155
assertNotEquals(REPLACED_ROUTE, route, "Should not re-use replaced route");
156156

157-
// Assert transit model index
158-
var transitModelIndex = TRANSIT_MODEL.getTransitModelIndex();
159-
assertNotNull(transitModelIndex);
160157
assertEquals(
161158
route,
162-
transitModelIndex.getRouteForId(TransitModelForTest.id(LINE_REF)),
159+
transitService.getRouteForId(TransitModelForTest.id(LINE_REF)),
163160
"Route should be added to transit index"
164161
);
165162
assertEquals(
166163
trip,
167-
transitModelIndex.getTripForId().get(TRIP_ID),
164+
transitService.getTripForId(TRIP_ID),
168165
"Route should be added to transit index"
169166
);
170-
var pattern = transitModelIndex.getPatternForTrip().get(trip);
167+
var pattern = transitService.getPatternForTrip(trip);
171168
assertNotNull(pattern);
172169
assertEquals(route, pattern.getRoute());
173170
assertTrue(
174-
transitModelIndex
175-
.getServiceCodesRunningForDate()
176-
.get(SERVICE_DATE)
171+
transitService
172+
.getServiceCodesRunningForDate(SERVICE_DATE)
177173
.contains(TRANSIT_MODEL.getServiceCodes().get(trip.getServiceId())),
178174
"serviceId should be running on service date"
179175
);
180176
assertNotNull(
181-
transitModelIndex.getTripOnServiceDateById().get(TRIP_ID),
177+
transitService.getTripOnServiceDateById(TRIP_ID),
182178
"TripOnServiceDate should be added to transit index by id"
183179
);
184180
assertNotNull(
185-
transitModelIndex
186-
.getTripOnServiceDateForTripAndDay()
187-
.get(new TripIdAndServiceDate(TRIP_ID, SERVICE_DATE)),
181+
transitService.getTripOnServiceDateForTripAndDay(
182+
new TripIdAndServiceDate(TRIP_ID, SERVICE_DATE)
183+
),
188184
"TripOnServiceDate should be added to transit index for trip and day"
189185
);
190186

@@ -299,10 +295,7 @@ void testAddedTripOnAddedRoute() {
299295
Route route = secondTrip.getRoute();
300296
assertSame(firstTrip.getRoute(), route, "route be reused from the first trip");
301297

302-
// Assert transit model index
303-
var transitModelIndex = TRANSIT_MODEL.getTransitModelIndex();
304-
assertNotNull(transitModelIndex);
305-
assertEquals(2, transitModelIndex.getPatternsForRoute().get(route).size());
298+
assertEquals(2, transitService.getPatternsForRoute(route).size());
306299

307300
// Assert trip times
308301
var times = secondAddedTrip.successValue().tripTimes();

src/main/java/org/opentripplanner/graph_builder/module/DirectTransferGenerator.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ public DirectTransferGenerator(
6767
@Override
6868
public void buildGraph() {
6969
/* Initialize transit model index which is needed by the nearby stop finder. */
70-
if (transitModel.getTransitModelIndex() == null) {
71-
transitModel.index();
72-
}
70+
transitModel.index();
7371

7472
/* The linker will use streets if they are available, or straight-line distance otherwise. */
7573
NearbyStopFinder nearbyStopFinder = createNearbyStopFinder();

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import org.opentripplanner.routing.algorithm.raptoradapter.transit.Transfer;
77
import org.opentripplanner.transit.model.site.RegularStop;
88
import org.opentripplanner.transit.service.StopModel;
9-
import org.opentripplanner.transit.service.TransitModel;
9+
import org.opentripplanner.transit.service.TransitService;
1010

1111
class TransfersMapper {
1212

1313
/**
1414
* Copy pre-calculated transfers from the original graph
1515
* @return a list where each element is a list of transfers for the corresponding stop index
1616
*/
17-
static List<List<Transfer>> mapTransfers(StopModel stopModel, TransitModel transitModel) {
17+
static List<List<Transfer>> mapTransfers(StopModel stopModel, TransitService transitService) {
1818
List<List<Transfer>> transferByStopIndex = new ArrayList<>();
1919

2020
for (int i = 0; i < stopModel.stopIndexSize(); ++i) {
@@ -26,7 +26,7 @@ static List<List<Transfer>> mapTransfers(StopModel stopModel, TransitModel trans
2626

2727
ArrayList<Transfer> list = new ArrayList<>();
2828

29-
for (PathTransfer pathTransfer : transitModel.getTransfersByStop(stop)) {
29+
for (PathTransfer pathTransfer : transitService.getTransfersByStop(stop)) {
3030
if (pathTransfer.to instanceof RegularStop) {
3131
int toStopIndex = pathTransfer.to.getIndex();
3232
Transfer newTransfer;

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

+13-13
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
import org.opentripplanner.transit.model.network.TripPattern;
2828
import org.opentripplanner.transit.model.site.StopTransferPriority;
2929
import org.opentripplanner.transit.model.timetable.TripTimes;
30+
import org.opentripplanner.transit.service.DefaultTransitService;
3031
import org.opentripplanner.transit.service.StopModel;
3132
import org.opentripplanner.transit.service.TransitModel;
33+
import org.opentripplanner.transit.service.TransitService;
3234
import org.slf4j.Logger;
3335
import org.slf4j.LoggerFactory;
3436

@@ -47,10 +49,12 @@ public class TransitLayerMapper {
4749

4850
private static final Logger LOG = LoggerFactory.getLogger(TransitLayerMapper.class);
4951

50-
private final TransitModel transitModel;
52+
private final TransitService transitService;
53+
private final StopModel stopModel;
5154

5255
private TransitLayerMapper(TransitModel transitModel) {
53-
this.transitModel = transitModel;
56+
this.transitService = new DefaultTransitService(transitModel);
57+
this.stopModel = transitModel.getStopModel();
5458
}
5559

5660
public static TransitLayer map(
@@ -74,20 +78,19 @@ private TransitLayer map(TransitTuningParameters tuningParameters) {
7478
HashMap<LocalDate, List<TripPatternForDate>> tripPatternsByStopByDate;
7579
List<List<Transfer>> transferByStopIndex;
7680
ConstrainedTransfersForPatterns constrainedTransfers = null;
77-
StopModel stopModel = transitModel.getStopModel();
7881

7982
LOG.info("Mapping transitLayer from TransitModel...");
8083

81-
Collection<TripPattern> allTripPatterns = transitModel.getAllTripPatterns();
84+
Collection<TripPattern> allTripPatterns = transitService.getAllTripPatterns();
8285

8386
tripPatternsByStopByDate = mapTripPatterns(allTripPatterns);
8487

85-
transferByStopIndex = mapTransfers(stopModel, transitModel);
88+
transferByStopIndex = mapTransfers(stopModel, transitService);
8689

8790
TransferIndexGenerator transferIndexGenerator = null;
8891
if (OTPFeature.TransferConstraints.isOn()) {
8992
transferIndexGenerator =
90-
new TransferIndexGenerator(transitModel.getTransferService().listAll(), allTripPatterns);
93+
new TransferIndexGenerator(transitService.getTransferService().listAll(), allTripPatterns);
9194
constrainedTransfers = transferIndexGenerator.generateTransfers();
9295
}
9396

@@ -98,9 +101,9 @@ private TransitLayer map(TransitTuningParameters tuningParameters) {
98101
return new TransitLayer(
99102
tripPatternsByStopByDate,
100103
transferByStopIndex,
101-
transitModel.getTransferService(),
104+
transitService.getTransferService(),
102105
stopModel,
103-
transitModel.getTimeZone(),
106+
transitService.getTimeZone(),
104107
transferCache,
105108
constrainedTransfers,
106109
transferIndexGenerator,
@@ -118,13 +121,10 @@ private HashMap<LocalDate, List<TripPatternForDate>> mapTripPatterns(
118121
Collection<TripPattern> allTripPatterns
119122
) {
120123
TripPatternForDateMapper tripPatternForDateMapper = new TripPatternForDateMapper(
121-
transitModel.getTransitModelIndex().getServiceCodesRunningForDate()
124+
transitService.getServiceCodesRunningForDate()
122125
);
123126

124-
Set<LocalDate> allServiceDates = transitModel
125-
.getTransitModelIndex()
126-
.getServiceCodesRunningForDate()
127-
.keySet();
127+
Set<LocalDate> allServiceDates = transitService.getAllServiceCodes();
128128

129129
List<TripPatternForDate> tripPatternForDates = Collections.synchronizedList(new ArrayList<>());
130130

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

+8-15
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.google.common.collect.HashMultimap;
44
import com.google.common.collect.SetMultimap;
5-
import gnu.trove.set.TIntSet;
65
import java.time.LocalDate;
76
import java.util.ArrayList;
87
import java.util.Collection;
@@ -20,7 +19,7 @@
2019
import org.opentripplanner.transit.model.network.TripPattern;
2120
import org.opentripplanner.transit.model.timetable.TripIdAndServiceDate;
2221
import org.opentripplanner.transit.model.timetable.TripTimes;
23-
import org.opentripplanner.transit.service.TransitModel;
22+
import org.opentripplanner.transit.service.TransitEditorService;
2423
import org.slf4j.Logger;
2524
import org.slf4j.LoggerFactory;
2625

@@ -40,9 +39,7 @@ public class TransitLayerUpdater {
4039

4140
private static final Logger LOG = LoggerFactory.getLogger(TransitLayerUpdater.class);
4241

43-
private final TransitModel transitModel;
44-
45-
private final Map<LocalDate, TIntSet> serviceCodesRunningForDate;
42+
private final TransitEditorService transitService;
4643

4744
/**
4845
* Cache the TripPatternForDates indexed on the original TripPatterns in order to avoid this
@@ -58,31 +55,27 @@ public class TransitLayerUpdater {
5855

5956
private final Map<LocalDate, Set<TripPatternForDate>> tripPatternsRunningOnDateMapCache = new HashMap<>();
6057

61-
public TransitLayerUpdater(
62-
TransitModel transitModel,
63-
Map<LocalDate, TIntSet> serviceCodesRunningForDate
64-
) {
65-
this.transitModel = transitModel;
66-
this.serviceCodesRunningForDate = serviceCodesRunningForDate;
58+
public TransitLayerUpdater(TransitEditorService transitService) {
59+
this.transitService = transitService;
6760
}
6861

6962
public void update(
7063
Set<Timetable> updatedTimetables,
7164
Map<TripPattern, SortedSet<Timetable>> timetables
7265
) {
73-
if (!transitModel.hasRealtimeTransitLayer()) {
66+
if (!transitService.hasRealtimeTransitLayer()) {
7467
return;
7568
}
7669

7770
long startTime = System.currentTimeMillis();
7871

7972
// Make a shallow copy of the realtime transit layer. Only the objects that are copied will be
8073
// changed during this update process.
81-
TransitLayer realtimeTransitLayer = new TransitLayer(transitModel.getRealtimeTransitLayer());
74+
TransitLayer realtimeTransitLayer = new TransitLayer(transitService.getRealtimeTransitLayer());
8275

8376
// Instantiate a TripPatternForDateMapper with the new TripPattern mappings
8477
TripPatternForDateMapper tripPatternForDateMapper = new TripPatternForDateMapper(
85-
serviceCodesRunningForDate
78+
transitService.getServiceCodesRunningForDate()
8679
);
8780

8881
Set<LocalDate> datesToBeUpdated = new HashSet<>();
@@ -229,7 +222,7 @@ public void update(
229222

230223
// Switch out the reference with the updated realtimeTransitLayer. This is synchronized to
231224
// guarantee that the reference is set after all the fields have been updated.
232-
transitModel.setRealtimeTransitLayer(realtimeTransitLayer);
225+
transitService.setRealtimeTransitLayer(realtimeTransitLayer);
233226

234227
LOG.debug(
235228
"UPDATING {} tripPatterns took {} ms",

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class TripPatternForDateMapper {
4141
* @param serviceCodesRunningForDate - READ ONLY
4242
*/
4343
TripPatternForDateMapper(Map<LocalDate, TIntSet> serviceCodesRunningForDate) {
44-
this.serviceCodesRunningForDate = Collections.unmodifiableMap(serviceCodesRunningForDate);
44+
this.serviceCodesRunningForDate = serviceCodesRunningForDate;
4545
}
4646

4747
/**

src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.opentripplanner.standalone.server.OTPWebApplication;
3434
import org.opentripplanner.street.model.StreetLimitationParameters;
3535
import org.opentripplanner.street.model.elevation.ElevationUtils;
36+
import org.opentripplanner.transit.service.DefaultTransitService;
3637
import org.opentripplanner.transit.service.TransitModel;
3738
import org.opentripplanner.updater.configure.UpdaterConfigurator;
3839
import org.opentripplanner.visualizer.GraphVisualizer;
@@ -202,7 +203,7 @@ public static void creatTransitLayerForRaptor(
202203
TransitModel transitModel,
203204
TransitTuningParameters tuningParameters
204205
) {
205-
if (!transitModel.hasTransit() || transitModel.getTransitModelIndex() == null) {
206+
if (!transitModel.hasTransit() || !transitModel.isIndexed()) {
206207
LOG.warn(
207208
"Cannot create Raptor data, that requires the graph to have transit data and be indexed."
208209
);
@@ -211,10 +212,7 @@ public static void creatTransitLayerForRaptor(
211212
transitModel.setTransitLayer(TransitLayerMapper.map(tuningParameters, transitModel));
212213
transitModel.setRealtimeTransitLayer(new TransitLayer(transitModel.getTransitLayer()));
213214
transitModel.setTransitLayerUpdater(
214-
new TransitLayerUpdater(
215-
transitModel,
216-
transitModel.getTransitModelIndex().getServiceCodesRunningForDate()
217-
)
215+
new TransitLayerUpdater(new DefaultTransitService(transitModel))
218216
);
219217
}
220218

src/main/java/org/opentripplanner/transit/service/DefaultTransitService.java

+21
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.time.ZoneId;
1010
import java.time.ZonedDateTime;
1111
import java.util.Collection;
12+
import java.util.Collections;
1213
import java.util.HashSet;
1314
import java.util.List;
1415
import java.util.Map;
@@ -594,6 +595,16 @@ public void setTransitLayer(TransitLayer transitLayer) {
594595
this.transitModel.setTransitLayer(transitLayer);
595596
}
596597

598+
@Override
599+
public void setRealtimeTransitLayer(TransitLayer realtimeTransitLayer) {
600+
transitModel.setRealtimeTransitLayer(realtimeTransitLayer);
601+
}
602+
603+
@Override
604+
public boolean hasRealtimeTransitLayer() {
605+
return transitModel.hasRealtimeTransitLayer();
606+
}
607+
597608
@Override
598609
public CalendarService getCalendarService() {
599610
return this.transitModel.getCalendarService();
@@ -659,6 +670,16 @@ public Deduplicator getDeduplicator() {
659670
return transitModel.getDeduplicator();
660671
}
661672

673+
@Override
674+
public Set<LocalDate> getAllServiceCodes() {
675+
return Collections.unmodifiableSet(transitModelIndex.getServiceCodesRunningForDate().keySet());
676+
}
677+
678+
@Override
679+
public Map<LocalDate, TIntSet> getServiceCodesRunningForDate() {
680+
return Collections.unmodifiableMap(transitModelIndex.getServiceCodesRunningForDate());
681+
}
682+
662683
/**
663684
* For each pattern visiting this {@link StopLocation} return its {@link TransitMode}
664685
*/

src/main/java/org/opentripplanner/transit/service/TransitEditorService.java

+17
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,22 @@ void addTripOnServiceDateForTripAndDay(
3939

4040
FeedScopedId getOrCreateServiceIdForDate(LocalDate serviceDate);
4141

42+
/**
43+
* Set the original, immutable, transit layer,
44+
* based on scheduled data (not real-time data).
45+
*/
4246
void setTransitLayer(TransitLayer transitLayer);
47+
48+
/**
49+
* Return true if a real-time transit layer is present.
50+
* The real-time transit layer is optional,
51+
* it is present only when real-time updaters are configured.
52+
*/
53+
boolean hasRealtimeTransitLayer();
54+
55+
/**
56+
* Publish the latest snapshot of the real-time transit layer.
57+
* Should be called only when creating a new TransitLayer, from the graph writer thread.
58+
*/
59+
void setRealtimeTransitLayer(TransitLayer realtimeTransitLayer);
4360
}

src/main/java/org/opentripplanner/transit/service/TransitModel.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -539,10 +539,15 @@ public void setHasScheduledService(boolean hasScheduledService) {
539539
* The caller is responsible for calling the {@link #index()} method if it is a
540540
* possibility that the index is not initialized (during graph build).
541541
*/
542-
public @Nullable TransitModelIndex getTransitModelIndex() {
542+
@Nullable
543+
TransitModelIndex getTransitModelIndex() {
543544
return index;
544545
}
545546

547+
public boolean isIndexed() {
548+
return index != null;
549+
}
550+
546551
public boolean hasFlexTrips() {
547552
return !flexTripsById.isEmpty();
548553
}

0 commit comments

Comments
 (0)