handle something odd with nulls in gtfs at times

6b94fa1 · gmorell · 2023-02-23 03:44

5 files +76 -45

Files changed

modified apps/room_gtfs/lib/room_gtfs/gtfs_worker.ex
+76 −45
@@ -42,43 +42,55 @@ defmodule RoomGtfs.Worker do
42 42 def query_stop(id, query) do
43 43 inst = Configuration.get_source!(id)
44 44 res = Storage.get_upcoming_arrivals_for_stop(id, query.stop)
45 +
45 46 case inst.config.url_rt_tu do
46 − nil -> res
47 − _val -> trips = res |> Enum.map(fn x -> x.trip_id end)
48 −
49 − case get_current_realtime(id, trips, query.stop) do
50 − [] ->
51 − res
52 −
53 − rtvals ->
54 − res
55 − |> Enum.map(fn x ->
56 − case Enum.find(rtvals, fn v -> x.trip_id == v.trip_update.trip.trip_id end) do
57 − nil ->
58 − x
59 −
60 − val ->
61 − case val.trip_update.stop_time_update.arrival do
62 − nil ->
63 − x
64 −
65 − _arrival ->
66 − x
67 − |> Map.put(:arrival_time_live_ts, val.trip_update.stop_time_update.arrival.time)
68 − |> Map.put(
69 − :arrival_time_live_delay,
70 − val.trip_update.stop_time_update.arrival.delay
71 − )
72 − |> Map.put(
73 − :arrival_time_live_uncertianty,
74 − val.trip_update.stop_time_update.arrival.uncertainty
75 − )
76 − end
77 − end
78 − end)
47 + nil ->
48 + res
49 +
50 + _val ->
51 + trips = res |> Enum.map(fn x -> x.trip_id end)
52 +
53 + case get_current_realtime(id, trips, query.stop) do
54 + [] ->
55 + res
56 +
57 + rtvals ->
58 + res
59 + |> Enum.map(fn x ->
60 + case Enum.find(rtvals, fn v -> x.trip_id == v.trip_update.trip.trip_id end) do
61 + nil ->
62 + x
63 +
64 + val ->
65 + case val.trip_update.stop_time_update do
66 + nil ->
67 + x
68 +
69 + _stop_time_update ->
70 + case val.trip_update.stop_time_update.arrival do
71 + nil ->
72 + x
73 +
74 + _arrival ->
75 + x
76 + |> Map.put(
77 + :arrival_time_live_ts,
78 + val.trip_update.stop_time_update.arrival.time
79 + )
80 + |> Map.put(
81 + :arrival_time_live_delay,
82 + val.trip_update.stop_time_update.arrival.delay
83 + )
84 + |> Map.put(
85 + :arrival_time_live_uncertianty,
86 + val.trip_update.stop_time_update.arrival.uncertainty
87 + )
88 + end
89 + end
79 90 end
91 + end)
92 + end
80 93 end
81 −
82 94 end
83 95
84 96 # etc
@@ -90,7 +102,7 @@ defmodule RoomGtfs.Worker do
90 102 )
91 103
92 104 {:ok, child_rt} = Parent.start_child({RoomGtfs.Worker.RT, opts})
93 − {:ok, child_static} = Parent.start_child({RoomGtfs.Worker.Static, opts})
105 + {:ok, child_s(tatic)} = Parent.start_child({RoomGtfs.Worker.Static, opts})
94 106
95 107 {:ok,
96 108 %{
@@ -125,11 +137,13 @@ defmodule RoomGtfs.Worker do
125 137 try do
126 138 GenServer.call(state.child_rt, {:query_realtime, trips, stop})
127 139 catch
128 − :exit, _ -> IO.puts "timeout? exit"
129 − []
140 + :exit, _ ->
141 + IO.puts("timeout? exit")
142 + []
130 143 after
131 144 []
132 145 end
146 +
133 147 {:reply, r, state}
134 148 end
135 149
@@ -211,9 +225,15 @@ defmodule RoomGtfs.Worker.RT do
211 225
212 226 val ->
213 227 case fetch_rt_url(val) do
214 − {:ok, data_sa} -> state |> Map.put(:rt_sa, data_sa)
215 − {:error, error} -> Logger.info("failed to fetch gtfs-rt url[sa] for '#{state.inst.name}', reason: #{error.reason}")
216 − state
228 + {:ok, data_sa} ->
229 + state |> Map.put(:rt_sa, data_sa)
230 +
231 + {:error, error} ->
232 + Logger.info(
233 + "failed to fetch gtfs-rt url[sa] for '#{state.inst.name}', reason: #{error.reason}"
234 + )
235 +
236 + state
217 237 end
218 238 end
219 239
@@ -224,9 +244,14 @@ defmodule RoomGtfs.Worker.RT do
224 244
225 245 val ->
226 246 case fetch_rt_url(val) do
227 − {:ok, data_tu} -> state |> Map.put(:rt_tu, data_tu)
247 + {:ok, data_tu} ->
248 + state |> Map.put(:rt_tu, data_tu)
249 +
228 250 {:error, error} ->
229 − Logger.info("failed to fetch gtfs-rt url[tu] for '#{state.inst.name}', reason: #{error.reason}")
251 + Logger.info(
252 + "failed to fetch gtfs-rt url[tu] for '#{state.inst.name}', reason: #{error.reason}"
253 + )
254 +
230 255 state
231 256 end
232 257 end
@@ -238,9 +263,14 @@ defmodule RoomGtfs.Worker.RT do
238 263
239 264 val ->
240 265 case fetch_rt_url(val) do
241 − {:ok, data_vp} -> state |> Map.put(:rt_vp, data_vp)
266 + {:ok, data_vp} ->
267 + state |> Map.put(:rt_vp, data_vp)
268 +
242 269 {:error, error} ->
243 − Logger.info("failed to fetch gtfs-rt url[vp] for '#{state.inst.name}', reason: #{error.reason}")
270 + Logger.info(
271 + "failed to fetch gtfs-rt url[vp] for '#{state.inst.name}', reason: #{error.reason}"
272 + )
273 +
244 274 state
245 275 end
246 276 end
@@ -249,7 +279,7 @@ defmodule RoomGtfs.Worker.RT do
249 279 end
250 280
251 281 def handle_call({:query_realtime, trips, stop}, _from, state) do
252 −# IO.inspect(trips)
282 + # IO.inspect(trips)
253 283
254 284 # filter out the protobuf for all relevant trips and then the relevant stop on that trip, nice and small
255 285 relevant_trips =
@@ -264,6 +294,7 @@ defmodule RoomGtfs.Worker.RT do
264 294 |> List.first()
265 295 )
266 296 end)
297 +
267 298 {:reply, relevant_trips, state}
268 299 end
269 300 end

Parents: 14f18ca