diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 39 | ||||
-rw-r--r-- | lib/pleroma/web/admin_api/admin_api_controller.ex | 10 | ||||
-rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 6 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api_controller.ex | 2 |
4 files changed, 39 insertions, 18 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 52df171c5..af3ce705d 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -755,18 +755,25 @@ defmodule Pleroma.User do Repo.all(query) end - def search(query, resolve \\ false, for_user \\ nil, limit \\ 20) 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, %{limit: limit}) + 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, %{limit: limit}) + + do_search(trigram_search_subquery(term, query), options[:for_user], %{ + limit: options[:limit] + }) end) Enum.uniq_by(fts_results ++ trigram_results, & &1.id) @@ -809,9 +816,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() @@ -819,7 +826,7 @@ defmodule Pleroma.User do |> Enum.join(" | ") from( - u in User, + u in query, select_merge: %{ search_rank: fragment( @@ -849,19 +856,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 @@ -1018,6 +1025,14 @@ defmodule Pleroma.User do update_and_set_cache(cng) end + def maybe_local_user_query(local) when local == true do + local_user_query() + end + + def maybe_local_user_query(local) when local == false do + User + end + def local_user_query do from( u in User, diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex index 37159cd40..a8f9e5012 100644 --- a/lib/pleroma/web/admin_api/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/admin_api_controller.ex @@ -78,8 +78,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do ) end - def search_users(%{assigns: %{user: admin}} = conn, %{"query" => query}) do - users = User.search(query, true, admin, @users_page_size) + def search_users(%{assigns: %{user: admin}} = conn, %{"query" => term} = params) do + users = + User.search(term, + query: User.maybe_local_user_query(params["local"] == "true"), + resolve: true, + for_user: admin, + limit: @users_page_size + ) conn |> json( diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 12987442a..056be49b0 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -894,7 +894,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end def search2(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do - accounts = User.search(query, params["resolve"] == "true", user) + accounts = User.search(query, resolve: params["resolve"] == "true", for_user: user) statuses = status_search(user, query) @@ -919,7 +919,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do - accounts = User.search(query, params["resolve"] == "true", user) + accounts = User.search(query, resolve: params["resolve"] == "true", for_user: user) statuses = status_search(user, query) @@ -941,7 +941,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end def account_search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do - accounts = User.search(query, params["resolve"] == "true", user) + accounts = User.search(query, resolve: params["resolve"] == "true", for_user: user) res = AccountView.render("accounts.json", users: accounts, for: user, as: :user) diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 0d74c30c3..19264a93f 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -702,7 +702,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do end def search_user(%{assigns: %{user: user}} = conn, %{"query" => query}) do - users = User.search(query, true, user) + users = User.search(query, resolve: true, for_user: user) conn |> put_view(UserView) |