Refactor trip/route view
[busui.git] / include / db / route-dao.inc.php
blob:a/include/db/route-dao.inc.php -> blob:b/include/db/route-dao.inc.php
<?php <?php
   
  /*
  * Copyright 2010,2011 Alexander Sadleir
   
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
   
  http://www.apache.org/licenses/LICENSE-2.0
   
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  */
   
function getRoute($routeID) { function getRoute($routeID) {
$query = "Select * from routes where route_id = '$routeID' LIMIT 1"; global $conn;
debug($query,"database"); $query = "Select * from routes where route_id = :routeID LIMIT 1";
$result = pg_query($conn, $query); debug($query, "database");
if (!$result) { $query = $conn->prepare($query);
databaseError(pg_result_error($result)); $query->bindParam(":routeID", $routeID);
return Array(); $query->execute();
} if (!$query) {
return pg_fetch_assoc($result); databaseError($conn->errorInfo());
} return Array();
  }
  return $query->fetch(PDO :: FETCH_ASSOC);
  }
   
  function getRoutesByShortName($routeShortName) {
  global $conn;
  $query = "Select distinct route_id, route_short_name from routes where route_short_name = :routeShortName";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":routeShortName", $routeShortName);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getRouteHeadsigns($routeID) {
  global $conn;
  $query = "select stops.stop_name, trip_headsign, direction_id,max(service_id) as service_id, count(*)
  from routes join trips on trips.route_id = routes.route_id
  join stop_times on stop_times.trip_id = trips.trip_id join stops on
  stop_times.stop_id = stops.stop_id where trips.route_id = :routeID
  and stop_times.stop_sequence = 1 group by stops.stop_name, trip_headsign, direction_id having count(*) > 2";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":routeID", $routeID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
  function getRouteDescription($routeID, $directionID) {
  $trip = getRouteNextTrip($routeID, $directionID);
  $start = getTripStartingPoint($trip['trip_id']);
  $end = getTripDestination($trip['trip_id']);
  return "From ".$start['stop_name']." to ".$end['stop_name'];
  }
  function getRouteByFullName($routeFullName) {
  global $conn;
  $query = "Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":routeFullName", $routeFullName);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetch(PDO :: FETCH_ASSOC);
  }
   
function getRoutes() { function getRoutes() {
global $conn; global $conn;
$query = "Select * from routes order by route_short_name;"; $query = "Select * from routes order by route_short_name;";
debug($query,"database"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn->prepare($query);
if (!$result) { $query->execute();
databaseError(pg_result_error($result)); if (!$query) {
return Array(); databaseError($conn->errorInfo());
} return Array();
return pg_fetch_all($result); }
} return $query->fetchAll();
  }
function getRoutesByNumber($routeNumber = "") {  
global $conn; function getRoutesByNumberSeries($routeNumberSeries = "") {
if ($routeNumber != "") { global $conn;
$query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = if (strlen($routeNumberSeries) == 1) {
routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where route_short_name = '$routeNumber' order by route_short_name;"; return getRoute($routeNumberSeries);
} else { }
$query = "SELECT DISTINCT route_short_name from routes order by route_short_name"; $seriesMin = substr($routeNumberSeries, 0, -1) . "0";
  $seriesMax = substr($routeNumberSeries, 0, -1) . "9";
  $query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id =
  routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where to_number(route_short_name, 'FM999') between :seriesMin and :seriesMax OR route_short_name LIKE :routeNumberSeries order by route_short_name;";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":seriesMin", $seriesMin);
  $query->bindParam(":seriesMax", $seriesMax);
  $routeNumberSeries = "% " . substr($routeNumberSeries, 0, -1) . "%";
  $query->bindParam(":routeNumberSeries", $routeNumberSeries);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getRouteNextTrip($routeID, $directionID) {
  global $conn;
   
  $query = "select routes.route_id,direction_id,trips.trip_id,trip_headsign,departure_time from routes join trips on trips.route_id = routes.route_id
  join stop_times on stop_times.trip_id = trips.trip_id where arrival_time between :currentTime and :futureTime
  and routes.route_id = :routeID and trips.direction_id = :directionID order by
  arrival_time limit 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":currentTime", current_time());
  $futureTime = current_time(strtotime(current_time() ." +2h"));
  if (date("h",strtotime(current_time()) > 22)) $futureTime = "23:59:59";
  $query->bindParam(":futureTime", $futureTime);
  $query->bindParam(":routeID", $routeID);
  $query->bindParam(":directionID", $directionID);
  $query->execute();
  databaseError($conn->errorInfo());
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $r = $query->fetch(PDO :: FETCH_ASSOC);
  return $r;
  }
   
  function getRouteFirstTrip($routeID,$directionID) {
  global $conn;
   
  $query = "select * from routes join trips on trips.route_id = routes.route_id
  join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID
  and trips.direction_id = :directionID order by
  arrival_time DESC limit 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":routeID", $routeID);
   
  $query->bindParam(":directionID", $directionID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
} }
debug($query,"database");  
$result = pg_query($conn, $query); $r = $query->fetch(PDO :: FETCH_ASSOC);
if (!$result) { return $r;
databaseError(pg_result_error($result)); }
return Array();  
} function getRouteAtStop($routeID, $directionID, $stop_id) {
return pg_fetch_all($result); $nextTrip = getRouteNextTrip($routeID, $directionID);
} if ($nextTrip['trip_id']) {
  foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) {
function getRouteNextTrip($routeID) { if ($tripStop['stop_id'] == $stop_id)
global $conn; return $tripStop;
$query = "select * from routes join trips on trips.route_id = routes.route_id }
join stop_times on stop_times.trip_id = trips.trip_id where }
arrival_time > CURRENT_TIME and routes.route_id = '$routeID' order by return Array();
arrival_time limit 1"; }
debug($query,"database");  
$result = pg_query($conn, $query); function getRouteTrips($routeID, $directionID = "", $service_period = "") {
if (!$result) { global $conn;
databaseError(pg_result_error($result)); if ($service_period == "")
return Array(); $service_period = service_period();
} $service_ids = service_ids($service_period);
return pg_fetch_assoc($result); $sidA = $service_ids[0];
} $sidB = $service_ids[1];
function getRouteTrips($routeID) { $directionSQL = "";
global $conn; if ($directionID != "")
$query = "select * from routes join trips on trips.route_id = routes.route_id $directionSQL = " and direction_id = :directionID ";
join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = '$routeID' order by $query = "select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id
  join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB)
  AND (routes.route_id = :routeID) " . $directionSQL . " and stop_sequence = '1' order by
arrival_time "; arrival_time ";
debug($query,"database"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn->prepare($query);
if (!$result) { $query->bindParam(":routeID", $routeID);
databaseError(pg_result_error($result)); $query->bindParam(":service_periodA", $sidA);
return Array(); $query->bindParam(":service_periodB", $sidB);
} if ($directionSQL != "")
return pg_fetch_all($result); $query->bindParam(":directionID", $directionID);
} $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
function getRoutesByDestination($destination = "", $service_period = "") { function getRoutesByDestination($destination = "", $service_period = "") {
global $conn; global $conn;
if ($service_period == "") $service_period = service_period(); if ($service_period == "")
if ($destination != "") { $service_period = service_period();
$query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id $service_ids = service_ids($service_period);
  $sidA = $service_ids[0];
  $sidB = $service_ids[1];
  if ($destination != "") {
  /* $query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id
FROM stop_times join trips on trips.trip_id = FROM stop_times join trips on trips.trip_id =
stop_times.trip_id join routes on trips.route_id = routes.route_id stop_times.trip_id join routes on trips.route_id = routes.route_id
WHERE route_long_name = '$destination' AND service_id='$service_period' order by route_short_name"; WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB)
} else { order by route_short_name";*/
$query = "SELECT DISTINCT route_long_name $query = "select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id
FROM stop_times join trips on trips.trip_id = from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;";
stop_times.trip_id join routes on trips.route_id = routes.route_id } else {
WHERE service_id='$service_period' order by route_long_name"; $query = "select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id
} from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_name;";
debug($query,"database"); }
$result = pg_query($conn, $query); debug($query, "database");
if (!$result) { $query = $conn->prepare($query);
databaseError(pg_result_error($result));  
return Array(); //$query->bindParam(":service_periodA", $sidA);
} //$query->bindParam(":service_periodB", $sidB);
return pg_fetch_all($result); if ($destination != "")
  $query->bindParam(":destination", $destination);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
} }
   
function getRoutesBySuburb($suburb, $service_period = "") { function getRoutesBySuburb($suburb, $service_period = "") {
if ($service_period == "") $service_period = service_period(); if ($service_period == "")
global $conn; $service_period = service_period();
$query = "SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name $service_ids = service_ids($service_period);
  $sidA = $service_ids[0];
  $sidB = $service_ids[1];
   
  global $conn;
  $query = "SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name
FROM stop_times join trips on trips.trip_id = stop_times.trip_id FROM stop_times join trips on trips.trip_id = stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE zone_id LIKE '%$suburb;%' AND service_id='$service_period' ORDER BY route_short_name"; WHERE stop_desc LIKE :suburb AND (service_id=:service_periodA OR service_id=:service_periodB)
debug($query,"database"); ORDER BY route_short_name";
$result = pg_query($conn, $query); debug($query, "database");
if (!$result) { $query = $conn->prepare($query);
databaseError(pg_result_error($result)); $query->bindParam(":service_periodA", $sidA);
return Array(); $query->bindParam(":service_periodB", $sidB);
} $suburb = "%Suburb: %" . $suburb . "%";
return pg_fetch_all($result); $query->bindParam(":suburb", $suburb);
  $query->execute();
   
  databaseError($conn->errorInfo());
   
  return $query->fetchAll();
} }
   
function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) { function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) {
  // if ($service_period == "")
  $service_period = service_period();
if ($service_period == "") $service_period = service_period(); $service_ids = service_ids($service_period);
if ($limit != "") $limit = " LIMIT $limit "; $sidA = $service_ids[0];
global $conn; $sidB = $service_ids[1];
$query = "SELECT service_id,trips.route_id,route_short_name,route_long_name, $limitSQL = "";
  if ($limit != "")
  $limitSQL = " LIMIT :limit ";
  global $conn;
  $query = "SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id,
min(ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE)) as distance min(ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE)) as distance
FROM stop_times FROM stop_times
join trips on trips.trip_id = stop_times.trip_id join trips on trips.trip_id = stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE service_id='$service_period' WHERE (service_id=:service_periodA OR service_id=:service_periodB)
AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), $distance, FALSE) AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE)
group by service_id,trips.route_id,route_short_name,route_long_name group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name
order by distance $limit"; order by distance $limitSQL";
debug($query,"database"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn->prepare($query);
if (!$result) { $query->bindParam(":service_periodA", $sidA);
databaseError(pg_result_error($result)); $query->bindParam(":service_periodB", $sidB);
return Array(); $query->bindParam(":distance", $distance);
} if ($limit != "")
return pg_fetch_all($result); $query->bindParam(":limit", $limit);
} $query->execute();
?> if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }