Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. defmodule Filters do
  2. import Ecto.{Query}, warn: false
  3.  
  4. defmacro __using__(_opts) do
  5. quote do
  6. defp apply_filters(original_query, params) do
  7. filters = create_filters(params)
  8.  
  9. query =
  10. try do
  11. Enum.reduce(filters, original_query, &filter/2)
  12. rescue
  13. _ -> original_query
  14. end
  15.  
  16. maybe_apply_defaults(query, original_query, filters)
  17. end
  18.  
  19. defp maybe_apply_defaults(query, original_query, filters) when query == original_query,
  20. do: Enum.reduce(filters, query, &defaults/2)
  21.  
  22. defp maybe_apply_defaults(query, _, _), do: query
  23.  
  24. defp condition_bools(filters) do
  25. Enum.map(filters, fn
  26. {key, "true"} -> {key, true}
  27. {key, "false"} -> {key, false}
  28. {key, value} -> {key, value}
  29. end)
  30. end
  31.  
  32. defp filter_parameters(filters) do
  33. Enum.filter(filters, fn
  34. {_, nil} -> false
  35. {_, ""} -> false
  36. {key, value} -> true
  37. _ -> false
  38. end)
  39. end
  40.  
  41. defp convert_string_keys(filters) do
  42. Enum.map(filters, fn
  43. {key, value} when is_binary(key) -> {String.to_existing_atom(key), value}
  44. {key, value} -> {key, value}
  45. end)
  46. end
  47.  
  48. defp create_filters(%{"q" => parameters}) do
  49. parameters
  50. |> filter_parameters()
  51. |> condition_bools()
  52. |> convert_string_keys()
  53. end
  54.  
  55. defp create_filters(_), do: []
  56.  
  57. defp defaults({key, value}, query) do
  58. from(
  59. [c] in query,
  60. where: field(c, ^key) == ^value
  61. )
  62. end
  63.  
  64. defp defaults(_, query), do: query
  65. end
  66. end
  67. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement