Refactor route list
[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 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;
$conditions = Array(); $query = "Select * from routes order by route_short_name;";
if ($timingPointsOnly) $conditions[] = "substr(stop_code,1,2) != 'Wj'"; debug($query, "database");
if ($firstLetter != "") $conditions[] = "substr(stop_name,1,1) = '$firstLetter'"; $query = $conn->prepare($query);
$query = "Select * from routes"; $query->execute();
if (sizeof($conditions) > 0) { if (!$query) {
if (sizeof($conditions) > 1) { databaseError($conn->errorInfo());
$query .= " Where ".implode(" AND ",$conditions)." "; return Array();
} }
else { return $query->fetchAll();
$query .= " Where ".$conditions[0]." "; }
}  
} function getRoutesByNumber($routeNumber = "") {
$query .= " order by route_short_name;"; global $conn;
debug($query,"database"); if ($routeNumber != "") {
$result = pg_query($conn, $query); $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 (!$result) { routes.route_id join stop_times on stop_times.trip_id = trips.trip_id
databaseError(pg_result_error($result)); where route_short_name = :routeNumber OR route_short_name LIKE :routeNumber2 order by route_short_name;";
return Array(); } else {
} $query = "SELECT DISTINCT route_short_name from routes order by route_short_name";
return pg_fetch_all($result); }
} debug($query, "database");
  $query = $conn->prepare($query);
function findRouteByNumber($routeNumber) { if ($routeNumber != "") {
global $conn; $query->bindParam(":routeNumber", $routeNumber);
$query = "Select * from routes where route_short_name = '$routeNumber';"; $routeNumber2 = "% " . $routeNumber;
debug($query,"database"); $query->bindParam(":routeNumber2", $routeNumber2);
$result = pg_query($conn, $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 getRoutesByNumberSeries($routeNumberSeries = "") {
  global $conn;
  if (strlen($routeNumberSeries) == 1) {
  return getRoutesByNumber($routeNumberSeries);
  }
  $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) { function getRouteNextTrip($routeID) {
  global $conn;
$query = "select * from routes join trips on trips.route_id = routes.route_id $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 join stop_times on stop_times.trip_id = trips.trip_id where
arrival_time > CURRENT_TIME and routes.route_id = '$routeID' order by arrival_time > :currentTime and routes.route_id = :routeID order by
arrival_time limit 1"; arrival_time limit 1";
debug($query,"database"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn->prepare($query);
if (!$result) { $query->bindParam(":currentTime", current_time());
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();
  }
  $r = $query->fetch(PDO :: FETCH_ASSOC);
   
  // past last trip of the day special case
  if (sizeof($r) < 16) {
  $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 order by
  arrival_time DESC limit 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":routeID", $routeID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
   
  $r = $query->fetch(PDO :: FETCH_ASSOC);
  }
  return $r;
  }
   
  function getRouteAtStop($routeID, $stop_id) {
  $nextTrip = getRouteNextTrip($routeID);
  if ($nextTrip['trip_id']) {
  foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) {
  if ($tripStop['stop_id'] == $stop_id)
  return $tripStop;
  }
  }
  return Array();
  }
   
  function getRouteTrips($routeID) {
  global $conn;
  $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 routes.route_id = :routeID and stop_sequence = '1' order by
  arrival_time ";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":routeID", $routeID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getRoutesByDestination($destination = "", $service_period = "") {
  global $conn;
  if ($service_period == "")
  $service_period = service_period();
  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 =
  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";
  } else {
  $query = "SELECT DISTINCT route_long_name
  FROM stop_times join trips on trips.trip_id =
  stop_times.trip_id join routes on trips.route_id = routes.route_id
  WHERE service_id= :service_period order by route_long_name";
  }
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":service_period", $service_period);
  if ($destination != "")
  $query->bindParam(":destination", $destination);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getRoutesBySuburb($suburb, $service_period = "") {
  if ($service_period == "")
  $service_period = service_period();
  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
  join routes on trips.route_id = routes.route_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";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":service_period", $service_period);
  $suburb = "%" . $suburb . ";%";
  $query->bindParam(":suburb", $suburb);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) {
  if ($service_period == "")
  $service_period = service_period();
  $service_ids = service_ids($service_period);
  $sidA = $service_ids[0];
  $sidB = $service_ids[1];
  if ($limit != "")
  $limitSQL = " LIMIT :limit ";
  global $conn;
  $query = "SELECT service_id,trips.route_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
  FROM stop_times
  join trips on trips.trip_id = stop_times.trip_id
  join routes on trips.route_id = routes.route_id
  join stops on stops.stop_id = stop_times.stop_id
  WHERE (service_id=:service_periodA OR service_id=:service_periodB)
  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
  order by distance $limitSQL";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":service_periodA", $sidA);
  $query->bindParam(":service_periodB", $sidB);
  $query->bindParam(":distance", $distance);
  if ($limit != "")
  $query->bindParam(":limit", $limit);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
?> ?>