Skip to content

Instantly share code, notes, and snippets.

@talentdeficit
Last active November 12, 2017 20:38
Show Gist options
  • Save talentdeficit/571a15256c77706027c17612857542f1 to your computer and use it in GitHub Desktop.
Save talentdeficit/571a15256c77706027c17612857542f1 to your computer and use it in GitHub Desktop.
defmodule Whatever.Filter do
alias Whatever.Filter, as: Filter
alias Ecto.Query, as: Query
require Ecto.Query
defstruct valid?: true, query: nil, limit: 1000, errors: []
def filter(%Filter{} = s, { "id", id }) do
filter(s, { "id.eq", id })
end
def filter(%Filter{} = s, { "id.eq", id }) do
case s.valid? do
true -> %{ s | query: Query.dynamic([t], t.id == ^id and ^s.query) }
false -> s
end
end
def filter(%Filter{} = s, { "id.in", ids }) do
ids = ids |> String.split(",")
case s.valid? do
true -> %{ s | query: Query.dynamic([t], t.id in ^ids and ^s.query) }
false -> s
end
end
def filter(%Filter{} = s, { "key", key }) do
filter(s, { "key.eq", key })
end
def filter(%Filter{} = s, { "key.eq", key }) do
case s.valid? do
true -> %{ s | query: Query.dynamic([t], t.key == ^key and ^s.query) }
false -> s
end
end
def filter(%Filter{} = s, { "key.in", keys }) do
keys = keys |> String.split(",")
case s.valid? do
true -> %{ s | query: Query.dynamic([t], t.key in ^keys and ^s.query) }
false -> s
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment