AshScylla.Migration (AshScylla v0.10.3)

Copy Markdown View Source

CQL schema generation helpers for ScyllaDB.

This module generates raw CQL DDL statements (CREATE TABLE, CREATE INDEX, CREATE TYPE, etc.) from Ash resource definitions. It is NOT an Ecto SQL migration runner — CQL has no transactional DDL concept.

These helpers return CQL strings that you execute via AshScylla.Migrator.run/3 in your migration modules, or directly through your repo at runtime.

Example Migration

defmodule MyApp.Repo.Migrations.CreateUsers do
  def change do
    AshScylla.Migration.create_table_cql(MyApp.User)
    |> then(&AshScylla.Migrator.run!/3)
  end
end

Important Note on create_table_cql/1

This function reads compile-time module attributes set by the Ash resource DSL. For runtime use, prefer Ash.Resource.Info.attributes/1 combined with AshScylla.DataLayer.Dsl.table/1.

Summary

Functions

Generates CQL for altering a UDT (add or rename fields).

Converts an Ash type atom to its CQL type string representation.

Generates CQL CREATE INDEX statements for secondary indexes.

Generates a CQL CREATE TABLE statement for an Ash resource.

Define a User Defined Type (UDT) in ScyllaDB.

Generates CQL for creating a UDT from a type name and field specs.

Generates a CQL DROP INDEX statement for a secondary index.

Drop a User Defined Type (UDT) in ScyllaDB.

Generates CQL for dropping a UDT.

Executes migration CQL via the Migrator.

Returns the keyspace for a resource if configured via DSL. Note: This is a placeholder for future DSL implementation.

Generates CQL to list all UDTs in the keyspace.

Generates CQL to check if a UDT exists.

Functions

alter_type_cql(type_name, action, fields)

@spec alter_type_cql(String.t() | atom(), :add | :rename, [{atom(), atom()}]) ::
  String.t()

Generates CQL for altering a UDT (add or rename fields).

Examples

alter_type_cql("address", :add, [country: :text])
alter_type_cql("address", :rename, [new_zip: :zip_code])

ash_type_to_cql_type(type, opts)

@spec ash_type_to_cql_type(
  atom(),
  keyword()
) :: String.t()

Converts an Ash type atom to its CQL type string representation.

Delegates to AshScylla.DataLayer.Types.ash_type_to_cql_type/2.

Examples

iex> AshScylla.Migration.ash_type_to_cql_type(:uuid, [])
"UUID"

iex> AshScylla.Migration.ash_type_to_cql_type(:string, [])
"TEXT"

iex> AshScylla.Migration.ash_type_to_cql_type(:map, key_type: "TEXT", value_type: "INT")
"MAP<TEXT, INT>"

create_secondary_indexes_cql(resource)

@spec create_secondary_indexes_cql(module()) :: [String.t()]

Generates CQL CREATE INDEX statements for secondary indexes.

Returns a list of CQL strings that should be executed in migrations.

Example

defmodule MyApp.Repo.Migrations.CreateUserIndexes do
  def change do
    AshScylla.Migration.create_secondary_indexes_cql(MyApp.User)
    |> Enum.each(&AshScylla.Migrator.run!/3)
  end
end

create_table_cql(resource)

@spec create_table_cql(module()) :: String.t()

Generates a CQL CREATE TABLE statement for an Ash resource.

Returns a raw CQL string. Execute it in a migration via AshScylla.Migrator.run/3 or directly through your repo at runtime.

create_table_cql(resource, opts)

@spec create_table_cql(
  module(),
  keyword()
) :: String.t()

create_type(type_name, fields)

@spec create_type(
  String.t(),
  keyword()
) :: String.t()
@spec create_type(String.t() | atom(), [{atom(), atom()}]) :: String.t()

Define a User Defined Type (UDT) in ScyllaDB.

Supports two calling styles:

Keyword-list style (with do block)

create_type "full_name" do
  field :first_name, :text
  field :last_name, :text
end

Explicit field-list style

create_type("address", city: :text, street: :text, zip: :text)

Both generate:

CREATE TYPE IF NOT EXISTS <name> (field1 TYPE1, field2 TYPE2)

create_type_cql(type_name, fields)

@spec create_type_cql(String.t() | atom(), [{atom(), atom()}]) :: String.t()

Generates CQL for creating a UDT from a type name and field specs.

Returns a raw CQL string.

drop_secondary_index_cql(resource, index_name)

@spec drop_secondary_index_cql(module(), String.t()) :: String.t()

Generates a CQL DROP INDEX statement for a secondary index.

drop_type(type_name)

@spec drop_type(String.t()) :: String.t()

Drop a User Defined Type (UDT) in ScyllaDB.

drop_type_cql(type_name)

@spec drop_type_cql(String.t() | atom()) :: String.t()

Generates CQL for dropping a UDT.

Returns a raw CQL string.

execute(statements, opts \\ [])

@spec execute(
  [String.t()],
  keyword()
) :: {:ok, [term()]} | {:error, term()}

Executes migration CQL via the Migrator.

keyspace(resource)

@spec keyspace(module()) :: String.t() | nil

Returns the keyspace for a resource if configured via DSL. Note: This is a placeholder for future DSL implementation.

list_types_cql()

@spec list_types_cql() :: String.t()

Generates CQL to list all UDTs in the keyspace.

Returns a raw CQL string.

type_exists_cql(type_name)

@spec type_exists_cql(String.t() | atom()) :: String.t()

Generates CQL to check if a UDT exists.

Returns a raw CQL string.