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

How can i convert SqlNode expression(not query!) to RelNode?

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

我需要将字符串列表(如“SUM(x) / SUM(y) as myRatio”、“MAX(z) as maxZ”或“CASE WHEN …”转换为 AggCall 并在 RelBuilder 之后。

看来我应该执行以下操作:转换字符串 -> sql 节点 -> rel 节点。我使用 SqlParser.parseExpression 将 String 转换为 SqlNode 并尝试 Planner.rel(sqlNode) 将 SqlNode 转换为 RelNode 但没有成功。还尝试自己创建 SqlToRelConverter,但无法找到如何从仅使用 JdbcSchema 创建的配置中创建验证器、目录 reader 和集群。

这有点棘手,因为您正在处理对聚合函数的调用,而这些不是普通的表达式。请注意 RelBuilder 使用的 AggCall 既不是 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 正是这样做的;它仅使用几行代码,因此您可以从该方法复制粘贴。