2

フレームワークを理解するために、方解石でいくつかの基本的なことをしようとしています。2 つの json ファイルから読み取ることになっている簡単な例をセットアップしました。私のモデルは次のようになります

{
  version: '1.0',
  defaultSchema: 'PEOPLE',
  schemas: [
    {
      name: 'PEOPLE',
      type: 'custom',
      factory: 'demo.JsonSchemaFactory',
      operand: {
        directory: '/..../calcite-json/src/test/resources/files'
      }
    }
  ]
}

私のテストでは、データベースのメタデータ情報を取得すると、ファイルが PEOPLE スキーマの下のテーブルとしてロードされていることがわかるため、モデルは正常にロードされているようです。しかし、そのステートメントの直後に、select *そのテーブルから実行しようとすると、テーブルが見つからないというエラーが発生します。

> --
null
PEOPLE
a
TABLE
-->
Jun 29, 2015 8:53:30 AM org.apache.calcite.sql.validate.SqlValidatorException <init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: Table 'A' not found
Jun 29, 2015 8:53:30 AM org.apache.calcite.runtime.CalciteException <init>
SEVERE: org.apache.calcite.runtime.CalciteContextException: At line 1, column 26: Table 'A' not found

出力の最初の行は、データベース メタデータ "-- null PEOPLE a TABLE -->" からのテーブルを示しています。これは、テーブル「a」がスキーマ「people」の下に存在し、タイプが「table」であることを示しています。

私のテストコードは次のようになります

@Test
public void testModel() throws SQLException {
    Properties props = new Properties();
    props.put("model", getPath("/model.json"));
    System.out.println("model = " + props.get("model"));
    Connection conn = DriverManager.getConnection("jdbc:calcite:", props);

    DatabaseMetaData md = conn.getMetaData();
    ResultSet tables = md.getTables(null, "PEOPLE", "%", null);
    while (tables.next()) {
        System.out.println("--");
        System.out.println(tables.getString(1));
        System.out.println(tables.getString(2));
        System.out.println(tables.getString(3));
        System.out.println(tables.getString(4));
        System.out.println("-->");
    }

    Statement stat = conn.createStatement();
    stat.execute("select _MAP['name'] from a");

    stat.close();
    conn.close();
}

ロードされたテーブルで選択できない理由はありますか?

私が気付いたもう 1 つの興味深い点は、1 つのファイルに対してSchema.getTableMap4 回呼び出されていることです。

プロジェクトの完全なコードはgithubで見つけることができます

4

1 に答える 1

4

問題は大文字と小文字の区別です。テーブル名を二重引用符で囲んでいないため、Calcite の SQL パーサーはそれを大文字に変換しました。ファイルは「a.json」と呼ばれるため、テーブルも「a」と呼ばれますが、クエリは「A」と呼ばれるテーブルを探しています。

解決策は、次のようにクエリを記述することです。

select _MAP['name'] from "a"

これは次のようになります。

stat.execute("select _MAP['name'] from \"a\"");

Javaに埋め込む場合。

于 2015-07-06T21:34:43.273 に答える