【问题标题】:how to evaluate sql query using RelNode object如何使用 RelNode 对象评估 sql 查询
【发布时间】:2019-09-16 04:26:37
【问题描述】:

我正在尝试将 sql 查询转换为 Tinkerpop Gremlin。 sql2Gremlin 库可以做到这一点,但它会将连接视为关系,而我依赖于无连接方法,您可以将带点的关系作为两个实体之间的分隔符。

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

Apache calcite 返回 RelRoot 对象,它是代数表达式的根。

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

理想情况下,我会先使用 From 子句,然后应用 where 子句中定义的过滤器? RelRoot树中的select、filters、From子句如何表示?

apache calcite 的关系表达式或者RelNode是什么意思?

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

【问题讨论】:

    标签: apache-calcite


    【解决方案1】:

    我不知道您为什么坚持使用 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 如何映射到 Calcite 中的关系代数。

    【讨论】:

    • 访问 RelNodes 时,如何从 RelNode 中提取信息?
    • @NischalKumar 我用解释更新了答案。如果它回答了您的问题,请接受它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多