#1308 Fix group sorting and add new criteria (creation date, last event activity)

This commit is contained in:
Massedil
2024-10-24 19:03:55 +02:00
parent 41aa81097d
commit 6ff3525764
4 changed files with 91 additions and 21 deletions

View File

@@ -57,7 +57,8 @@ defmodule Mobilizon.GraphQL.API.Search do
current_actor_id: Map.get(args, :current_actor_id),
exclude_my_groups: Map.get(args, :exclude_my_groups, false),
exclude_stale_actors: true,
local_only: Map.get(args, :search_target, :internal) == :self
local_only: Map.get(args, :search_target, :internal) == :self,
sort_by: Map.get(args, :sort_by)
],
page,
limit

View File

@@ -171,7 +171,11 @@ defmodule Mobilizon.GraphQL.Schema.SearchType do
enum :search_group_sort_options do
value(:match_desc, description: "The pertinence of the result")
value(:member_count_desc, description: "The members count of the group")
value(:member_count_asc, description: "The members count of the group ascendant order")
value(:member_count_desc, description: "The members count of the group descendent order")
value(:created_at_asc, description: "When the group was created ascendant order")
value(:created_at_desc, description: "When the group was created descendent order")
value(:last_event_activity, description: "Last event activity of the group")
end
enum :search_event_sort_options do

View File

@@ -13,6 +13,7 @@ defmodule Mobilizon.Actors do
alias Mobilizon.Actors.{Actor, Bot, Follower, Member}
alias Mobilizon.Addresses.Address
alias Mobilizon.Crypto
alias Mobilizon.Events.Event
alias Mobilizon.Events.FeedToken
alias Mobilizon.Medias
alias Mobilizon.Service.Workers
@@ -518,7 +519,6 @@ defmodule Mobilizon.Actors do
query = from(a in Actor)
query
|> distinct([q], q.id)
|> actor_by_username_or_name_query(term)
|> maybe_join_address(
Keyword.get(options, :location),
@@ -532,8 +532,56 @@ defmodule Mobilizon.Actors do
|> filter_by_minimum_visibility(Keyword.get(options, :minimum_visibility, :public))
|> filter_suspended(false)
|> filter_out_anonymous_actor_id(anonymous_actor_id)
# order_by
|> actor_order(Keyword.get(options, :sort_by, :match_desc))
end
# sort by most recent id if "best match"
defp actor_order(query, :match_desc) do
query
|> order_by([q], desc: q.id)
end
defp actor_order(query, :last_event_activity) do
query
|> join(:left, [q], e in Event, on: e.attributed_to_id == q.id)
|> group_by([q, e], q.id)
|> order_by([q, e], [
# put groups with no events at the end of the list
fragment("MAX(?) IS NULL", e.updated_at),
# last edited event of the group
desc: max(e.updated_at),
# sort group with no event by id
desc: q.id
])
end
defp actor_order(query, :member_count_asc) do
query
|> join(:left, [q], m in Member, on: m.parent_id == q.id)
|> group_by([q, m], q.id)
|> order_by([q, m], asc: count(m.id), asc: q.id)
end
defp actor_order(query, :member_count_desc) do
query
|> join(:left, [q], m in Member, on: m.parent_id == q.id)
|> group_by([q, m], q.id)
|> order_by([q, m], desc: count(m.id), desc: q.id)
end
defp actor_order(query, :created_at_asc) do
query
|> order_by([q], asc: q.inserted_at)
end
defp actor_order(query, :created_at_desc) do
query
|> order_by([q], desc: q.inserted_at)
end
defp actor_order(query, _), do: query
@doc """
Gets a group by its title.
"""
@@ -1394,16 +1442,6 @@ defmodule Mobilizon.Actors do
^username
)
)
|> order_by(
[a],
fragment(
"word_similarity(?, ?) + word_similarity(coalesce(?, ''), ?) desc",
a.preferred_username,
^username,
a.name,
^username
)
)
end
@spec maybe_join_address(