Refactor stop page
[busui.git] / include / db / trip-dao.inc.php
blob:a/include/db/trip-dao.inc.php -> blob:b/include/db/trip-dao.inc.php
<?php <?php
function getTrip($tripID) { function getTrip($tripID)
global $conn; {
$query = "Select * from trips where trip_id = '$tripID' join routes on trips.route_id = routes.route_id LIMIT 1"; global $conn;
debug($query,"database"); $query = "Select * from trips
$result = pg_query($conn, $query); join routes on trips.route_id = routes.route_id
if (!$result) { where trip_id = :tripID
databaseError(pg_result_error($result)); LIMIT 1";
return Array(); debug($query, "database");
} $query = $conn->prepare($query);
return pg_fetch_assoc($result); $query->bindParam(":tripID", $tripID);
} $query->execute();
function getTripShape() { if (!$query) {
/* def handle_json_GET_tripstoptimes(self, params): databaseError($conn->errorInfo());
schedule = self.server.schedule return Array();
try: }
trip = schedule.GetTrip(params.get('trip')) return $query->fetch(PDO::FETCH_ASSOC);
except KeyError: }
# if a non-existent trip is searched for, the return nothing function getTripShape()
return {
time_stops = trip.GetTimeInterpolatedStops() /* def handle_json_GET_tripstopTimes(self, params):
stops = [] schedule = self.server.schedule
times = [] try:
for arr,ts,is_timingpoint in time_stops: trip = schedule.GetTrip(params.get('trip'))
stops.append(StopToTuple(ts.stop)) except KeyError:
times.append(arr) # if a non-existent trip is searched for, the return nothing
return [stops, times] return
  time_stops = trip.GetTimeInterpolatedStops()
def handle_json_GET_tripshape(self, params): stops = []
schedule = self.server.schedule times = []
try: for arr,ts,is_timingpoint in time_stops:
trip = schedule.GetTrip(params.get('trip')) stops.append(StopToTuple(ts.stop))
except KeyError: times.append(arr)
# if a non-existent trip is searched for, the return nothing return [stops, times]
return  
points = [] def handle_json_GET_tripshape(self, params):
if trip.shape_id: schedule = self.server.schedule
shape = schedule.GetShape(trip.shape_id) try:
for (lat, lon, dist) in shape.points: trip = schedule.GetTrip(params.get('trip'))
points.append((lat, lon)) except KeyError:
else: # if a non-existent trip is searched for, the return nothing
time_stops = trip.GetTimeStops() return
for arr,dep,stop in time_stops: points = []
points.append((stop.stop_lat, stop.stop_lon)) if trip.shape_id:
return points*/ shape = schedule.GetShape(trip.shape_id)
} for (lat, lon, dist) in shape.points:
function getTimeInterpolatedTrip($tripID) { points.append((lat, lon))
/* rv = [] else:
  time_stops = trip.GetTimeStops()
stoptimes = self.GetStopTimes() for arr,dep,stop in time_stops:
# If there are no stoptimes [] is the correct return value but if the start points.append((stop.stop_lat, stop.stop_lon))
# or end are missing times there is no correct return value. return points*/
if not stoptimes: }
return [] function getTimeInterpolatedTrip($tripID, $range = "")
if (stoptimes[0].GetTimeSecs() is None or {
stoptimes[-1].GetTimeSecs() is None): global $conn;
raise ValueError("%s must have time at first and last stop" % (self)) $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,stop_code,
  stop_sequence,service_id,trips.route_id,route_short_name,route_long_name
cur_timepoint = None FROM stop_times
next_timepoint = None join trips on trips.trip_id = stop_times.trip_id
distance_between_timepoints = 0 join routes on trips.route_id = routes.route_id
distance_traveled_between_timepoints = 0 join stops on stops.stop_id = stop_times.stop_id
  WHERE trips.trip_id = :tripID $range ORDER BY stop_sequence";
for i, st in enumerate(stoptimes): debug($query, "database");
if st.GetTimeSecs() != None: $query = $conn->prepare($query);
cur_timepoint = st $query->bindParam(":tripID", $tripID);
distance_between_timepoints = 0 $query->execute();
distance_traveled_between_timepoints = 0 if (!$query) {
if i + 1 < len(stoptimes): databaseError($conn->errorInfo());
k = i + 1 return Array();
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) }
while stoptimes[k].GetTimeSecs() == None: $stopTimes = $query->fetchAll();
k += 1 $cur_timepoint = Array();
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) $next_timepoint = Array();
next_timepoint = stoptimes[k] $distance_between_timepoints = 0.0;
rv.append( (st.GetTimeSecs(), st, True) ) $distance_traveled_between_timepoints = 0.0;
else: $rv = Array();
distance_traveled_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[i-1].stop, st.stop) foreach ($stopTimes as $i => $stopTime) {
distance_percent = distance_traveled_between_timepoints / distance_between_timepoints if ($stopTime['arrival_time'] != "") {
total_time = next_timepoint.GetTimeSecs() - cur_timepoint.GetTimeSecs() // is timepoint
time_estimate = distance_percent * total_time + cur_timepoint.GetTimeSecs() $cur_timepoint = $stopTime;
rv.append( (int(round(time_estimate)), st, False) ) $distance_between_timepoints = 0.0;
  $distance_traveled_between_timepoints = 0.0;
return rv*/ if ($i + 1 < sizeof($stopTimes)) {
} $k = $i + 1;
function getTimeInterpolatedTripAtStop($trip_id, $stop_sequence) { $distance_between_timepoints+= distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
foreach(getTimeInterpolatedTrip($tripID) as $tripStop) { while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) {
if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop; $k+= 1;
} //echo "k".$k;
return Array(); $distance_between_timepoints+= distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
} }
  $next_timepoint = $stopTimes[$k];
function getTripStartTime($tripID) { $rv[] = $stopTime;
$query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1'; }
  }
} else {
  // is untimed point
function viaPointNames($tripid, $stopid) //echo "i".$i;
{ $distance_traveled_between_timepoints+= distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]);
global $conn; //echo "$distance_traveled_between_timepoints / $distance_between_timepoints<br>";
$query = "SELECT stop_name $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints;
  if ($next_timepoint["arrival_time"] != "") {
  $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]);
  //echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."<br>";
  $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]);
  $stopTime["arrival_time"] = date("H:i:s", $time_estimate);
  }
  else {
  $stopTime["arrival_time"] = $cur_timepoint["arrival_time"];
  }
  $rv[] = $stopTime;
  //var_dump($rv);
   
  }
  }
  return $rv;
  }
  function getTripPreviousTimePoint($tripID, $stop_sequence)
  {
  global $conn;
  $query = " SELECT trip_id,stop_id,
  stop_sequence
  FROM stop_times
  WHERE trip_id = :tripID and stop_sequence < :stop_sequence
  and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->bindParam(":stop_sequence", $stop_sequence);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetch(PDO::FETCH_ASSOC);
  }
  function getTripNextTimePoint($tripID, $stop_sequence)
  {
  global $conn;
  $query = " SELECT trip_id,stop_id,
  stop_sequence
  FROM stop_times
  WHERE trip_id = :tripID and stop_sequence > :stop_sequence
  and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->bindParam(":stop_sequence", $stop_sequence);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetch(PDO::FETCH_ASSOC);
  }
  function getTimeInterpolatedTripAtStop($tripID, $stop_sequence)
  {
  global $conn;
  // limit interpolation to between nearest actual points.
  $prevTimePoint = getTripPreviousTimePoint($tripID, $stop_sequence);
  $nextTimePoint = getTripNextTimePoint($tripID, $stop_sequence);
  $range = "AND stop_sequence >= '{$prevTimePoint['stop_sequence']}' AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'";
  foreach (getTimeInterpolatedTrip($tripID, $range) as $tripStop) {
  if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop;
  }
  return Array();
  }
  function getTripStartTime($tripID)
  {
  global $conn;
  $query = "Select * from stop_times
  where trip_id = :tripID
  AND arrival_time IS NOT NULL
  AND stop_sequence = '1'";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $r = $query->fetch(PDO::FETCH_ASSOC);
  return $r['arrival_time'];
  }
  function getActiveTrips($time)
  {
  global $conn;
  if ($time == "") $time = current_time();
  $query = "Select distinct stop_times.trip_id, start_times.arrival_time as start_time, end_times.arrival_time as end_time from stop_times, (SELECT trip_id,arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL
  AND stop_sequence = '1') as start_times, (SELECT trip_id,max(arrival_time) as arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times
  WHERE start_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id AND :time > start_times.arrival_time AND :time < end_times.arrival_time";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":time", $time);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
  function viaPoints($tripID, $stop_sequence = "")
  {
  global $conn;
  $query = "SELECT stops.stop_id, stop_name, arrival_time
FROM stop_times join stops on stops.stop_id = stop_times.stop_id FROM stop_times join stops on stops.stop_id = stop_times.stop_id
WHERE stop_times.trip_id = '$tripid' WHERE stop_times.trip_id = :tripID
AND stop_sequence > '$stop_sequence' " . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . "AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence";
AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence"; debug($query, "database");
debug($query,"database"); $query = $conn->prepare($query);
$result = pg_query($conn, $query); if ($stop_sequence != "") $query->bindParam(":stop_sequence", $stop_sequence);
if (!$result) { $query->bindParam(":tripID", $tripID);
databaseError(pg_result_error($result)); $query->execute();
return Array(); if (!$query) {
} databaseError($conn->errorInfo());
$pointNames = pg_fetch_all($result); return Array();
return r_implode(", ", $pointNames); }
  return $query->fetchAll();
  }
  function viaPointNames($tripid, $stop_sequence = "")
  {
  $viaPointNames = Array();
  foreach (viaPoints($tripid, $stop_sequence) as $point) {
  $viaPointNames[] = $point['stop_name'];
  }
  if (sizeof($viaPointNames) > 0) {
  return r_implode(", ", $viaPointNames);
  }
  else {
  return "";
  }
} }
?> ?>