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)
end
- def all_except_one(user, page, page_size) do
+ def all(page, page_size) do
from(
u in User,
- where: u.id != ^user.id,
limit: ^page_size,
offset: ^((page - 1) * page_size),
order_by: u.id
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()
|> Enum.join(" | ")
from(
- u in User,
+ u in query,
select_merge: %{
search_rank:
fragment(
)
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
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,