public function testGetSchedules()
 {
     $rows = [["transfer_pattern" => 1000, "transfer_leg" => 2000, "service" => 3000, "origin" => "PDW", "destination" => "TON", "departure_time" => 4000, "arrival_time" => 4005, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1000, "transfer_leg" => 2000, "service" => 3001, "origin" => "PDW", "destination" => "TON", "departure_time" => 4010, "arrival_time" => 4015, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1000, "transfer_leg" => 2001, "service" => 3010, "origin" => "TON", "destination" => "HIB", "departure_time" => 4000, "arrival_time" => 4005, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1000, "transfer_leg" => 2001, "origin" => "HIB", "destination" => "TBW", "service" => 3010, "departure_time" => 4005, "arrival_time" => 4010, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1000, "transfer_leg" => 2001, "service" => 3011, "origin" => "TON", "destination" => "HIB", "departure_time" => 4005, "arrival_time" => 4010, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1000, "transfer_leg" => 2001, "service" => 3011, "origin" => "HIB", "destination" => "TBW", "departure_time" => 4010, "arrival_time" => 4015, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1001, "transfer_leg" => 2010, "service" => 3100, "origin" => "PDW", "destination" => "TBW", "departure_time" => 4000, "arrival_time" => 4005, "operator" => "LN", "type" => "train"], ["transfer_pattern" => 1001, "transfer_leg" => 2010, "service" => 3101, "origin" => "PDW", "destination" => "TBW", "departure_time" => 4010, "arrival_time" => 4015, "operator" => "LN", "type" => "train"]];
     $expected = [new TransferPatternSchedule([new TransferPatternLeg([new Leg([new TimetableConnection("PDW", "TON", 4000, 4005, 3000, "LN")]), new Leg([new TimetableConnection("PDW", "TON", 4010, 4015, 3001, "LN")])]), new TransferPatternLeg([new Leg([new TimetableConnection("TON", "HIB", 4000, 4005, 3010, "LN"), new TimetableConnection("HIB", "TBW", 4005, 4010, 3010, "LN")]), new Leg([new TimetableConnection("TON", "HIB", 4005, 4010, 3011, "LN"), new TimetableConnection("HIB", "TBW", 4010, 4015, 3011, "LN")])])]), new TransferPatternSchedule([new TransferPatternLeg([new Leg([new TimetableConnection("PDW", "TBW", 4000, 4005, 3100, "LN")]), new Leg([new TimetableConnection("PDW", "TBW", 4010, 4015, 3101, "LN")])])])];
     $factory = new TransferPatternScheduleFactory();
     $actual = $factory->getSchedulesFromTimetable($rows);
     $this->assertEquals($expected, $actual);
 }
 /**
  * Return the schedules including the calling points of each leg
  *
  * @param $origin
  * @param $destination
  * @param $startTimestamp
  * @return TransferPatternSchedule[]
  */
 public function getTimetableWithCallingPoints($origin, $destination, $startTimestamp)
 {
     $dow = lcfirst(gmdate('l', $startTimestamp));
     $stmt = $this->db->prepare("\n            SELECT \n              leg.transfer_pattern as transfer_pattern,\n              leg.id as transfer_leg,\n              tt.service,\n              tt.origin,\n              tt.destination,\n              TIME_TO_SEC(tt.departureTime) as departureTime,\n              TIME_TO_SEC(tt.arrivalTime) as arrivalTime,\n              tt.operator,\n              tt.type\n            FROM transfer_pattern\n            JOIN transfer_pattern_leg leg ON transfer_pattern.id = leg.transfer_pattern\n            JOIN timetable_connection dept ON leg.origin = dept.origin\n            JOIN timetable_connection arrv ON leg.destination = arrv.destination AND dept.service = arrv.service\n            JOIN timetable_connection tt ON tt.service = dept.service AND tt.departureTime >= dept.departureTime AND tt.arrivalTime <= arrv.arrivalTime\n            WHERE arrv.arrivalTime > dept.departureTime\n            AND transfer_pattern.origin = :origin\n            AND transfer_pattern.destination = :destination\n            AND dept.departureTime >= :departureTime\n            AND dept.startDate <= :startDate AND dept.endDate >= :startDate\n            AND dept.{$dow} = 1\n            ORDER BY leg.transfer_pattern, leg.id, arrv.arrivalTime, tt.service, tt.departureTime\n        ");
     $stmt->execute(['departureTime' => gmdate("H:i:s", $startTimestamp), 'startDate' => gmdate("Y-m-d", $startTimestamp), 'origin' => $origin, 'destination' => $destination]);
     $factory = new TransferPatternScheduleFactory();
     return $factory->getSchedulesFromTimetable($stmt->fetchAll(PDO::FETCH_ASSOC));
 }