【发布时间】:2021-12-01 15:22:13
【问题描述】:
我正在尝试从 Calcite 中的关系代数生成 SQL 查询而不连接到数据库
我在 Calcite 网站上看到了一个示例,其中 JDBC 适配器第一次使用 DB 连接,所有后续调用都从缓存中获取数据。我正在寻找的根本不是连接到数据库,而是从关系到 SQL 的转换。
非常感谢任何提示。
【问题讨论】:
标签: apache-calcite
我正在尝试从 Calcite 中的关系代数生成 SQL 查询而不连接到数据库
我在 Calcite 网站上看到了一个示例,其中 JDBC 适配器第一次使用 DB 连接,所有后续调用都从缓存中获取数据。我正在寻找的根本不是连接到数据库,而是从关系到 SQL 的转换。
非常感谢任何提示。
【问题讨论】:
标签: apache-calcite
一个可用的示例in this notebook。我在下面包含了相关代码。您需要创建一个模式实例才能使其工作。在这种情况下,我刚刚使用了 Calcite 的一种测试模式。
import org.apache.calcite.jdbc.CalciteSchema;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelWriter;
import org.apache.calcite.rel.externalize.RelWriterImpl;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.test.CalciteAssert;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.RelBuilder;
SchemaPlus rootSchema = CalciteSchema.createRootSchema(true).plus();
FrameworkConfig config = Frameworks.newConfigBuilder()
.defaultSchema(
CalciteAssert.addSchema(rootSchema, CalciteAssert.SchemaSpec.HR))
.build();
RelBuilder builder = RelBuilder.create(config);
RelNode opTree = builder.scan("emps")
.scan("depts")
.join(JoinRelType.INNER, "deptno")
.filter(builder.equals(builder.field("empid"), builder.literal(100)))
.build();
通过构造RelToSqlConverter 的实例并在RelNode 对象上调用它的visit 方法,转换为SQL 的另一个步骤相当简单。
【讨论】:
您可以使用新的 Quidem 测试来运行,这会更容易
【讨论】: