aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/user.ex
diff options
context:
space:
mode:
authorMaxim Filippov <colixer@gmail.com>2019-03-02 17:21:18 +0300
committerMaxim Filippov <colixer@gmail.com>2019-03-02 17:21:30 +0300
commit2ec8cf566569912b767e15ab467cadd04fd1fd1c (patch)
treebd5ead581b022123f604d96b9a4191ec4ff801a8 /lib/pleroma/user.ex
parentf635b675b2cc0bc10b395cd71ae1720b0696d364 (diff)
downloadpleroma-2ec8cf566569912b767e15ab467cadd04fd1fd1c.tar.gz
Add pagination to search
Diffstat (limited to 'lib/pleroma/user.ex')
-rw-r--r--lib/pleroma/user.ex110
1 files changed, 64 insertions, 46 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 3c6fb4f9b..230155c33 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -547,11 +547,8 @@ defmodule Pleroma.User do
end
def get_followers_query(user, page) do
- from(
- u in get_followers_query(user, nil),
- limit: 20,
- offset: ^((page - 1) * 20)
- )
+ from(u in get_followers_query(user, nil))
+ |> paginate(page, 20)
end
def get_followers_query(user), do: get_followers_query(user, nil)
@@ -577,11 +574,8 @@ defmodule Pleroma.User do
end
def get_friends_query(user, page) do
- from(
- u in get_friends_query(user, nil),
- limit: 20,
- offset: ^((page - 1) * 20)
- )
+ from(u in get_friends_query(user, nil))
+ |> paginate(page, 20)
end
def get_friends_query(user), do: get_friends_query(user, nil)
@@ -755,47 +749,64 @@ defmodule Pleroma.User do
Repo.all(query)
end
- def search(term, options \\ %{}) do
- # Strip the beginning @ off if there is a query
+ @spec search_for_admin(binary(), %{
+ admin: Pleroma.User.t(),
+ local: boolean(),
+ page: number(),
+ page_size: number()
+ }) :: {:ok, [Pleroma.User.t()], number()}
+ def search_for_admin(term, %{admin: admin, local: local, page: page, page_size: page_size}) do
term = String.trim_leading(term, "@")
- query = options[:query] || User
- if options[:resolve], do: get_or_fetch(term)
+ local_paginated_query =
+ User
+ |> maybe_local_user_query(local)
+ |> paginate(page, page_size)
- fts_results =
- do_search(fts_search_subquery(term, query), options[:for_user], limit: options[:limit])
+ search_query = fts_search_subquery(term, local_paginated_query)
- {:ok, trigram_results} =
- Repo.transaction(fn ->
- Ecto.Adapters.SQL.query(Repo, "select set_limit(0.25)", [])
-
- do_search(trigram_search_subquery(term, query), options[:for_user], limit: options[:limit])
- end)
+ count =
+ term
+ |> fts_search_subquery()
+ |> maybe_local_user_query(local)
+ |> Repo.aggregate(:count, :id)
- Enum.uniq_by(fts_results ++ trigram_results, & &1.id)
+ {:ok, do_search(search_query, admin), count}
end
- def all(page, page_size) do
- from(
- u in User,
- limit: ^page_size,
- offset: ^((page - 1) * page_size),
- order_by: u.id
- )
- |> Repo.all()
+ @spec all_for_admin(number(), number()) :: {:ok, [Pleroma.User.t()], number()}
+ def all_for_admin(page, page_size) do
+ query = from(u in User, order_by: u.id)
+
+ paginated_query =
+ query
+ |> paginate(page, page_size)
+
+ count =
+ query
+ |> Repo.aggregate(:count, :id)
+
+ {:ok, Repo.all(paginated_query), count}
end
- def count_all_except_one(user) do
- query =
- from(
- u in User,
- where: u.id != ^user.id
- )
+ def search(query, resolve \\ false, for_user \\ nil) do
+ # Strip the beginning @ off if there is a query
+ query = String.trim_leading(query, "@")
+
+ if resolve, do: get_or_fetch(query)
+
+ fts_results = do_search(fts_search_subquery(query), for_user)
+
+ {:ok, trigram_results} =
+ Repo.transaction(fn ->
+ Ecto.Adapters.SQL.query(Repo, "select set_limit(0.25)", [])
+ do_search(trigram_search_subquery(query), for_user)
+ end)
- Repo.aggregate(query, :count, :id)
+ Enum.uniq_by(fts_results ++ trigram_results, & &1.id)
end
- defp do_search(subquery, for_user, options) do
+ defp do_search(subquery, for_user, options \\ []) do
q =
from(
s in subquery(subquery),
@@ -811,7 +822,7 @@ defmodule Pleroma.User do
boost_search_results(results, for_user)
end
- defp fts_search_subquery(term, query) do
+ defp fts_search_subquery(term, query \\ User) do
processed_query =
term
|> String.replace(~r/\W+/, " ")
@@ -851,9 +862,9 @@ defmodule Pleroma.User do
)
end
- defp trigram_search_subquery(term, query) do
+ defp trigram_search_subquery(term) do
from(
- u in query,
+ u in User,
select_merge: %{
search_rank:
fragment(
@@ -1020,13 +1031,13 @@ defmodule Pleroma.User do
update_and_set_cache(cng)
end
- def maybe_local_user_query(local) do
- if local, do: local_user_query(), else: User
+ def maybe_local_user_query(query, local) do
+ if local, do: local_user_query(query), else: query
end
- def local_user_query do
+ def local_user_query(query \\ User) do
from(
- u in User,
+ u in query,
where: u.local == true,
where: not is_nil(u.nickname)
)
@@ -1318,4 +1329,11 @@ defmodule Pleroma.User do
)
|> Repo.all()
end
+
+ defp paginate(query, page, page_size) do
+ from(u in query,
+ limit: ^page_size,
+ offset: ^((page - 1) * page_size)
+ )
+ end
end