我最近开始学习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创建的配置创建验证器,目录阅读器和集群。
答案 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)
"。然后解析它并将其转换为RelNode
。 PlannerTest.testParseAndConvert
就是这样做的;它只使用几行代码,因此您可以从该方法进行复制粘贴。