Current section
Files
Jump to
Current section
Files
lib/mix/tasks/ash_clickhouse.migrate.ex
defmodule Mix.Tasks.AshClickhouse.Migrate do
@moduledoc """
Creates ClickHouse tables for all AshClickhouse resources.
mix ash_clickhouse.migrate
"""
use Mix.Task
alias AshClickhouse.Migration
@impl Mix.Task
def run(_args) do
repos = find_repos()
Enum.each(repos, fn repo ->
resources = find_resources()
Enum.each(resources, fn resource ->
if AshClickhouse.DataLayer.Dsl.migrate?(resource) do
statements = Migration.generate_resource_cql(resource)
Enum.each(statements, fn statement ->
case repo.query(statement, []) do
{:ok, _} ->
Mix.shell().info("Migrated #{inspect(resource)}")
{:error, reason} ->
Mix.shell().error("Failed to migrate #{inspect(resource)}: #{inspect(reason)}")
end
end)
end
end)
end)
end
defp find_repos do
app = Mix.Project.config()[:app]
modules = Application.spec(app, :modules) || []
Enum.filter(modules, fn mod -> function_exported?(mod, :__ash_clickhouse_repo__, 0) end)
rescue
_ -> []
end
defp find_resources do
app = Mix.Project.config()[:app]
modules = Application.spec(app, :modules) || []
Enum.filter(modules, fn mod -> function_exported?(mod, :__ash_clickhouse__, 1) end)
rescue
_ -> []
end
end