Packages
ash_sql
0.5.2
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.93
0.2.92
0.2.91
0.2.90
0.2.89
0.2.88
0.2.87
0.2.86
0.2.85
0.2.84
0.2.83
0.2.82
0.2.81
0.2.80
0.2.79
0.2.78
0.2.77
0.2.76
0.2.75
0.2.74
0.2.73
0.2.72
0.2.71
0.2.70
0.2.69
0.2.68
0.2.67
0.2.66
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.57
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1-rc.20
0.1.1-rc.19
0.1.1-rc.18
0.1.1-rc.17
0.1.1-rc.16
0.1.1-rc.15
0.1.1-rc.14
0.1.1-rc.13
0.1.1-rc.12
0.1.1-rc.11
0.1.1-rc.10
0.1.1-rc.9
0.1.1-rc.8
0.1.1-rc.7
0.1.1-rc.6
0.1.1-rc.5
0.1.1-rc.4
0.1.1-rc.3
0.1.1-rc.2
0.1.1-rc.1
0.1.1-rc.0
Shared utilities for ecto-based sql data layers.
Current section
Files
Jump to
Current section
Files
lib/implementation.ex
# SPDX-FileCopyrightText: 2024 ash_sql contributors <https://github.com/ash-project/ash_sql/graphs/contributors>
#
# SPDX-License-Identifier: MIT
defmodule AshSql.Implementation do
@moduledoc false
@callback table(Ash.Resource.t()) :: String.t()
@callback schema(Ash.Resource.t()) :: String.t() | nil
@callback repo(Ash.Resource.t(), :mutate | :read) :: module
@callback expr(Ecto.Query.t(), Ash.Expr.t(), map, boolean, AshSql.Expr.ExprInfo.t(), term) ::
{:ok, term, AshSql.Expr.ExprInfo.t()} | {:error, term} | :error
@callback simple_join_first_aggregates(Ash.Resource.t()) :: list(atom)
@callback parameterized_type(
Ash.Type.t() | Ecto.Type.t(),
constraints :: Keyword.t()
) ::
term
@callback storage_type(resource :: Ash.Resource.t(), field :: atom()) :: nil | term
@callback ilike?() :: boolean()
@callback equals_any?() :: boolean()
@callback array_overlap_operator?() :: boolean()
@callback determine_types(module, list(term)) :: {list(term), term} | list(term)
@callback determine_types(module, list(term), returns :: term) ::
{list(term), term} | list(term)
@callback list_aggregate(Ash.Resource.t()) :: String.t() | nil
@callback multicolumn_distinct?() :: boolean
@callback manual_relationship_function() :: atom
@callback manual_relationship_subquery_function() :: atom
@callback require_ash_functions_for_or_and_and?() :: boolean
@callback require_extension_for_citext() :: {true, String.t()} | false
@callback strpos_function() :: String.t()
@callback type_expr(expr :: term, type :: term) :: term
@optional_callbacks determine_types: 3
defmacro __using__(_) do
quote do
@behaviour AshSql.Implementation
require Ecto.Query
def strpos_function, do: "strpos"
def expr(_, _, _, _, _, _), do: :error
def simple_join_first_aggregates(_), do: []
def list_aggregate(_), do: nil
def multicolumn_distinct?, do: true
def require_ash_functions_for_or_and_and?, do: false
def require_extension_for_citext, do: false
def array_overlap_operator?, do: true
def ilike?, do: true
def equals_any?, do: true
def storage_type(_, _), do: nil
def type_expr(expr, type) do
type =
if Ash.Type.ash_type?(type) do
parameterized_type(type, [])
else
type
end
expr =
if is_list(expr) and expr != [] and Keyword.keyword?(expr) do
Map.new(expr)
else
expr
end
Ecto.Query.dynamic(type(^expr, ^type))
end
defoverridable array_overlap_operator?: 0,
equals_any?: 0,
expr: 6,
ilike?: 0,
strpos_function: 0,
require_ash_functions_for_or_and_and?: 0,
require_extension_for_citext: 0,
simple_join_first_aggregates: 1,
type_expr: 2,
storage_type: 2,
list_aggregate: 1,
multicolumn_distinct?: 0
end
end
end