-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcompose_search_query.ex
28 lines (25 loc) · 1.03 KB
/
compose_search_query.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
defmodule DeerStorage.DbHelpers.ComposeSearchQuery do
import Ecto.Query
def compose_search_query(columns, string) do
filters = string
|> String.replace("*", "%")
|> String.split
|> Enum.map(fn word ->
wrapped_word = "%#{word}%"
Keyword.new columns, (fn key -> {key, wrapped_word} end)
end)
dynamic(^recursive_dynamic_query(filters))
end
defp recursive_dynamic_query([{key, value} | []]), do: dynamic(^recursive_dynamic_query(key, value))
defp recursive_dynamic_query([arr | []]), do: dynamic(^recursive_dynamic_query(arr))
defp recursive_dynamic_query([{key, value}|rest]) do
dynamic(^recursive_dynamic_query(key, value) or ^recursive_dynamic_query(rest))
end
defp recursive_dynamic_query([first | rest]) when length(rest) < 5 do
dynamic(^recursive_dynamic_query(first) and ^recursive_dynamic_query(rest))
end
defp recursive_dynamic_query(_), do: nil
defp recursive_dynamic_query(key, value) do
dynamic([q], fragment("unaccent(?) ILIKE unaccent(?)", field(q, ^key), ^value))
end
end