2022-08-24 11:56:46 +12:00
|
|
|
defmodule AshPostgres.DataLayer.Info do
|
|
|
|
@moduledoc "Introspection functions for "
|
|
|
|
|
|
|
|
alias Spark.Dsl.Extension
|
|
|
|
|
|
|
|
@doc "The configured repo for a resource"
|
2023-11-15 04:56:22 +13:00
|
|
|
def repo(resource, type \\ :mutate) do
|
|
|
|
case Extension.get_opt(resource, [:postgres], :repo, nil, true) do
|
|
|
|
fun when is_function(fun, 2) ->
|
|
|
|
fun.(resource, type)
|
|
|
|
|
|
|
|
repo ->
|
|
|
|
repo
|
|
|
|
end
|
2022-08-24 11:56:46 +12:00
|
|
|
end
|
|
|
|
|
2024-03-28 09:52:28 +13:00
|
|
|
@doc "Checks a version requirement against the resource's repo's postgres version"
|
|
|
|
def pg_version_matches?(resource, requirement) do
|
|
|
|
resource
|
2024-03-28 12:20:49 +13:00
|
|
|
|> min_pg_version()
|
2024-03-28 09:52:28 +13:00
|
|
|
|> Version.match?(requirement)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "Gets the resource's repo's postgres version"
|
2024-03-28 12:20:49 +13:00
|
|
|
def min_pg_version(resource) do
|
|
|
|
case repo(resource, :read).min_pg_version() do
|
2024-03-28 09:52:28 +13:00
|
|
|
%Version{} = version -> version
|
|
|
|
string when is_binary(string) -> Version.parse!(string)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-08-24 11:56:46 +12:00
|
|
|
@doc "The configured table for a resource"
|
|
|
|
def table(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :table, nil, true)
|
|
|
|
end
|
|
|
|
|
2023-06-12 12:33:20 +12:00
|
|
|
def simple_join_first_aggregates(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :simple_join_first_aggregates, [])
|
|
|
|
end
|
|
|
|
|
2022-08-24 11:56:46 +12:00
|
|
|
@doc "The configured schema for a resource"
|
|
|
|
def schema(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :schema, nil, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured references for a resource"
|
|
|
|
def references(resource) do
|
|
|
|
Extension.get_entities(resource, [:postgres, :references])
|
|
|
|
end
|
|
|
|
|
2023-07-28 05:57:42 +12:00
|
|
|
@doc "The configured reference for a given relationship of a resource"
|
|
|
|
def reference(resource, relationship) do
|
|
|
|
resource
|
|
|
|
|> Extension.get_entities([:postgres, :references])
|
|
|
|
|> Enum.find(&(&1.relationship == relationship))
|
|
|
|
end
|
|
|
|
|
2022-08-24 11:56:46 +12:00
|
|
|
@doc "A keyword list of customized migration types"
|
|
|
|
def migration_types(resource) do
|
2022-11-21 20:38:00 +13:00
|
|
|
Extension.get_opt(resource, [:postgres], :migration_types, [])
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "A keyword list of customized migration defaults"
|
|
|
|
def migration_defaults(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :migration_defaults, [])
|
2022-08-24 11:56:46 +12:00
|
|
|
end
|
|
|
|
|
2023-02-01 20:05:04 +13:00
|
|
|
@doc "A list of attributes to be ignored when generating migrations"
|
|
|
|
def migration_ignore_attributes(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :migration_ignore_attributes, [])
|
|
|
|
end
|
|
|
|
|
2022-08-24 11:56:46 +12:00
|
|
|
@doc "The configured check_constraints for a resource"
|
|
|
|
def check_constraints(resource) do
|
|
|
|
Extension.get_entities(resource, [:postgres, :check_constraints])
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured custom_indexes for a resource"
|
|
|
|
def custom_indexes(resource) do
|
|
|
|
Extension.get_entities(resource, [:postgres, :custom_indexes])
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured custom_statements for a resource"
|
|
|
|
def custom_statements(resource) do
|
|
|
|
Extension.get_entities(resource, [:postgres, :custom_statements])
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured polymorphic_reference_on_delete for a resource"
|
|
|
|
def polymorphic_on_delete(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres, :references], :polymorphic_on_delete, nil, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured polymorphic_reference_on_update for a resource"
|
|
|
|
def polymorphic_on_update(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres, :references], :polymorphic_on_update, nil, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured polymorphic_reference_name for a resource"
|
|
|
|
def polymorphic_name(resource) do
|
2024-01-09 02:39:13 +13:00
|
|
|
Extension.get_opt(resource, [:postgres, :references], :polymorphic_name, nil, true)
|
2022-08-24 11:56:46 +12:00
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured polymorphic? for a resource"
|
|
|
|
def polymorphic?(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :polymorphic?, nil, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured unique_index_names"
|
|
|
|
def unique_index_names(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :unique_index_names, [], true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured exclusion_constraint_names"
|
|
|
|
def exclusion_constraint_names(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :exclusion_constraint_names, [], true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The configured identity_index_names"
|
|
|
|
def identity_index_names(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :identity_index_names, [], true)
|
|
|
|
end
|
|
|
|
|
2022-12-21 20:16:30 +13:00
|
|
|
@doc "Identities not to include in the migrations"
|
|
|
|
def skip_identities(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :skip_identities, [], true)
|
|
|
|
end
|
|
|
|
|
2022-08-24 11:56:46 +12:00
|
|
|
@doc "The configured foreign_key_names"
|
|
|
|
def foreign_key_names(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :foreign_key_names, [], true)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "Whether or not the resource should be included when generating migrations"
|
|
|
|
def migrate?(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :migrate?, nil, true)
|
|
|
|
end
|
|
|
|
|
2023-05-03 14:16:21 +12:00
|
|
|
@doc "A list of keys to always include in upserts."
|
|
|
|
def global_upsert_keys(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :global_upsert_keys, [])
|
|
|
|
end
|
|
|
|
|
2022-08-24 11:56:46 +12:00
|
|
|
@doc "A stringified version of the base_filter, to be used in a where clause when generating unique indexes"
|
|
|
|
def base_filter_sql(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :base_filter_sql, nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "Skip generating unique indexes when generating migrations"
|
2022-12-21 20:16:30 +13:00
|
|
|
def skip_unique_indexes(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres], :skip_unique_indexes, [])
|
2022-08-24 11:56:46 +12:00
|
|
|
end
|
|
|
|
|
|
|
|
@doc "The template for a managed tenant"
|
|
|
|
def manage_tenant_template(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres, :manage_tenant], :template, nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "Whether or not to create a tenant for a given resource"
|
|
|
|
def manage_tenant_create?(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres, :manage_tenant], :create?, false)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc "Whether or not to update a tenant for a given resource"
|
|
|
|
def manage_tenant_update?(resource) do
|
|
|
|
Extension.get_opt(resource, [:postgres, :manage_tenant], :update?, false)
|
|
|
|
end
|
|
|
|
end
|