diff --git a/pom.xml b/pom.xml index 6f202b592f8..266bbf6ab61 100644 --- a/pom.xml +++ b/pom.xml @@ -690,6 +690,12 @@ ${junit.version} test + + com.google.truth + truth + 1.4.2 + test + com.tngtech.archunit archunit diff --git a/src/ext-test/java/org/opentripplanner/ext/geocoder/LuceneIndexTest.java b/src/ext-test/java/org/opentripplanner/ext/geocoder/LuceneIndexTest.java index cee6cf3a2d8..3e6c2b15195 100644 --- a/src/ext-test/java/org/opentripplanner/ext/geocoder/LuceneIndexTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/geocoder/LuceneIndexTest.java @@ -18,6 +18,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService; import org.opentripplanner.model.FeedInfo; import org.opentripplanner.transit.model._data.TransitModelForTest; import org.opentripplanner.transit.model.basic.TransitMode; @@ -160,8 +162,12 @@ public FeedInfo getFeedInfo(String feedId) { ); } }; - index = new LuceneIndex(transitService); - mapper = new StopClusterMapper(transitService); + var stopConsolidationService = new DefaultStopConsolidationService( + new DefaultStopConsolidationRepository(), + transitModel + ); + index = new LuceneIndex(transitService, stopConsolidationService); + mapper = new StopClusterMapper(transitService, stopConsolidationService); } @Test diff --git a/src/ext-test/java/org/opentripplanner/ext/geocoder/StopClusterMapperTest.java b/src/ext-test/java/org/opentripplanner/ext/geocoder/StopClusterMapperTest.java new file mode 100644 index 00000000000..578f7d4118f --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/geocoder/StopClusterMapperTest.java @@ -0,0 +1,57 @@ +package org.opentripplanner.ext.geocoder; + +import static com.google.common.truth.Truth.assertThat; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; +import org.opentripplanner.transit.model._data.TransitModelForTest; +import org.opentripplanner.transit.model.framework.Deduplicator; +import org.opentripplanner.transit.model.site.RegularStop; +import org.opentripplanner.transit.model.site.StopLocation; +import org.opentripplanner.transit.service.DefaultTransitService; +import org.opentripplanner.transit.service.StopModel; +import org.opentripplanner.transit.service.TransitModel; + +class StopClusterMapperTest { + + private static final TransitModelForTest TEST_MODEL = TransitModelForTest.of(); + private static final RegularStop STOP_A = TEST_MODEL.stop("A").build(); + private static final RegularStop STOP_B = TEST_MODEL.stop("B").build(); + private static final RegularStop STOP_C = TEST_MODEL.stop("C").build(); + private static final List STOPS = List.of(STOP_A, STOP_B, STOP_C); + private static final StopModel STOP_MODEL = TEST_MODEL + .stopModelBuilder() + .withRegularStops(STOPS) + .build(); + private static final TransitModel TRANSIT_MODEL = new TransitModel( + STOP_MODEL, + new Deduplicator() + ); + private static final List LOCATIONS = STOPS + .stream() + .map(StopLocation.class::cast) + .toList(); + + @Test + void clusterConsolidatedStops() { + var repo = new DefaultStopConsolidationRepository(); + repo.addGroups(List.of(new ConsolidatedStopGroup(STOP_A.getId(), List.of(STOP_B.getId())))); + + var service = new DefaultStopConsolidationService(repo, TRANSIT_MODEL); + var mapper = new StopClusterMapper(new DefaultTransitService(TRANSIT_MODEL), service); + + var clusters = mapper.generateStopClusters(LOCATIONS, List.of()); + + var expected = new LuceneStopCluster( + STOP_A.getId().toString(), + List.of(STOP_B.getId().toString()), + List.of(STOP_A.getName(), STOP_B.getName()), + List.of(STOP_A.getCode(), STOP_B.getCode()), + new StopCluster.Coordinate(STOP_A.getLat(), STOP_A.getLon()) + ); + assertThat(clusters).contains(expected); + } +} diff --git a/src/ext/java/org/opentripplanner/ext/geocoder/GeocoderResource.java b/src/ext/java/org/opentripplanner/ext/geocoder/GeocoderResource.java index f5d1f950632..304829843ae 100644 --- a/src/ext/java/org/opentripplanner/ext/geocoder/GeocoderResource.java +++ b/src/ext/java/org/opentripplanner/ext/geocoder/GeocoderResource.java @@ -25,10 +25,10 @@ @Produces(MediaType.APPLICATION_JSON) public class GeocoderResource { - private final OtpServerRequestContext serverContext; + private final LuceneIndex luceneIndex; public GeocoderResource(@Context OtpServerRequestContext requestContext) { - serverContext = requestContext; + luceneIndex = requestContext.lucenceIndex(); } /** @@ -71,7 +71,7 @@ public Response textSearch( @GET @Path("stopClusters") public Response stopClusters(@QueryParam("query") String query) { - var clusters = LuceneIndex.forServer(serverContext).queryStopClusters(query).toList(); + var clusters = luceneIndex.queryStopClusters(query).toList(); return Response.status(Response.Status.OK).entity(clusters).build(); } @@ -96,8 +96,7 @@ private List query( } private Collection queryStopLocations(String query, boolean autocomplete) { - return LuceneIndex - .forServer(serverContext) + return luceneIndex .queryStopLocations(query, autocomplete) .map(sl -> new SearchResult( @@ -111,8 +110,7 @@ private Collection queryStopLocations(String query, boolean autoco } private Collection queryStations(String query, boolean autocomplete) { - return LuceneIndex - .forServer(serverContext) + return luceneIndex .queryStopLocationGroups(query, autocomplete) .map(sc -> new SearchResult( diff --git a/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java b/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java index e0ea8ba36b9..fe7bef8ad13 100644 --- a/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java +++ b/src/ext/java/org/opentripplanner/ext/geocoder/LuceneIndex.java @@ -11,6 +11,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Stream; +import javax.annotation.Nullable; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.en.EnglishAnalyzer; import org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper; @@ -40,12 +41,14 @@ import org.apache.lucene.search.suggest.document.FuzzyCompletionQuery; import org.apache.lucene.search.suggest.document.SuggestIndexSearcher; import org.apache.lucene.store.ByteBuffersDirectory; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; import org.opentripplanner.framework.collection.ListUtils; import org.opentripplanner.framework.i18n.I18NString; -import org.opentripplanner.standalone.api.OtpServerRequestContext; import org.opentripplanner.transit.model.framework.FeedScopedId; import org.opentripplanner.transit.model.site.StopLocation; import org.opentripplanner.transit.model.site.StopLocationsGroup; +import org.opentripplanner.transit.service.DefaultTransitService; +import org.opentripplanner.transit.service.TransitModel; import org.opentripplanner.transit.service.TransitService; public class LuceneIndex implements Serializable { @@ -65,9 +68,24 @@ public class LuceneIndex implements Serializable { private final SuggestIndexSearcher searcher; private final StopClusterMapper stopClusterMapper; - public LuceneIndex(TransitService transitService) { + /** + * Since the {@link TransitService} is request scoped, we don't inject it into this class. + * However, we do need some methods in the service and that's why we instantiate it manually in this + * constructor. + */ + public LuceneIndex(TransitModel transitModel, StopConsolidationService stopConsolidationService) { + this(new DefaultTransitService(transitModel), stopConsolidationService); + } + + /** + * This method is only visible for testing. + */ + LuceneIndex( + TransitService transitService, + @Nullable StopConsolidationService stopConsolidationService + ) { this.transitService = transitService; - this.stopClusterMapper = new StopClusterMapper(transitService); + this.stopClusterMapper = new StopClusterMapper(transitService, stopConsolidationService); this.analyzer = new PerFieldAnalyzerWrapper( @@ -144,18 +162,6 @@ public LuceneIndex(TransitService transitService) { } } - public static synchronized LuceneIndex forServer(OtpServerRequestContext serverContext) { - var graph = serverContext.graph(); - var existingIndex = graph.getLuceneIndex(); - if (existingIndex != null) { - return existingIndex; - } - - var newIndex = new LuceneIndex(serverContext.transitService()); - graph.setLuceneIndex(newIndex); - return newIndex; - } - public Stream queryStopLocations(String query, boolean autocomplete) { return matchingDocuments(StopLocation.class, query, autocomplete) .map(document -> transitService.getStopLocation(FeedScopedId.parse(document.get(ID)))); @@ -252,6 +258,7 @@ private Stream matchingDocuments( String searchTerms, boolean autocomplete ) { + searchTerms = searchTerms.strip(); try { if (autocomplete) { var completionQuery = new FuzzyCompletionQuery( diff --git a/src/ext/java/org/opentripplanner/ext/geocoder/StopClusterMapper.java b/src/ext/java/org/opentripplanner/ext/geocoder/StopClusterMapper.java index d9f388ea0e8..98a617b809f 100644 --- a/src/ext/java/org/opentripplanner/ext/geocoder/StopClusterMapper.java +++ b/src/ext/java/org/opentripplanner/ext/geocoder/StopClusterMapper.java @@ -3,6 +3,7 @@ import static org.opentripplanner.ext.geocoder.StopCluster.LocationType.STATION; import static org.opentripplanner.ext.geocoder.StopCluster.LocationType.STOP; +import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.Iterables; import java.util.Collection; import java.util.List; @@ -10,6 +11,8 @@ import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.Nullable; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; +import org.opentripplanner.ext.stopconsolidation.model.StopReplacement; import org.opentripplanner.framework.collection.ListUtils; import org.opentripplanner.framework.geometry.WgsCoordinate; import org.opentripplanner.framework.i18n.I18NString; @@ -28,9 +31,14 @@ class StopClusterMapper { private final TransitService transitService; + private final StopConsolidationService stopConsolidationService; - StopClusterMapper(TransitService transitService) { + StopClusterMapper( + TransitService transitService, + @Nullable StopConsolidationService stopConsolidationService + ) { this.transitService = transitService; + this.stopConsolidationService = stopConsolidationService; } /** @@ -45,16 +53,71 @@ Iterable generateStopClusters( Collection stopLocations, Collection stopLocationsGroups ) { + var stopClusters = buildStopClusters(stopLocations); + var stationClusters = buildStationClusters(stopLocationsGroups); + var consolidatedStopClusters = buildConsolidatedStopClusters(); + + return Iterables.concat(stopClusters, stationClusters, consolidatedStopClusters); + } + + private Iterable buildConsolidatedStopClusters() { + var multiMap = stopConsolidationService + .replacements() + .stream() + .collect( + ImmutableListMultimap.toImmutableListMultimap( + StopReplacement::primary, + StopReplacement::secondary + ) + ); + return multiMap + .keySet() + .stream() + .map(primary -> { + var secondaryIds = multiMap.get(primary); + var secondaries = secondaryIds + .stream() + .map(transitService::getStopLocation) + .filter(Objects::nonNull) + .toList(); + var codes = ListUtils.combine( + ListUtils.ofNullable(primary.getCode()), + getCodes(secondaries) + ); + var names = ListUtils.combine( + ListUtils.ofNullable(primary.getName()), + getNames(secondaries) + ); + + return new LuceneStopCluster( + primary.getId().toString(), + secondaryIds.stream().map(id -> id.toString()).toList(), + names, + codes, + toCoordinate(primary.getCoordinate()) + ); + }) + .toList(); + } + + private static List buildStationClusters( + Collection stopLocationsGroups + ) { + return stopLocationsGroups.stream().map(StopClusterMapper::map).toList(); + } + + private List buildStopClusters(Collection stopLocations) { List stops = stopLocations .stream() // remove stop locations without a parent station .filter(sl -> sl.getParentStation() == null) + .filter(sl -> !stopConsolidationService.isPartOfConsolidatedStop(sl)) // stops without a name (for example flex areas) are useless for searching, so we remove them, too .filter(sl -> sl.getName() != null) .toList(); // if they are very close to each other and have the same name, only one is chosen (at random) - var deduplicatedStops = stops + return stops .stream() .collect( Collectors.groupingBy(sl -> @@ -66,9 +129,6 @@ Iterable generateStopClusters( .map(group -> map(group).orElse(null)) .filter(Objects::nonNull) .toList(); - var stations = stopLocationsGroups.stream().map(StopClusterMapper::map).toList(); - - return Iterables.concat(deduplicatedStops, stations); } private static LuceneStopCluster map(StopLocationsGroup g) { diff --git a/src/ext/java/org/opentripplanner/ext/geocoder/configure/GeocoderModule.java b/src/ext/java/org/opentripplanner/ext/geocoder/configure/GeocoderModule.java new file mode 100644 index 00000000000..9eaf6ade8e5 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/geocoder/configure/GeocoderModule.java @@ -0,0 +1,31 @@ +package org.opentripplanner.ext.geocoder.configure; + +import dagger.Module; +import dagger.Provides; +import jakarta.inject.Singleton; +import javax.annotation.Nullable; +import org.opentripplanner.ext.geocoder.LuceneIndex; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; +import org.opentripplanner.framework.application.OTPFeature; +import org.opentripplanner.transit.service.TransitModel; + +/** + * This module builds the Lucene geocoder based on whether the feature flag is on or off. + */ +@Module +public class GeocoderModule { + + @Provides + @Singleton + @Nullable + LuceneIndex luceneIndex( + TransitModel transitModel, + @Nullable StopConsolidationService stopConsolidationService + ) { + if (OTPFeature.SandboxAPIGeocoder.isOn()) { + return new LuceneIndex(transitModel, stopConsolidationService); + } else { + return null; + } + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java index 11ad4be69ff..68efe8744cc 100644 --- a/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java @@ -43,4 +43,6 @@ public interface StopConsolidationService { * For a given stop id return the primary stop if it is part of a consolidated stop group. */ Optional primaryStop(FeedScopedId id); + + boolean isPartOfConsolidatedStop(StopLocation sl); } diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java index 216489512f5..9f31e366be5 100644 --- a/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java @@ -67,6 +67,11 @@ public boolean isSecondaryStop(StopLocation stop) { return repo.groups().stream().anyMatch(r -> r.secondaries().contains(stop.getId())); } + @Override + public boolean isPartOfConsolidatedStop(StopLocation sl) { + return isSecondaryStop(sl) || isPrimaryStop(sl); + } + @Override public boolean isActive() { return !repo.groups().isEmpty(); diff --git a/src/main/java/org/opentripplanner/apis/APIEndpoints.java b/src/main/java/org/opentripplanner/apis/APIEndpoints.java index fe8db5b3911..b6ad08ea4d9 100644 --- a/src/main/java/org/opentripplanner/apis/APIEndpoints.java +++ b/src/main/java/org/opentripplanner/apis/APIEndpoints.java @@ -61,8 +61,6 @@ private APIEndpoints() { addIfEnabled(SandboxAPIMapboxVectorTilesApi, VectorTilesResource.class); addIfEnabled(SandboxAPIParkAndRideApi, ParkAndRideResource.class); addIfEnabled(SandboxAPIGeocoder, GeocoderResource.class); - // scheduled to be removed and only here for backwards compatibility - addIfEnabled(SandboxAPIGeocoder, GeocoderResource.GeocoderResourceOldPath.class); // scheduled to be removed addIfEnabled(APIBikeRental, BikeRental.class); diff --git a/src/main/java/org/opentripplanner/routing/graph/Graph.java b/src/main/java/org/opentripplanner/routing/graph/Graph.java index 4b6c9938317..926d524bad2 100644 --- a/src/main/java/org/opentripplanner/routing/graph/Graph.java +++ b/src/main/java/org/opentripplanner/routing/graph/Graph.java @@ -16,7 +16,6 @@ import javax.annotation.Nullable; import org.locationtech.jts.geom.Geometry; import org.opentripplanner.ext.dataoverlay.configuration.DataOverlayParameterBindings; -import org.opentripplanner.ext.geocoder.LuceneIndex; import org.opentripplanner.framework.geometry.CompactElevationProfile; import org.opentripplanner.framework.geometry.GeometryUtils; import org.opentripplanner.model.calendar.openinghours.OpeningHoursCalendarService; @@ -136,7 +135,6 @@ public class Graph implements Serializable { * creating the data overlay context when routing. */ public DataOverlayParameterBindings dataOverlayParameterBindings; - private LuceneIndex luceneIndex; @Inject public Graph( @@ -384,14 +382,6 @@ public void setFareService(FareService fareService) { this.fareService = fareService; } - public LuceneIndex getLuceneIndex() { - return luceneIndex; - } - - public void setLuceneIndex(LuceneIndex luceneIndex) { - this.luceneIndex = luceneIndex; - } - private void indexIfNotIndexed(StopModel stopModel) { if (streetIndex == null) { index(stopModel); diff --git a/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java b/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java index 6552d82770f..3a577611617 100644 --- a/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java +++ b/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java @@ -8,6 +8,7 @@ import org.opentripplanner.ext.dataoverlay.routing.DataOverlayContext; import org.opentripplanner.ext.emissions.EmissionsService; import org.opentripplanner.ext.flex.FlexParameters; +import org.opentripplanner.ext.geocoder.LuceneIndex; import org.opentripplanner.ext.ridehailing.RideHailingService; import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; import org.opentripplanner.framework.application.OTPFeature; @@ -136,4 +137,7 @@ default DataOverlayContext dataOverlayContext(RouteRequest request) { ) ); } + + @Nullable + LuceneIndex lucenceIndex(); } diff --git a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java index b1bc6888753..7259acb00c2 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java +++ b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java @@ -5,7 +5,6 @@ import org.opentripplanner.apis.transmodel.TransmodelAPI; import org.opentripplanner.datastore.api.DataSource; import org.opentripplanner.ext.emissions.EmissionsDataModel; -import org.opentripplanner.ext.geocoder.LuceneIndex; import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.framework.application.LogMDCSupport; import org.opentripplanner.framework.application.OTPFeature; @@ -180,8 +179,9 @@ private void setupTransitRoutingServer() { } if (OTPFeature.SandboxAPIGeocoder.isOn()) { - LOG.info("Creating debug client geocoder lucene index"); - LuceneIndex.forServer(createServerContext()); + LOG.info("Initializing geocoder"); + // eagerly initialize the geocoder + this.factory.luceneIndex(); } } diff --git a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java index fe95fe0447d..b307776ef52 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java +++ b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java @@ -6,6 +6,8 @@ import javax.annotation.Nullable; import org.opentripplanner.ext.emissions.EmissionsDataModel; import org.opentripplanner.ext.emissions.EmissionsServiceModule; +import org.opentripplanner.ext.geocoder.LuceneIndex; +import org.opentripplanner.ext.geocoder.configure.GeocoderModule; import org.opentripplanner.ext.interactivelauncher.configuration.InteractiveLauncherModule; import org.opentripplanner.ext.ridehailing.configure.RideHailingServicesModule; import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; @@ -56,6 +58,7 @@ StopConsolidationServiceModule.class, InteractiveLauncherModule.class, StreetLimitationParametersServiceModule.class, + GeocoderModule.class, } ) public interface ConstructApplicationFactory { @@ -87,6 +90,9 @@ public interface ConstructApplicationFactory { StreetLimitationParameters streetLimitationParameters(); + @Nullable + LuceneIndex luceneIndex(); + @Component.Builder interface Builder { @BindsInstance diff --git a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java index eb244ce726c..6c830054c49 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java +++ b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java @@ -7,6 +7,7 @@ import javax.annotation.Nullable; import org.opentripplanner.astar.spi.TraverseVisitor; import org.opentripplanner.ext.emissions.EmissionsService; +import org.opentripplanner.ext.geocoder.LuceneIndex; import org.opentripplanner.ext.interactivelauncher.api.LauncherRequestDecorator; import org.opentripplanner.ext.ridehailing.RideHailingService; import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; @@ -40,7 +41,8 @@ OtpServerRequestContext providesServerContext( StreetLimitationParametersService streetLimitationParametersService, @Nullable TraverseVisitor traverseVisitor, EmissionsService emissionsService, - LauncherRequestDecorator launcherRequestDecorator + LauncherRequestDecorator launcherRequestDecorator, + @Nullable LuceneIndex luceneIndex ) { var defaultRequest = launcherRequestDecorator.intercept(routerConfig.routingRequestDefaults()); @@ -60,7 +62,8 @@ OtpServerRequestContext providesServerContext( rideHailingServices, stopConsolidationService, streetLimitationParametersService, - traverseVisitor + traverseVisitor, + luceneIndex ); } diff --git a/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java b/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java index 7a4ccea9247..0e81193d787 100644 --- a/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java +++ b/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java @@ -7,6 +7,7 @@ import org.opentripplanner.astar.spi.TraverseVisitor; import org.opentripplanner.ext.emissions.EmissionsService; import org.opentripplanner.ext.flex.FlexParameters; +import org.opentripplanner.ext.geocoder.LuceneIndex; import org.opentripplanner.ext.ridehailing.RideHailingService; import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; import org.opentripplanner.inspector.raster.TileRendererManager; @@ -49,6 +50,7 @@ public class DefaultServerRequestContext implements OtpServerRequestContext { private final EmissionsService emissionsService; private final StopConsolidationService stopConsolidationService; private final StreetLimitationParametersService streetLimitationParametersService; + private final LuceneIndex luceneIndex; /** * Make sure all mutable components are copied/cloned before calling this constructor. @@ -70,7 +72,8 @@ private DefaultServerRequestContext( StopConsolidationService stopConsolidationService, StreetLimitationParametersService streetLimitationParametersService, FlexParameters flexParameters, - TraverseVisitor traverseVisitor + TraverseVisitor traverseVisitor, + @Nullable LuceneIndex luceneIndex ) { this.graph = graph; this.transitService = transitService; @@ -89,6 +92,7 @@ private DefaultServerRequestContext( this.emissionsService = emissionsService; this.stopConsolidationService = stopConsolidationService; this.streetLimitationParametersService = streetLimitationParametersService; + this.luceneIndex = luceneIndex; } /** @@ -110,7 +114,8 @@ public static DefaultServerRequestContext create( List rideHailingServices, @Nullable StopConsolidationService stopConsolidationService, StreetLimitationParametersService streetLimitationParametersService, - @Nullable TraverseVisitor traverseVisitor + @Nullable TraverseVisitor traverseVisitor, + @Nullable LuceneIndex luceneIndex ) { return new DefaultServerRequestContext( graph, @@ -129,7 +134,8 @@ public static DefaultServerRequestContext create( stopConsolidationService, streetLimitationParametersService, flexParameters, - traverseVisitor + traverseVisitor, + luceneIndex ); } @@ -235,6 +241,12 @@ public VectorTileConfig vectorTileConfig() { return vectorTileConfig; } + @Nullable + @Override + public LuceneIndex lucenceIndex() { + return luceneIndex; + } + @Override public EmissionsService emissionsService() { return emissionsService; diff --git a/src/test/java/org/opentripplanner/TestServerContext.java b/src/test/java/org/opentripplanner/TestServerContext.java index 2f4ded1121d..90dca6ff840 100644 --- a/src/test/java/org/opentripplanner/TestServerContext.java +++ b/src/test/java/org/opentripplanner/TestServerContext.java @@ -55,6 +55,7 @@ public static OtpServerRequestContext createServerContext( List.of(), null, createStreetLimitationParametersService(), + null, null ); creatTransitLayerForRaptor(transitModel, routerConfig.transitTuningConfig()); diff --git a/src/test/java/org/opentripplanner/apis/transmodel/mapping/TripRequestMapperTest.java b/src/test/java/org/opentripplanner/apis/transmodel/mapping/TripRequestMapperTest.java index de6b48c5ef4..14d608626b3 100644 --- a/src/test/java/org/opentripplanner/apis/transmodel/mapping/TripRequestMapperTest.java +++ b/src/test/java/org/opentripplanner/apis/transmodel/mapping/TripRequestMapperTest.java @@ -15,12 +15,10 @@ import io.micrometer.core.instrument.Metrics; import java.time.Duration; import java.time.LocalDate; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Optional; import java.util.function.Function; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; @@ -146,6 +144,7 @@ void setup() { List.of(), null, new DefaultStreetLimitationParametersService(new StreetLimitationParameters()), + null, null ), null, diff --git a/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java b/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java index e045f49c01d..85a33281f81 100644 --- a/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java +++ b/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java @@ -121,6 +121,7 @@ public SpeedTest( List.of(), null, TestServerContext.createStreetLimitationParametersService(), + null, null ); // Creating transitLayerForRaptor should be integrated into the TransitModel, but for now