如何将SqlNode表达式(不是查询!)转换为RelNode?

时间:2016-06-21 16:20:29

标签: sql apache-calcite

我最近开始学习Calcite(1.8.0)并且我有以下用例:

我需要转换一个字符串列表,例如" SUM(x) / SUM(y) as myRatio"," MAX(z) as maxZ"或者" CASE WHEN …“到AggCall s并稍后在RelBuilder中使用它。

所以看起来我应该这样做:convert string - > sql node - > rel节点。我使用SqlParser.parseExpression将String转换为SqlNode并尝试Planner.rel(sqlNode)将SqlNode转换为RelNode但没有运气。还尝试自己创建SqlToRelConverter,但无法找到如何使用JdbcSchema创建的配置创建验证器,目录阅读器和集群。

1 个答案:

答案 0 :(得分:1)

这有点棘手,因为你正在处理对聚合函数的调用,而这些不是普通的表达式。请注意,AggCall使用的RelBuilder既不是SqlNode也不是RexNode

因此,最简单的事情可能是将表达式字符串转换为有效的查询字符串。例如。 " SUM(x) / SUM(y) as myRatio""成为" SELECT SUM(x) / SUM(y) as myRatio FROM (VALUES (0, 0)) AS t(x, y)"。然后解析它并将其转换为RelNodePlannerTest.testParseAndConvert就是这样做的;它只使用几行代码,因此您可以从该方法进行复制粘贴。