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 extends SearchResult> 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