Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adapt to new, de-normalised flex location groups #227

Merged
merged 4 commits into from
Feb 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ public Collection<LocationGroupElement> getAllLocationGroupElements() {
LocationGroupElement locationGroupElement = new LocationGroupElement();
locationGroupElement.setLocationGroupId(group.getId());
locationGroupElement.setName(group.getName());
locationGroupElement.setLocation(stopLocation);
locationGroupElement.setStop(stopLocation);
return locationGroupElement;
})).collect(Collectors.toList());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,29 @@
*/
package org.onebusaway.gtfs.model;

import java.util.HashSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.onebusaway.csv_entities.schema.annotations.CsvField;
import org.onebusaway.csv_entities.schema.annotations.CsvFields;
import org.onebusaway.gtfs.serialization.mappings.DefaultAgencyIdFieldMappingFactory;

@CsvFields(filename = "location_groups.txt", required = false)
public class LocationGroup extends IdentityBean<AgencyAndId> implements StopLocation {
private static final long serialVersionUID = 1L;

@CsvField(name = "location_group_id", mapping = DefaultAgencyIdFieldMappingFactory.class)
private AgencyAndId id;

private Set<StopLocation> locations = new HashSet<>();

@CsvField(name = "location_group_name")
private String name;

// we use a List, not Set to keep the insertion order. by definition these stops don't have an
// order but it's nice for clients to not randomly change it.
@CsvField(ignore = true)
private List<StopLocation> stops = new ArrayList<>();

@Override
public AgencyAndId getId() {
return id;
Expand All @@ -36,23 +47,22 @@ public void setId(AgencyAndId id) {
this.id = id;
}

public Set<StopLocation> getLocations() {
return locations;
public String getName() {
return name;
}

private void setLocations(Set<StopLocation> locations) {
this.locations = locations;
public void setName(String name) {
this.name = name;
}

public void addLocation(StopLocation location) {
this.locations.add(location);
public void addLocation(StopLocation stop) {
stops.add(stop);
}

public String getName() {
return name;
public void setLocations(Collection<StopLocation> stop) {
stops.addAll(stop);
}

public void setName(String name) {
this.name = name;
public Set<StopLocation> getLocations() {
return Set.copyOf(stops);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,18 @@
import org.onebusaway.gtfs.serialization.mappings.DefaultAgencyIdFieldMappingFactory;
import org.onebusaway.gtfs.serialization.mappings.StopLocationFieldMappingFactory;

@CsvFields(filename = "location_groups.txt", required = false, prefix = "location_group_")
@CsvFields(filename = "location_group_stops.txt", required = false, prefix = "location_group_")
public class LocationGroupElement extends IdentityBean<Integer> {

private static final long serialVersionUID = 1L;

@CsvField(ignore = true)
private int id;

@CsvField(name = "location_group_id", mapping = DefaultAgencyIdFieldMappingFactory.class)
private AgencyAndId locationGroupId;

@CsvField(name = "stop_id", mapping = StopLocationFieldMappingFactory.class)
private StopLocation location;
private StopLocation stop;

@CsvField(optional = true)
private String name;
Expand All @@ -54,12 +53,12 @@ public void setLocationGroupId(AgencyAndId locationGroupId) {
this.locationGroupId = locationGroupId;
}

public StopLocation getLocation() {
return location;
public StopLocation getStop() {
return stop;
}

public void setLocation(StopLocation location) {
this.location = location;
public void setStop(StopLocation stop) {
this.stop = stop;
}

public String getName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public static List<Class<?>> getEntityClasses() {
entityClasses.add(Level.class);
entityClasses.add(Stop.class);
entityClasses.add(StopAreaElement.class);
entityClasses.add(LocationGroup.class);
entityClasses.add(LocationGroupElement.class);
entityClasses.add(Trip.class);
entityClasses.add(Note.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ public GtfsReader() {
_entityClasses.add(Level.class);
_entityClasses.add(Stop.class);
_entityClasses.add(Location.class);
_entityClasses.add(LocationGroup.class);
_entityClasses.add(LocationGroupElement.class);
_entityClasses.add(Trip.class);
_entityClasses.add(StopAreaElement.class);
Expand Down Expand Up @@ -360,16 +361,13 @@ public void handleEntity(Object entity) {
} else if (entity instanceof Location) {
Location location = (Location) entity;
registerAgencyId(Location.class, location.getId());
} else if (entity instanceof LocationGroup) {
var group = (LocationGroup) entity;
registerAgencyId(LocationGroup.class, group.getId());
} else if (entity instanceof LocationGroupElement) {
LocationGroupElement locationGroupElement = (LocationGroupElement) entity;
LocationGroup locationGroup = _entityStore.getEntityForId(LocationGroup.class, locationGroupElement.getLocationGroupId());
if (locationGroup == null) {
locationGroup = new LocationGroup();
locationGroup.setId(locationGroupElement.getLocationGroupId());
locationGroup.setName(locationGroupElement.getName());
_entityStore.saveEntity(locationGroup);
}
locationGroup.addLocation(locationGroupElement.getLocation());
locationGroup.addLocation(locationGroupElement.getStop());
} else if (entity instanceof StopAreaElement) {
var stopAreaElement = (StopAreaElement) entity;
var stopArea = _entityStore.getEntityForId(StopArea.class, stopAreaElement.getArea().getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@ public void locationIdAsASeparateColumn() throws CsvEntityIOException, IOExcepti
@Test
public void locationGroupIdAsSeparateColumn() throws CsvEntityIOException, IOException {
var dao = processFeed(GtfsTestData.getAuburnTransitFlex(), AGENCY_ID, false);
var locationGroup = List.copyOf(dao.getAllLocationGroups()).get(0);
assertEquals("Aurburn Loop Stops", locationGroup.getName());
assertEquals("1_4230479", locationGroup.getId().toString());
var actualStops = locationGroup.getLocations().stream().map(s -> s.getId().toString()).collect(Collectors.toList());
assertEquals(30, actualStops.size());

var trip = dao.getAllTrips().stream().filter(t -> t.getId().getId().equals("t_5756013_b_33000_tn_0")).findAny().get();
var stopTimes = dao.getStopTimesForTrip(trip);
stopTimes.forEach(st -> assertNotNull(st.getStopLocation()));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
location_group_id,stop_id
4230479,2583236
4230479,2583237
4230479,2583238
4230479,2583242
4230479,2583244
4230479,2583246
4230479,2583249
4230479,2583250
4230479,2583251
4230479,2583252
4230479,2583253
4230479,2583254
4230479,2583255
4230479,2583256
4230479,2583259
4230479,2583260
4230479,2583262
4230479,2583263
4230479,2583266
4230479,2583268
4230479,2583271
4230479,2583276
4230479,2583280
4230479,2583281
4230479,2583282
4230479,2583284
4230479,2583285
4230479,2751414
4230479,3446932
4230479,3446933
Original file line number Diff line number Diff line change
@@ -1,31 +1,2 @@
location_group_id,stop_id,location_group_name
4230479,2583236,Aurburn Loop Stops
4230479,2583237,Aurburn Loop Stops
4230479,2583238,Aurburn Loop Stops
4230479,2583242,Aurburn Loop Stops
4230479,2583244,Aurburn Loop Stops
4230479,2583246,Aurburn Loop Stops
4230479,2583249,Aurburn Loop Stops
4230479,2583250,Aurburn Loop Stops
4230479,2583251,Aurburn Loop Stops
4230479,2583252,Aurburn Loop Stops
4230479,2583253,Aurburn Loop Stops
4230479,2583254,Aurburn Loop Stops
4230479,2583255,Aurburn Loop Stops
4230479,2583256,Aurburn Loop Stops
4230479,2583259,Aurburn Loop Stops
4230479,2583260,Aurburn Loop Stops
4230479,2583262,Aurburn Loop Stops
4230479,2583263,Aurburn Loop Stops
4230479,2583266,Aurburn Loop Stops
4230479,2583268,Aurburn Loop Stops
4230479,2583271,Aurburn Loop Stops
4230479,2583276,Aurburn Loop Stops
4230479,2583280,Aurburn Loop Stops
4230479,2583281,Aurburn Loop Stops
4230479,2583282,Aurburn Loop Stops
4230479,2583284,Aurburn Loop Stops
4230479,2583285,Aurburn Loop Stops
4230479,2751414,Aurburn Loop Stops
4230479,3446932,Aurburn Loop Stops
4230479,3446933,Aurburn Loop Stops
location_group_id,location_group_name
4230479,Aurburn Loop Stops
Loading