如何验证跨模式查询

问题描述

我想验证跨多个jdbc模式运行的查询。 例如,我的数据库设置:

CREATE SCHEMA IF NOT EXISTS schema1;
CREATE SCHEMA IF NOT EXISTS schema2;
CREATE TABLE schema1.table1 (
    id  BIGINT PRIMARY KEY,value1 VARCHAR
);
CREATE TABLE schema2.table2 (
    id  BIGINT PRIMARY KEY,value2 VARCHAR
);
INSERT INTO schema1.table1 (id,value1) VALUES (1,'t-1-value');
INSERT INTO schema2.table2 (id,value2) VALUES (1,'t-2-value');

我的查询在Postgres中正常运行:

SELECT
    t1.id,t1.value1,t2.value2
FROM
    schema1.table1 AS t1
    JOIN schema2.table2 AS t2
         ON t1.id = t2.id

现在我要做的是让方解石连接到数据库,查看架构和表并说上述查询有效。

这是我程序的示例代码

    String query = "SELECT t1.id,t2.value2 FROM schema1.table1 AS t1 JOIN schema2.table2 AS t2 ON t1.id = t2.id";

    // Parse Query
    Config parserConfig = sqlParser.config()
        .withCaseSensitive(false)
        .withConformance(sqlConformanceEnum.BABEL)
        .withParserFactory(sqlDdlParserImpl.FACTORY);
    sqlParser sqlParser = sqlParser.create(query,parserConfig);
    sqlNode sqlNode = sqlParser.parseQuery();

    // Validate query
    Connection connection = DriverManager.getConnection("jdbc:calcite:model=" + modelPath);
    CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
    SchemaPlus schemaPlus = calciteConnection.getRootSchema().getSubSchema("MY_MODEL_SCHEMA");
    CalciteSchema calciteSchema = CalciteSchema.from(schemaPlus);
    CalciteCatalogReader calciteCatalogReader =
        new CalciteCatalogReader(
            calciteSchema,Arrays.asList("schema1","schema2"),calciteConnection.getTypeFactory(),CalciteConnectionConfig.DEFAULT);
    sqlValidatorWithHints sqlValidator =
        sqlValidatorUtil.newValidator(
            sqlStdOperatorTable.instance(),calciteCatalogReader,calciteCatalogReader.getTypeFactory(),sqlValidator.Config.DEFAULT);
    sqlValidator.validate(sqlNode);

哪个给我错误

Caused by: org.apache.calcite.sql.validate.sqlValidatorException: Object 'schema1' not found

我的模型如下:

{
  "version": "1.0","schemas": [
    {
      "name": "MY_MODEL_SCHEMA","type": "custom","factory": "org.apache.calcite.adapter.jdbc.JdbcSchema$Factory","operand": {
        "jdbcDriver": "org.postgresql.Driver","jdbcUrl": "jdbc:postgresql://localhost:5432/db","jdbcUser": "user","jdbcPassword": "password"
      }
    }
  ]
}

当我在模型中添加public时,验证适用于"jdbcSchema": "schema1"模式中的表以及其他模式,但是我想访问这两种模式。我该怎么办?

这是我的pom版本:

    <dependency>
      <groupId>org.apache.calcite</groupId>
      <artifactId>calcite-core</artifactId>
      <version>1.26.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.calcite</groupId>
      <artifactId>calcite-server</artifactId>
      <version>1.26.0</version>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.2.5</version>
    </dependency>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...