but I’m wondering … should I be scared of the quoted format. I’m not sure why I should not just produce it from my parser and put it into a macro?
iex(162)> quote do
...(162)> from c in City, where: (c.country == "Sweden") or
...(162)> (c.country == "USA" and c.name == "New York")
...(162)> end
{:from, [context: Elixir, import: Ecto.Query],
[{:in, [context: Elixir, import: Kernel],
[{:c, [], Elixir}, {:__aliases__, [alias: false], [:City]}]},
[where: {:or, [context: Elixir, import: Kernel],
[{:==, [context: Elixir, import: Kernel],
[{{:., [], [{:c, [], Elixir}, :country]}, [], []}, "Sweden"]},
{:and, [context: Elixir, import: Kernel],
[{:==, [context: Elixir, import: Kernel],
[{{:., [], [{:c, [], Elixir}, :country]}, [], []}, "USA"]},
{:==, [context: Elixir, import: Kernel],
[{{:., [], [{:c, [], Elixir}, :name]}, [], []}, "New York"]}
]}
]}
]
]}
iex(164)> "city where country='Sweden' or (country='USA' and name='New York')" |>
...(164)> to_charlist() |> :lexer.string() |>
...(164)> (fn {_, x, _} -> x end).() |> :parser.parse() |>
...(164)> (fn {_, x} -> x end).()
{:where, {:domain, 'city'},
{:atom_or,
{{:operator, :cmp_eq}, ['country'], 'Sweden'},
{:atom_and,
{{:operator, :cmp_eq}, ['country'], 'USA'},
{{:operator, :cmp_eq}, ['name'], 'New York'}}}}