也许这不是要走的路,但这是我最初的猜测,我愿意接受提示和更正。
我一直在为我部分继承和扩展的简化查询方言编写解析器,允许用户编写如下内容:
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__
函数返回的结构,一切看起来都很可行,我的意思是我知道如何从模块中提取表名,以及从给定名称的关联中提取所有者和相关模块和键,所以让我们假设我的解析器确实返回了这个值:
{: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"]}
]
]}
如何让 Ecto 执行它?
或者从 yecc 解析器生成 Elixir 代码的最佳方法是什么?