X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fuser.ex;h=3c6fb4f9b614f46ed9f9a225527bc64ad9322e89;hb=f635b675b2cc0bc10b395cd71ae1720b0696d364;hp=12e0e818ebf0f6951603e53facb56245c5fb1a26;hpb=90d0d055fccc630066e66627281432e382aefdb1;p=akkoma diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 12e0e818e..3c6fb4f9b 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -755,30 +755,47 @@ defmodule Pleroma.User do Repo.all(query) end - def search(query, resolve \\ false, for_user \\ nil) do + def search(term, options \\ %{}) do # Strip the beginning @ off if there is a query - query = String.trim_leading(query, "@") + term = String.trim_leading(term, "@") + query = options[:query] || User - if resolve, do: get_or_fetch(query) + if options[:resolve], do: get_or_fetch(term) - fts_results = do_search(fts_search_subquery(query), for_user) + fts_results = + do_search(fts_search_subquery(term, query), options[:for_user], limit: options[:limit]) {:ok, trigram_results} = Repo.transaction(fn -> Ecto.Adapters.SQL.query(Repo, "select set_limit(0.25)", []) - do_search(trigram_search_subquery(query), for_user) + + do_search(trigram_search_subquery(term, query), options[:for_user], limit: options[:limit]) end) Enum.uniq_by(fts_results ++ trigram_results, & &1.id) end - def all_except_one(user) do - query = from(u in User, where: u.id != ^user.id) + def all(page, page_size) do + from( + u in User, + limit: ^page_size, + offset: ^((page - 1) * page_size), + order_by: u.id + ) + |> Repo.all() + end - Repo.all(query) + def count_all_except_one(user) do + query = + from( + u in User, + where: u.id != ^user.id + ) + + Repo.aggregate(query, :count, :id) end - defp do_search(subquery, for_user, options \\ []) do + defp do_search(subquery, for_user, options) do q = from( s in subquery(subquery), @@ -794,9 +811,9 @@ defmodule Pleroma.User do boost_search_results(results, for_user) end - defp fts_search_subquery(query) do + defp fts_search_subquery(term, query) do processed_query = - query + term |> String.replace(~r/\W+/, " ") |> String.trim() |> String.split() @@ -804,7 +821,7 @@ defmodule Pleroma.User do |> Enum.join(" | ") from( - u in User, + u in query, select_merge: %{ search_rank: fragment( @@ -834,19 +851,19 @@ defmodule Pleroma.User do ) end - defp trigram_search_subquery(query) do + defp trigram_search_subquery(term, query) do from( - u in User, + u in query, select_merge: %{ search_rank: fragment( "similarity(?, trim(? || ' ' || coalesce(?, '')))", - ^query, + ^term, u.nickname, u.name ) }, - where: fragment("trim(? || ' ' || coalesce(?, '')) % ?", u.nickname, u.name, ^query) + where: fragment("trim(? || ' ' || coalesce(?, '')) % ?", u.nickname, u.name, ^term) ) end @@ -1003,6 +1020,10 @@ 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 + end + def local_user_query do from( u in User, @@ -1193,9 +1214,6 @@ defmodule Pleroma.User do def parse_bio(bio, _user) when bio == "", do: bio def parse_bio(bio, user) do - mentions = Formatter.parse_mentions(bio) - tags = Formatter.parse_tags(bio) - emoji = (user.info.source_data["tag"] || []) |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) @@ -1204,7 +1222,8 @@ defmodule Pleroma.User do end) bio - |> CommonUtils.format_input(mentions, tags, "text/plain", user_links: [format: :full]) + |> CommonUtils.format_input("text/plain", mentions_format: :full) + |> elem(0) |> Formatter.emojify(emoji) end