Packages
ash_sql
0.2.33
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/bindings.ex
defmodule AshSql.Bindings do
@moduledoc false
@doc false
def add_binding(query, data, additional_bindings \\ 0) do
current = query.__ash_bindings__.current
bindings = query.__ash_bindings__.bindings
new_ash_bindings = %{
query.__ash_bindings__
| bindings: Map.put(bindings, current, data),
current: current + 1 + additional_bindings
}
%{query | __ash_bindings__: new_ash_bindings}
end
def merge_expr_accumulator(query, acc) do
update_in(
query.__ash_bindings__.expression_accumulator,
&AshSql.Expr.merge_accumulator(&1, acc)
)
end
def default_bindings(query, resource, sql_behaviour, context \\ %{})
def default_bindings(%{__ash_bindings__: _} = query, _resource, _sql_behaviour, _context),
do: query
def default_bindings(query, resource, sql_behaviour, context) do
start_bindings = context[:data_layer][:start_bindings_at] || 0
Map.put_new(query, :__ash_bindings__, %{
resource: resource,
sql_behaviour: sql_behaviour,
current: Enum.count(query.joins) + 1 + start_bindings,
expression_accumulator: %AshSql.Expr.ExprInfo{},
in_group?: false,
calculations: %{},
parent_resources: [],
aggregate_defs: %{},
current_aggregate_name: :aggregate_0,
current_calculation_name: :calculation_0,
aggregate_names: %{},
calculation_names: %{},
context: context,
root_binding: start_bindings,
bindings: %{start_bindings => %{path: [], type: :root, source: resource}}
})
end
@doc false
def get_binding(resource, candidate_path, %{__ash_bindings__: _} = query, types) do
types = List.wrap(types)
Enum.find_value(query.__ash_bindings__.bindings, fn
{binding, %{path: path, source: source, type: type}} ->
if type in types &&
Ash.SatSolver.synonymous_relationship_paths?(resource, path, candidate_path, source) do
binding
end
_ ->
nil
end)
end
def get_binding(_, _, _, _), do: nil
def add_parent_bindings(data_layer_query, %{data_layer: %{parent_bindings: parent_bindings}})
when not is_nil(parent_bindings) do
new_bindings =
data_layer_query.__ash_bindings__
|> Map.put(:parent_bindings, Map.put(parent_bindings, :parent?, true))
|> Map.put(:parent_resources, [
parent_bindings.resource | parent_bindings[:parent_resources] || []
])
|> Map.put(:lateral_join?, true)
%{data_layer_query | __ash_bindings__: new_bindings}
end
def add_parent_bindings(data_layer_query, _context) do
data_layer_query
end
end