Skip to content

Instantly share code, notes, and snippets.

@Svenito
Last active September 1, 2020 10:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Svenito/67436096c5c217706beee9aaa893f787 to your computer and use it in GitHub Desktop.
Save Svenito/67436096c5c217706beee9aaa893f787 to your computer and use it in GitHub Desktop.
defmodule Project.DictionaryFilter do
import Ecto.Query, warn: false
def create_val(val) do
if is_bitstring(val) && String.starts_with?(val, "self.") do
val = String.replace(val, "self.", "")
dynamic([q], field(q, ^String.to_atom(val)))
else
val
end
end
def create_query(name, op, val) do
field_value = create_val(val)
case op do
"gte" -> dynamic([q], field(q, ^String.to_atom(name)) >= ^field_value)
"gt" -> dynamic([q], field(q, ^String.to_atom(name)) > ^field_value)
"lt" -> dynamic([q], field(q, ^String.to_atom(name)) < ^field_value)
"lte" -> dynamic([q], field(q, ^String.to_atom(name)) <= ^field_value)
"eq" -> dynamic([q], field(q, ^String.to_atom(name)) == ^field_value)
"neq" -> dynamic([q], field(q, ^String.to_atom(name)) != ^field_value)
"startswith" -> dynamic([q], like(field(q, ^String.to_atom(name)), ^"#{val}%"))
"istartswith" -> dynamic([q], ilike(field(q, ^String.to_atom(name)), ^"#{val}%"))
"endswith" -> dynamic([q], like(field(q, ^String.to_atom(name)), ^"%#{val}"))
"iendswith" -> dynamic([q], ilike(field(q, ^String.to_atom(name)), ^"%#{val}"))
"contains" -> dynamic([q], like(field(q, ^String.to_atom(name)), ^"%#{val}%"))
"icontains" -> dynamic([q], ilike(field(q, ^String.to_atom(name)), ^"%#{val}%"))
end
end
def parse_filter(filter) do
case filter do
%{"or" => filters} ->
mapped = Enum.map(filters, fn x -> parse_filter(x) end)
Enum.reduce(mapped, false, fn x, y -> dynamic(^x or ^y) end)
%{"and" => filters} ->
mapped = Enum.map(filters, fn x -> parse_filter(x) end)
Enum.reduce(mapped, false, fn x, y -> dynamic(^x and ^y) end)
%{"name" => name, "op" => op, "val" => val} ->
create_query(name, op, val)
end
end
def get_order_by(query, orderby) do
if String.starts_with?(orderby, "-") do
orderby = String.replace(orderby, "-", "")
order_by(query, [q], desc: field(q, ^String.to_atom(orderby)))
else
order_by(query, [q], field(q, ^String.to_atom(orderby)))
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment