Packages
ash_sql
0.5.1
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
# SPDX-FileCopyrightText: 2024 ash_sql contributors <https://github.com/ash-project/ash_sql/graphs/contributors>
#
# SPDX-License-Identifier: MIT
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 explicitly_set_binding(query, data, to) do
%{
query
| __ash_bindings__: %{
query.__ash_bindings__
| bindings: Map.put(query.__ash_bindings__.bindings, to, data)
}
}
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
default_start_bindings =
if context[:data_layer][:lateral_join_source] do
500
else
0
end
requested_start = context[:data_layer][:start_bindings_at] || 0
start_bindings =
if requested_start == 0 do
default_start_bindings
else
requested_start
end
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.Resource.Info.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