All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.ext.stopconsolidation.StopConsolidationParser Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.stopconsolidation;

import com.csvreader.CsvReader;
import com.google.common.collect.ImmutableListMultimap;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.BooleanUtils;
import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup;
import org.opentripplanner.transit.model.framework.FeedScopedId;

public class StopConsolidationParser {

  private record StopGroupEntry(String groupId, FeedScopedId stopId, boolean isPrimary) {}

  public static List parseGroups(InputStream is) {
    try {
      var reader = new CsvReader(is, StandardCharsets.UTF_8);
      reader.setDelimiter(',');

      reader.readHeaders();

      var entries = new ArrayList();
      while (reader.readRecord()) {
        var id = reader.get("stop_group_id");
        var feedId = reader.get("feed_id");
        var stopId = reader.get("stop_id");
        var isPrimary = BooleanUtils.toBoolean(Integer.parseInt(reader.get("is_primary")));
        var entry = new StopGroupEntry(id, new FeedScopedId(feedId, stopId), isPrimary);
        entries.add(entry);
      }

      var groups = entries
        .stream()
        .collect(
          ImmutableListMultimap.<
              StopGroupEntry,
              String,
              StopGroupEntry
            >flatteningToImmutableListMultimap(x -> x.groupId, Stream::of)
        );

      return groups
        .keys()
        .stream()
        .map(key -> {
          var group = groups.get(key);

          var primaryId = group.stream().filter(e -> e.isPrimary).findAny().orElseThrow().stopId;
          var secondaries = group
            .stream()
            .filter(e -> !e.isPrimary)
            .map(e -> e.stopId)
            .collect(Collectors.toSet());

          return new ConsolidatedStopGroup(primaryId, secondaries);
        })
        .distinct()
        .toList();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy