bahndb-rest/query.sql

95 lines
4.2 KiB
SQL

-- name: GetStationsByName :many
SELECT s.id as "id",
s.name as "name",
sl.latitude as "latitude",
sl.longitude as "longitude",
bus as "bus",
taxi as "taxi",
tram as "tram",
ferry as "ferry",
subway as "subway",
national as "national",
regional as "regional",
suburban as "suburban",
regionalexp as "regionalexp",
nationalexp as "nationalexp"
FROM stops s
JOIN public.stat_locations sl
on sl.id = s.location_id
JOIN public.stat_services ss
on ss.id = s.service_id
JOIN public.station_rank sr
on sr.stop = s.id
WHERE s.id
in (SELECT id
FROM stops s2
WHERE s2.name ILIKE ALL (@search_params::text[])
)
AND CASE WHEN sqlc.narg(long_distance)::bool THEN (ss.national = sqlc.narg(long_distance)::bool OR ss.nationalexp = sqlc.narg(long_distance)::bool) ELSE TRUE END
ORDER BY sr.count DESC;
-- name: GetStationById :one
SELECT s.id as "id",
s.name as "name",
sl.latitude as "latitude",
sl.longitude as "longitude",
bus,
taxi,
tram,
ferry,
subway,
national,
regional,
suburban,
regionalexp,
nationalexp
FROM stops s
JOIN public.stat_locations sl
on sl.id = s.location_id
JOIN public.stat_services ss
on ss.id = s.service_id
WHERE s.id = @stop_id;
-- name: GetDeparturesById :many
SELECT DISTINCT (t.id) as "id",
t.line_name as "lineName",
t.line_productname as "lineProductName",
so.departuredelay as "departureDelay",
jsonb_build_object('id', sd.id, 'name', sd.name) as "direction",
ARRAY((SELECT jsonb_build_object('stop', row('id', sd.id, 'name', sd.name),
'arrival', so2.arrival,
'plannedArrival', so2.plannedarrival,
'arrivalDelay', so2.arrivaldelay,
'arrivalPlatform', so2.arrivalplatform,
'plannedArrivalPlatform', so2.plannedarrivalplatform,
'cancelled', so2.cancelled)
FROM stopovers so2
JOIN public.stops s2
ON so2.stop = s2.id
WHERE so2.id = t.id
AND so2.plannedarrival > so.planneddeparture
AND (so2.stop, so2.realtimedataupdatedat) IN (SELECT DISTINCT (stop), max(realtimedataupdatedat)
FROM stopovers so3
WHERE (so3.id = t.id
AND so3.realtimedataupdatedat <= @rt_updated_at)
GROUP BY so3.stop)))
AS "stopovers",
so.departure as "departure",
so.planneddeparture as "plannedDeparture",
so.departureplatform as "departurePlatform",
so.planneddepartureplatform as "plannedDeparturePlatform",
so.cancelled as "cancelled",
so.realtimedataupdatedat as "realtimeDataUpdatedAt"
FROM stopovers so
JOIN trips t ON so.id = t.id
JOIN public.trip_meta tm on t.id = tm.id
JOIN public.stops sd on t.destination = sd.id
WHERE so.stop = @stop_id
AND (so.id, so.realtimedataupdatedat) IN (SELECT DISTINCT (id), max(realtimedataupdatedat)
FROM stopovers so3
WHERE so3.stop = @stop_id
AND (so3.departure > @departure_from)
AND (so3.departure < @departure_to)
AND (so3.realtimedataupdatedat <= @rt_updated_at)
GROUP BY so3.id)
ORDER BY so.departure ASC;