谁可以使用RelNode对象评估SQL查询

时间:2019-04-26 16:04:57

标签: apache-calcite

我正在尝试将sql查询转换为Tinkerpop Gremlin。 sql2Gremlin库可以做到这一点,但它在我不依赖任何联接方法的情况下将联接视为关系,在这种情况下,您可以将点与关系作为两个实体之间的定界符。

我已经解析并验证了查询,并且拥有RelRoot对象。

Apache方解石返回RelRoot对象,该对象是代数表达式的根。

让我们说我不想应用任何查询优化,如何使用我的RelNode访问者将RelRoot转换为TinkerPop Gremlin DSL。

理想情况下,我将首先使用From子句,然后应用where子句中定义的过滤器?选择,过滤器,From子句如何在RelRoot树中表示?

apache方解石通过关系表达式或RelNode意味着什么?

在没有TinkerPop Gremlin上下文的情况下改述相同的问题: 我应该如何使用RelRoot访问者来访问RelRoot并将查询转换为另一个DSL?

1 个答案:

答案 0 :(得分:0)

我不知道为什么您坚持使用RelRoot而不是RelNode树,但是Apache Calcite正在RelNode堆栈中进行关系代数的优化。您可能会发现一个有趣的类RelVisitor,因为它可以完全满足您的需求:访问所有RelNodes。然后,您可以从他们那里提取所需的信息,并以此来构建DSL。

编辑:在RelVisitor中,您可以访问当前访问的节点的父节点和子节点。您可以提取RelNode对象通常可用的所有信息(请参见docs),如果将其转换为特定的关系代数运算(例如Project),则可以提取哪些字段通过执行Projectnode.getRowType().getFieldList().forEach(field -> names.add(field.getName()))操作内部,其中名称是先前定义的Set<String>。您可以找到完整的代码here

在尝试执行此操作之前,您还应该查看algebra docs,以了解SQL如何映射到方解石中的关系代数。