我正在尝试将sql查询转换为Tinkerpop Gremlin。 sql2Gremlin库可以做到这一点,但它在我不依赖任何联接方法的情况下将联接视为关系,在这种情况下,您可以将点与关系作为两个实体之间的定界符。
我已经解析并验证了查询,并且拥有RelRoot对象。
Apache方解石返回RelRoot对象,该对象是代数表达式的根。
让我们说我不想应用任何查询优化,如何使用我的RelNode访问者将RelRoot转换为TinkerPop Gremlin DSL。
理想情况下,我将首先使用From子句,然后应用where子句中定义的过滤器?选择,过滤器,From子句如何在RelRoot树中表示?
apache方解石通过关系表达式或RelNode意味着什么?
在没有TinkerPop Gremlin上下文的情况下改述相同的问题: 我应该如何使用RelRoot访问者来访问RelRoot并将查询转换为另一个DSL?
答案 0 :(得分:0)
我不知道为什么您坚持使用RelRoot
而不是RelNode
树,但是Apache Calcite正在RelNode
堆栈中进行关系代数的优化。您可能会发现一个有趣的类RelVisitor,因为它可以完全满足您的需求:访问所有RelNodes
。然后,您可以从他们那里提取所需的信息,并以此来构建DSL。
编辑:在RelVisitor
中,您可以访问当前访问的节点的父节点和子节点。您可以提取RelNode
对象通常可用的所有信息(请参见docs),如果将其转换为特定的关系代数运算(例如Project
),则可以提取哪些字段通过执行Project
在node.getRowType().getFieldList().forEach(field -> names.add(field.getName()))
操作内部,其中名称是先前定义的Set<String>
。您可以找到完整的代码here。
在尝试执行此操作之前,您还应该查看algebra docs,以了解SQL如何映射到方解石中的关系代数。