Skip to content

Instantly share code, notes, and snippets.

@sillypog
Last active November 30, 2016 01:16
Show Gist options
  • Save sillypog/dd74e29337e2dba48c78ceb03f50481d to your computer and use it in GitHub Desktop.
Save sillypog/dd74e29337e2dba48c78ceb03f50481d to your computer and use it in GitHub Desktop.
Portmeirion.IdentifyController V3
defp where_clause(query, params) do
# Get just the credentials params from the full params - can I use a struct for that?
# Turn that into a key value list
# Pass to a where_fragment method that matched on list length
# Return fragment of appropriate size
allowed_params = ~w(login_id facebook_id device_id prism_id)
key_values = params
|> Enum.filter(fn({key, _}) -> Enum.member?(allowed_params, key) end)
|> Enum.map(fn({key, value}) -> [String.to_existing_atom(key), cast_param(key, value)] end)
|> Enum.sort # Ensure device_id is always first if present
|> List.flatten
where_fragment(query, key_values)
end
defp where_fragment(query, [:device_id, v1]), do: from [u, d] in query, where: fragment("? = ?", d.device_id, ^v1)
defp where_fragment(query, [k1, v1]), do: from u in query, where: fragment("? = ?", field(u, ^k1), ^v1)
defp where_fragment(query, [:device_id, v1, k2, v2]) do
from [u, d] in query, where: fragment("? = ? OR ? = ?", d.device_id, ^v1, field(u, ^k2), ^v2)
end
defp where_fragment(query, [k1, v1, k2, v2]) do
from u in query, where: fragment("? = ? OR ? = ?", field(u, ^k1), ^v1, field(u, ^k2), ^v2)
end
defp where_fragment(query, [:device_id, v1, k2, v2, k3, v3]) do
from [u, d] in query, where: fragment("? = ? OR ? = ? OR ? = ?", d.device_id, ^v1, field(u, ^k2), ^v2, field(u, ^k3), ^v3)
end
defp where_fragment(query, [k1, v1, k2, v2, k3, v3]) do
from u in query, where: fragment("? = ? OR ? = ? OR ? = ?", field(u, ^k1), ^v1, field(u, ^k2), ^v2, field(u, ^k3), ^v3)
end
defp where_fragment(query, [:device_id, v1, k2, v2, k3, v3, k4, v4]) do
from [u, d] in query, where: fragment("? = ? OR ? = ? OR ? = ? OR ? = ?", d.device_id, ^v1, field(u, ^k2), ^v2, field(u, ^k3), ^v3, field(u, ^k4), ^v4)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment