AB
Size: a a a
AB
ML
AM
AK
B
ŹR
AB
AK
P
B
P
FM
FM
BB
BB
BB
BB
def by_item_ids(queryable, %{products: ids}) do
ids_count = length(ids)
queryable
|> join(:left, [recipe], item in subquery(count_items_in_array(queryable, ids)), on: item.recipe_id == recipe.id)
|> group_by([_,i], i.count)
|> having([_, items], items.count >= ^ids_count)
end
def by_item_ids(queryable, _) do
queryable
end
def count_items_in_array(queryable, ids) do
queryable
|> join(:left, [recipe], item in assoc(recipe, :items))
|> group_by([r], r.id)
|> where([_, item], item.id in ^ids)
|> select([r,i], %{count: count(i.id), recipe_id: r.id})
end
BB
it is not possible to return a map/struct subset of a subquery, you must explicitly select the whole subquery or individual fields only in query: