Skip to content

Commit

Permalink
Addresses comments in PR.
Browse files Browse the repository at this point in the history
Importantly this creates the CriteriaCollection type which allows for checking features about collections of criteria independently of the collection type.
  • Loading branch information
eibakke committed Nov 13, 2024
1 parent 7bc2721 commit 4902f37
Show file tree
Hide file tree
Showing 12 changed files with 250 additions and 134 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@
import org.opentripplanner.routing.graphfinder.PlaceAtDistance;
import org.opentripplanner.routing.graphfinder.PlaceType;
import org.opentripplanner.service.vehiclerental.model.VehicleRentalPlace;
import org.opentripplanner.transit.api.model.CriteriaCollection;
import org.opentripplanner.transit.api.request.TripRequest;
import org.opentripplanner.transit.api.request.TripRequestBuilder;
import org.opentripplanner.transit.model.basic.TransitMode;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.model.network.Route;
Expand Down Expand Up @@ -1302,19 +1302,28 @@ private GraphQLSchema create() {
.build()
)
.dataFetcher(environment -> {
var authorities = mapIDsToDomainNullSafe(environment.getArgument("authorities"));
var lineIds = mapIDsToDomainNullSafe(environment.getArgument("lines"));
var privateCodes = environment.<List<String>>getArgument("privateCodes");
var activeServiceDates = environment.<List<LocalDate>>getArgument("activeDates");
var authorities = CriteriaCollection.of(
mapIDsToDomainNullSafe(environment.getArgument("authorities"))
);
var lineIds = CriteriaCollection.of(
mapIDsToDomainNullSafe(environment.getArgument("lines"))
);
var privateCodes = CriteriaCollection.of(
environment.<List<String>>getArgument("privateCodes")
);
var activeServiceDates = CriteriaCollection.of(
environment.<List<LocalDate>>getArgument("activeDates")
);

TripRequestBuilder tripRequestBuilder = TripRequest
TripRequest tripRequest = TripRequest
.of()
.withAgencies(authorities)
.withRoutes(lineIds)
.withNetexInternalPlanningCodes(privateCodes)
.withServiceDates(activeServiceDates);
.withServiceDates(activeServiceDates)
.build();

return GqlUtil.getTransitService(environment).getTrips(tripRequestBuilder.build());
return GqlUtil.getTransitService(environment).getTrips(tripRequest);
})
.build()
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.opentripplanner.apis.transmodel.model.EnumTypes;
import org.opentripplanner.apis.transmodel.model.framework.TransmodelScalars;
import org.opentripplanner.apis.transmodel.support.GqlUtil;
import org.opentripplanner.transit.api.model.CriteriaCollection;
import org.opentripplanner.transit.api.request.TripOnServiceDateRequest;
import org.opentripplanner.transit.api.request.TripOnServiceDateRequestBuilder;
import org.opentripplanner.transit.model.framework.FeedScopedId;
Expand Down Expand Up @@ -96,13 +97,25 @@ public static GraphQLFieldDefinition createQuery(GraphQLOutputType datedServiceJ
// The null safety checks are not needed here - they are taken care of by the request
// object, but let's use the mapping method and leave this improvement until all APIs
// are pushing this check into the domain request.
var authorities = mapIDsToDomainNullSafe(environment.getArgument("authorities"));
var lines = mapIDsToDomainNullSafe(environment.getArgument("lines"));
var serviceJourneys = mapIDsToDomainNullSafe(environment.getArgument("serviceJourneys"));
var replacementFor = mapIDsToDomainNullSafe(environment.getArgument("replacementFor"));
var privateCodes = environment.<List<String>>getArgument("privateCodes");
var operatingDays = environment.<List<LocalDate>>getArgument("operatingDays");
var alterations = environment.<List<TripAlteration>>getArgument("alterations");
var authorities = CriteriaCollection.of(
mapIDsToDomainNullSafe(environment.getArgument("authorities"))
);
var lines = CriteriaCollection.of(mapIDsToDomainNullSafe(environment.getArgument("lines")));
var serviceJourneys = CriteriaCollection.of(
mapIDsToDomainNullSafe(environment.getArgument("serviceJourneys"))
);
var replacementFor = CriteriaCollection.of(
mapIDsToDomainNullSafe(environment.getArgument("replacementFor"))
);
var privateCodes = CriteriaCollection.of(
environment.<List<String>>getArgument("privateCodes")
);
var operatingDays = CriteriaCollection.of(
environment.<List<LocalDate>>getArgument("operatingDays")
);
var alterations = CriteriaCollection.of(
environment.<List<TripAlteration>>getArgument("alterations")
);

TripOnServiceDateRequestBuilder tripOnServiceDateRequestBuilder = TripOnServiceDateRequest
.of()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.opentripplanner.transit.api.model;

import com.beust.jcommander.internal.Nullable;
import java.util.Collection;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.service.TransitService;

/**
* CriteriaCollection is meant to be used when filtering results from {@link TransitService}.
* </p>
* This abstraction over the Collection type lets us keep filter specific functionality separate
* from interpretation of various states of a collection. For instance in which case the criteria
* should match all entities it's meant to filter.
* @param <E> - The type of the criteria. Typically, String or {@link FeedScopedId}.
*/
public class CriteriaCollection<E> {

private Collection<E> criteria;

CriteriaCollection(Collection<E> criteria) {
this.criteria = criteria;
}

public static <E> CriteriaCollection<E> of(@Nullable Collection<E> criteria) {
return new CriteriaCollection<>(criteria);
}

public static <E> CriteriaCollection<E> of(@Nullable CriteriaCollection<E> criteria) {
if (criteria == null) {
return new CriteriaCollection<>(null);
}
return criteria;
}

public boolean matchesAll() {
return criteria == null || criteria.isEmpty();
}

public Collection<E> values() {
return criteria;
}
}
Original file line number Diff line number Diff line change
@@ -1,78 +1,77 @@
package org.opentripplanner.transit.api.request;

import java.time.LocalDate;
import java.util.List;
import org.opentripplanner.transit.api.model.CriteriaCollection;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.model.timetable.TripAlteration;
import org.opentripplanner.transit.model.timetable.TripOnServiceDate;
import org.opentripplanner.utils.collection.ListUtils;

/**
* A request for trips on a specific service date.
*
* </p>
* This request is used to retrieve {@link TripOnServiceDate}s that match the provided criteria.
* At least one operatingDay must be provided.
*/
public class TripOnServiceDateRequest {

private final List<LocalDate> serviceDates;
private final List<FeedScopedId> agencies;
private final List<FeedScopedId> routes;
private final List<FeedScopedId> serviceJourneys;
private final List<FeedScopedId> replacementFor;
private final List<String> netexInternalPlanningCodes;
private final List<TripAlteration> alterations;
private final CriteriaCollection<LocalDate> serviceDates;
private final CriteriaCollection<FeedScopedId> agencies;
private final CriteriaCollection<FeedScopedId> routes;
private final CriteriaCollection<FeedScopedId> serviceJourneys;
private final CriteriaCollection<FeedScopedId> replacementFor;
private final CriteriaCollection<String> netexInternalPlanningCodes;
private final CriteriaCollection<TripAlteration> alterations;

protected TripOnServiceDateRequest(
List<LocalDate> serviceDates,
List<FeedScopedId> agencies,
List<FeedScopedId> routes,
List<FeedScopedId> serviceJourneys,
List<FeedScopedId> replacementFor,
List<String> netexInternalPlanningCodes,
List<TripAlteration> alterations
CriteriaCollection<LocalDate> serviceDates,
CriteriaCollection<FeedScopedId> agencies,
CriteriaCollection<FeedScopedId> routes,
CriteriaCollection<FeedScopedId> serviceJourneys,
CriteriaCollection<FeedScopedId> replacementFor,
CriteriaCollection<String> netexInternalPlanningCodes,
CriteriaCollection<TripAlteration> alterations
) {
if (serviceDates == null || serviceDates.isEmpty()) {
if (serviceDates.values() == null || serviceDates.values().isEmpty()) {
throw new IllegalArgumentException("operatingDays must have at least one date");
}
this.serviceDates = ListUtils.nullSafeImmutableList(serviceDates);
this.agencies = ListUtils.nullSafeImmutableList(agencies);
this.routes = ListUtils.nullSafeImmutableList(routes);
this.serviceJourneys = ListUtils.nullSafeImmutableList(serviceJourneys);
this.replacementFor = ListUtils.nullSafeImmutableList(replacementFor);
this.netexInternalPlanningCodes = ListUtils.nullSafeImmutableList(netexInternalPlanningCodes);
this.alterations = ListUtils.nullSafeImmutableList(alterations);
this.serviceDates = CriteriaCollection.of(serviceDates);
this.agencies = CriteriaCollection.of(agencies);
this.routes = CriteriaCollection.of(routes);
this.serviceJourneys = CriteriaCollection.of(serviceJourneys);
this.replacementFor = CriteriaCollection.of(replacementFor);
this.netexInternalPlanningCodes = CriteriaCollection.of(netexInternalPlanningCodes);
this.alterations = CriteriaCollection.of(alterations);
}

public static TripOnServiceDateRequestBuilder of() {
return new TripOnServiceDateRequestBuilder();
}

public List<FeedScopedId> agencies() {
public CriteriaCollection<FeedScopedId> agencies() {
return agencies;
}

public List<FeedScopedId> routes() {
public CriteriaCollection<FeedScopedId> routes() {
return routes;
}

public List<FeedScopedId> serviceJourneys() {
public CriteriaCollection<FeedScopedId> serviceJourneys() {
return serviceJourneys;
}

public List<FeedScopedId> replacementFor() {
public CriteriaCollection<FeedScopedId> replacementFor() {
return replacementFor;
}

public List<String> netexInternalPlanningCodes() {
public CriteriaCollection<String> netexInternalPlanningCodes() {
return netexInternalPlanningCodes;
}

public List<TripAlteration> alterations() {
public CriteriaCollection<TripAlteration> alterations() {
return alterations;
}

public List<LocalDate> serviceDates() {
public CriteriaCollection<LocalDate> serviceDates() {
return serviceDates;
}
}
Original file line number Diff line number Diff line change
@@ -1,55 +1,63 @@
package org.opentripplanner.transit.api.request;

import java.time.LocalDate;
import java.util.List;
import org.opentripplanner.transit.api.model.CriteriaCollection;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.model.timetable.TripAlteration;

public class TripOnServiceDateRequestBuilder {

private List<FeedScopedId> agencies;
private List<FeedScopedId> routes;
private List<FeedScopedId> serviceJourneys;
private List<FeedScopedId> replacementFor;
private List<String> netexInternalPlanningCodes;
private List<TripAlteration> alterations;
private List<LocalDate> serviceDates;
private CriteriaCollection<FeedScopedId> agencies;
private CriteriaCollection<FeedScopedId> routes;
private CriteriaCollection<FeedScopedId> serviceJourneys;
private CriteriaCollection<FeedScopedId> replacementFor;
private CriteriaCollection<String> netexInternalPlanningCodes;
private CriteriaCollection<TripAlteration> alterations;
private CriteriaCollection<LocalDate> serviceDates;

protected TripOnServiceDateRequestBuilder() {}

public TripOnServiceDateRequestBuilder withServiceDates(List<LocalDate> serviceDates) {
public TripOnServiceDateRequestBuilder withServiceDates(
CriteriaCollection<LocalDate> serviceDates
) {
this.serviceDates = serviceDates;
return this;
}

public TripOnServiceDateRequestBuilder withAgencies(List<FeedScopedId> agencies) {
public TripOnServiceDateRequestBuilder withAgencies(CriteriaCollection<FeedScopedId> agencies) {
this.agencies = agencies;
return this;
}

public TripOnServiceDateRequestBuilder withRoutes(List<FeedScopedId> routes) {
public TripOnServiceDateRequestBuilder withRoutes(CriteriaCollection<FeedScopedId> routes) {
this.routes = routes;
return this;
}

public TripOnServiceDateRequestBuilder withServiceJourneys(List<FeedScopedId> serviceJourneys) {
public TripOnServiceDateRequestBuilder withServiceJourneys(
CriteriaCollection<FeedScopedId> serviceJourneys
) {
this.serviceJourneys = serviceJourneys;
return this;
}

public TripOnServiceDateRequestBuilder withReplacementFor(List<FeedScopedId> replacementFor) {
public TripOnServiceDateRequestBuilder withReplacementFor(
CriteriaCollection<FeedScopedId> replacementFor
) {
this.replacementFor = replacementFor;
return this;
}

public TripOnServiceDateRequestBuilder withNetexInternalPlanningCodes(
List<String> netexInternalPlanningCodes
CriteriaCollection<String> netexInternalPlanningCodes
) {
this.netexInternalPlanningCodes = netexInternalPlanningCodes;
return this;
}

public TripOnServiceDateRequestBuilder withAlterations(List<TripAlteration> alterations) {
public TripOnServiceDateRequestBuilder withAlterations(
CriteriaCollection<TripAlteration> alterations
) {
this.alterations = alterations;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,52 +1,51 @@
package org.opentripplanner.transit.api.request;

import java.time.LocalDate;
import java.util.List;
import org.opentripplanner.transit.api.model.CriteriaCollection;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.opentripplanner.transit.model.timetable.Trip;
import org.opentripplanner.utils.collection.ListUtils;

/**
* A request for {@link Trip}s.
*
* </p>
* This request is used to retrieve {@link Trip}s that match the provided criteria.
*/
public class TripRequest {

private final List<FeedScopedId> agencies;
private final List<FeedScopedId> routes;
private final List<String> netexInternalPlanningCodes;
private final List<LocalDate> serviceDates;
private final CriteriaCollection<FeedScopedId> agencies;
private final CriteriaCollection<FeedScopedId> routes;
private final CriteriaCollection<String> netexInternalPlanningCodes;
private final CriteriaCollection<LocalDate> serviceDates;

protected TripRequest(
List<FeedScopedId> agencies,
List<FeedScopedId> routes,
List<String> netexInternalPlanningCodes,
List<LocalDate> serviceDates
CriteriaCollection<FeedScopedId> agencies,
CriteriaCollection<FeedScopedId> routes,
CriteriaCollection<String> netexInternalPlanningCodes,
CriteriaCollection<LocalDate> serviceDates
) {
this.agencies = ListUtils.nullSafeImmutableList(agencies);
this.routes = ListUtils.nullSafeImmutableList(routes);
this.netexInternalPlanningCodes = ListUtils.nullSafeImmutableList(netexInternalPlanningCodes);
this.serviceDates = ListUtils.nullSafeImmutableList(serviceDates);
this.agencies = CriteriaCollection.of(agencies);
this.routes = CriteriaCollection.of(routes);
this.netexInternalPlanningCodes = CriteriaCollection.of(netexInternalPlanningCodes);
this.serviceDates = CriteriaCollection.of(serviceDates);
}

public static TripRequestBuilder of() {
return new TripRequestBuilder();
}

public List<FeedScopedId> agencies() {
public CriteriaCollection<FeedScopedId> agencies() {
return agencies;
}

public List<FeedScopedId> routes() {
public CriteriaCollection<FeedScopedId> routes() {
return routes;
}

public List<String> netexInternalPlanningCodes() {
public CriteriaCollection<String> netexInternalPlanningCodes() {
return netexInternalPlanningCodes;
}

public List<LocalDate> serviceDates() {
public CriteriaCollection<LocalDate> serviceDates() {
return serviceDates;
}
}
Loading

0 comments on commit 4902f37

Please sign in to comment.