如何将 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)
”。然后解析这个并将其转换为RelNode
。 PlannerTest.testParseAndConvert
正是这样做的;它仅使用几行代码,因此您可以从该方法复制粘贴。
我最近开始学习 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)
”。然后解析这个并将其转换为RelNode
。 PlannerTest.testParseAndConvert
正是这样做的;它仅使用几行代码,因此您可以从该方法复制粘贴。