如何将方解石逻辑计划转换为另一个数据引擎的物理计划?

How to convert Calcite Logical plan to another data engine's physical plan?

我正在尝试使用 Calcite 为 Apache - IoTDB(时间序列数据库)设计关系 table 结构和标准 SQL 查询。现在我想知道如何轻松地将 Calcite 的逻辑计划转换为 IoTDB 自己的物理计划。

例如,我执行一个简单的查询:

SELECT deviceid, temperature FROM root_ln WHERE deviceid = 'd1'

经过Calcite解析后,RelNodes表示的Logical Plan是这样的:

LogicalProject(DEVICEID=[], TEMPERATURE=[])
  LogicalFilter(condition=[=(, 'd1')])
    EnumerableTableScan(table=[[IoTDBSchema, ROOT_LN]])

并且我想将其转换为IoTDB自己的物理计划,我需要提供:(只是简单的例子)

  1. 项目的路径,如root.ln.d1.temperature,我们通过这些路径执行查询。我必须将 tablename(root.ln)deviceid(d1)measurement(temperature) 放在一起才能得到完整的路径。这需要扫描整个逻辑计划。
  2. 项目的数据类型,如浮点数。我可以从路径中获取它,这很简单。
  3. Filter的表达式,我得把LogicalFilter的表达式再转换成IoTDB的表达式,包括解析本例中的意思。

我认为这涉及太多工作。当查询变得更复杂时,转换也变得更困难。

所以我认为也许有更简单的方法来完成这项工作。

为特定数据源创建物理计划的标准方法是为该数据源创建适配器。这相当于编写可以将逻辑运算符转换为物理运算符的规则。这允许数据源指定它可以实现哪些逻辑运算符以及如何实现。