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
}
-
-
-
-
-