diff --git a/lib/aprsme_web/channels/mobile_channel.ex b/lib/aprsme_web/channels/mobile_channel.ex index f28e6fb..8ef6272 100644 --- a/lib/aprsme_web/channels/mobile_channel.ex +++ b/lib/aprsme_web/channels/mobile_channel.ex @@ -380,23 +380,27 @@ defmodule AprsmeWeb.MobileChannel do "#{query}%" end - # Query for matching callsigns + # Query for matching callsigns - optimized version + # Use a subquery to get only the most recent packet per sender results = try do - Aprsme.Repo.all( + subquery = from p in Aprsme.Packet, - where: ilike(p.sender, ^pattern) or ilike(p.base_callsign, ^pattern), - distinct: true, + where: ilike(p.sender, ^pattern), + distinct: p.sender, select: %{ callsign: p.sender, base_callsign: p.base_callsign, - last_seen: p.received_at, - lat: p.lat, - lon: p.lon + last_seen: max(p.received_at), + # Use first_value for lat/lon from most recent packet + lat: fragment("(array_agg(? ORDER BY ? DESC))[1]", p.lat, p.received_at), + lon: fragment("(array_agg(? ORDER BY ? DESC))[1]", p.lon, p.received_at) }, - order_by: [desc: p.received_at], + group_by: [p.sender, p.base_callsign], + order_by: [desc: max(p.received_at)], limit: ^limit - ) + + Aprsme.Repo.all(subquery) rescue error -> Logger.error("Error searching callsigns: #{inspect(error)}") diff --git a/lib/aprsme_web/live/map_live/index.ex b/lib/aprsme_web/live/map_live/index.ex index 912ee65..3da5274 100644 --- a/lib/aprsme_web/live/map_live/index.ex +++ b/lib/aprsme_web/live/map_live/index.ex @@ -1337,24 +1337,6 @@ defmodule AprsmeWeb.MapLive.Index do } -
-
- - -