возможно, это не тот путь, но это было мое первоначальное предположение, и я открыт для подсказок и исправлений.
Я писал парсер для сокращенного диалекта запросов, который я частично унаследовал и значительно расширил, что позволяет пользователям писать такие вещи как:
plant where accession.code='2018.0047'
это не готово, но пропущенные промежуточные шаги ясны, кроме последнего: как мне выполнить результат?
В результате я нацеливаю представление эквивалентного запроса Ecto.Query.from
. для приведенного выше примера, насколько мне известно, эквивалент будет:
from(p in "plant",
select: [:id],
join: a in "accession",
on: a.id==p.accession_id,
where: a.code=="2018.0047")
Я изучал структуры, возвращаемые функциями __schema__
, и все выглядит вполне выполнимо. Я имею в виду, что знаю, как извлечь имя таблицы из модулей, а также владельца и связанные модули и ключи из ассоциации, учитывая ее name, поэтому давайте предположим, что мой синтаксический анализатор возвращает это значение:
{:from, [context: Elixir, import: Ecto.Query],
[
{:in, [context: Elixir, import: Kernel], [{:p, [], Elixir}, "plant"]},
[
select: [:id],
join: {:in, [context: Elixir, import: Kernel],
[{:a, [], Elixir}, "accession"]},
on: {:==, [context: Elixir, import: Kernel],
[
{{:., [], [{:a, [], Elixir}, :id]}, [], []},
{{:., [], [{:p, [], Elixir}, :accession_id]}, [], []}
]},
where: {:==, [context: Elixir, import: Kernel],
[{{:., [], [{:a, [], Elixir}, :code]}, [], []}, "2018.0047"]}
]
]}
как заставить Экто выполнить это?
или каков наилучший способ получения кода Elixir из анализатора yecc?