defmodule Mix.Tasks.Cairnloop.Retrieval.Rebuild do
use Mix.Task
@shortdoc "Enqueue retrieval rebuild jobs for a scoped corpus"
@moduledoc """
Rebuild retrieval corpus state through `Cairnloop.Retrieval`.
Examples:
mix cairnloop.retrieval.rebuild --corpus knowledge_base --revision-id 42
mix cairnloop.retrieval.rebuild --corpus resolved_cases --conversation-id 7
"""
@switches [corpus: :string, revision_id: :keep, conversation_id: :keep]
@impl Mix.Task
def run(args) do
{opts, _, _} = OptionParser.parse(args, strict: @switches)
corpus =
opts
|> Keyword.fetch!(:corpus)
|> String.to_existing_atom()
rebuild_opts =
[corpus: corpus]
|> maybe_put_ids(:revision_ids, Keyword.get_values(opts, :revision_id))
|> maybe_put_ids(:conversation_ids, Keyword.get_values(opts, :conversation_id))
case retrieval_module().rebuild_corpus(rebuild_opts) do
{:ok, jobs} ->
Mix.shell().info("Enqueued #{length(jobs)} rebuild job(s) for #{corpus}")
{:error, reason} ->
Mix.raise("Retrieval rebuild failed: #{inspect(reason)}")
end
end
defp maybe_put_ids(opts, _key, []), do: opts
defp maybe_put_ids(opts, key, values),
do: Keyword.put(opts, key, Enum.map(values, &String.to_integer/1))
defp retrieval_module do
Application.get_env(:cairnloop, :retrieval_module, Cairnloop.Retrieval)
end
end