I am implementing select merge to build a query for aggregate functions. This is my code
Enum.reduce(opts_aggregate, queryable, fn {aggregate_type, fields}, queryable ->
case aggregate_type do
"$max" ->
case fields do
fields when is_list(fields) ->
Enum.reduce(fields, queryable, fn field, queryable ->
build_max(queryable, field)
end)
field when is_binary(field) ->
build_max(queryable, field)
end
"$min" ->
case fields do
fields when is_list(fields) ->
Enum.reduce(fields, queryable, fn field, queryable ->
build_min(queryable, field)
end)
field when is_binary(field) ->
build_min(queryable, field)
end
end)
def build_max(queryable, field) do
field = Helper.string_to_atom(field)
from(q in queryable,
select_merge: %{"$aggregate": %{"$max": %{^field => max(field(q, ^field))}}}
)
end
def build_min(queryable, field) do
field = Helper.string_to_atom(field)
from(q in queryable,
select_merge: %{"$aggregate": %{"$min": %{^field => min(field(q, ^field))}}}
)
end
The params are :
opts = %{
"$aggregate" => %{
"$max" => "level",
"$min" => "beds"
}
}
This is the query i get in returned
select: merge(merge(f, %{"$aggregate": %{"$max": %{^:level => max(f.level)}}}), %{"$aggregate": %{"$min": %{^:level => min(f.beds)}}})>
I am getting level
key in both queries.
%{"$max": %{^:level => max(f.level)
%{"$min": %{^:level => min(f.beds)
Am I doing something wrong? Or this is ecto issue?
Is it possible instead of multiple nested merges inside the query I just get query like this:
select: merge(f, %{"$aggregate": %{"$max": %{^:level => max(f.level)}}}), %{"$aggregate": %{"$min": %{^:level => min(f.beds)}}})>
Thanks