2020-01-22 23:55:07 +00:00
|
|
|
defmodule Mobilizon.Service.Workers.BuildSearch do
|
2019-10-22 08:25:28 +00:00
|
|
|
@moduledoc """
|
2019-11-04 14:10:58 +00:00
|
|
|
Worker to build search results
|
2019-10-22 08:25:28 +00:00
|
|
|
"""
|
|
|
|
|
2020-01-28 19:15:59 +00:00
|
|
|
alias Ecto.Adapters.SQL
|
|
|
|
|
2019-11-04 14:10:58 +00:00
|
|
|
alias Mobilizon.Events
|
2019-10-22 08:25:28 +00:00
|
|
|
alias Mobilizon.Events.Event
|
2020-06-24 14:33:59 +00:00
|
|
|
alias Mobilizon.Service.Formatter.HTML
|
2019-10-22 08:25:28 +00:00
|
|
|
alias Mobilizon.Storage.Repo
|
|
|
|
|
2020-01-22 23:55:07 +00:00
|
|
|
use Mobilizon.Service.Workers.Helper, queue: "search"
|
2019-11-04 14:10:58 +00:00
|
|
|
|
|
|
|
@impl Oban.Worker
|
2020-08-12 12:34:19 +00:00
|
|
|
def perform(%Job{
|
|
|
|
args: %{"op" => "insert_search_event", "event_id" => event_id}
|
|
|
|
}) do
|
2019-11-04 14:10:58 +00:00
|
|
|
with {:ok, %Event{} = event} <- Events.get_event_with_preload(event_id) do
|
|
|
|
insert_search_event(event)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-08-12 12:34:19 +00:00
|
|
|
def perform(%Job{
|
|
|
|
args: %{"op" => "update_search_event", "event_id" => event_id}
|
|
|
|
}) do
|
2019-11-04 14:10:58 +00:00
|
|
|
with {:ok, %Event{} = event} <- Events.get_event_with_preload(event_id) do
|
2019-11-15 17:36:47 +00:00
|
|
|
insert_search_event(event)
|
2019-11-04 14:10:58 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-10-22 08:25:28 +00:00
|
|
|
def insert_search_event(%Event{} = event) do
|
|
|
|
SQL.query(
|
|
|
|
Repo,
|
|
|
|
"""
|
|
|
|
INSERT INTO event_search(id, title, document) VALUES ($1, $2, (
|
|
|
|
SELECT
|
|
|
|
setweight(to_tsvector(unaccent($2)), 'A') ||
|
|
|
|
setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
|
|
|
|
setweight(to_tsvector(unaccent($3)), 'C')
|
|
|
|
)
|
2019-11-15 17:36:47 +00:00
|
|
|
) ON CONFLICT (id) DO UPDATE SET title = $2, document = (
|
|
|
|
SELECT
|
|
|
|
setweight(to_tsvector(unaccent($2)), 'A') ||
|
|
|
|
setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
|
|
|
|
setweight(to_tsvector(unaccent($3)), 'C')
|
|
|
|
);
|
2019-10-22 08:25:28 +00:00
|
|
|
""",
|
|
|
|
[
|
|
|
|
event.id,
|
|
|
|
event.title,
|
2020-07-31 09:19:42 +00:00
|
|
|
HTML.strip_tags_and_insert_spaces(event.description),
|
2019-10-22 08:25:28 +00:00
|
|
|
get_tags_string(event)
|
|
|
|
]
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
defp get_tags_string(%Event{tags: tags}) do
|
|
|
|
tags
|
|
|
|
|> Enum.map(& &1.title)
|
|
|
|
|> Enum.join(" ")
|
|
|
|
end
|
|
|
|
end
|