GraphTraversalServiceImpl.java 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package com.partner.pathfinder.internal;
  2. import com.partner.pathfinder.api.GraphTraversalService;
  3. import com.partner.pathfinder.api.TransitEdge;
  4. import com.partner.pathfinder.api.TransitPath;
  5. import java.util.*;
  6. public class GraphTraversalServiceImpl implements GraphTraversalService {
  7. private GraphDAO dao;
  8. private Random random;
  9. public GraphTraversalServiceImpl(GraphDAO dao) {
  10. this.dao = dao;
  11. this.random = new Random();
  12. }
  13. public List<TransitPath> findShortestPath(final String originUnLocode,
  14. final String destinationUnLocode,
  15. final Properties limitations) {
  16. List<String> allVertices = dao.listLocations();
  17. allVertices.remove(originUnLocode);
  18. allVertices.remove(destinationUnLocode);
  19. final int candidateCount = getRandomNumberOfCandidates();
  20. final List<TransitPath> candidates = new ArrayList<TransitPath>(candidateCount);
  21. for (int i = 0; i < candidateCount; i++) {
  22. allVertices = getRandomChunkOfLocations(allVertices);
  23. final List<TransitEdge> transitEdges = new ArrayList<TransitEdge>(allVertices.size() - 1);
  24. final String firstLegTo = allVertices.get(0);
  25. transitEdges.add(new TransitEdge(
  26. dao.getVoyageNumber(originUnLocode, firstLegTo),
  27. originUnLocode, firstLegTo));
  28. for (int j = 0; j < allVertices.size() - 1; j++) {
  29. final String curr = allVertices.get(j);
  30. final String next = allVertices.get(j + 1);
  31. transitEdges.add(new TransitEdge(dao.getVoyageNumber(curr, next), curr, next));
  32. }
  33. final String lastLegFrom = allVertices.get(allVertices.size() - 1);
  34. transitEdges.add(new TransitEdge(
  35. dao.getVoyageNumber(lastLegFrom, destinationUnLocode),
  36. lastLegFrom, destinationUnLocode));
  37. candidates.add(new TransitPath(transitEdges));
  38. }
  39. return candidates;
  40. }
  41. private int getRandomNumberOfCandidates() {
  42. return 1 + random.nextInt(4);
  43. }
  44. private List<String> getRandomChunkOfLocations(List<String> allLocations) {
  45. Collections.shuffle(allLocations);
  46. final int total = allLocations.size();
  47. final int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
  48. return allLocations.subList(0, chunk);
  49. }
  50. }