2

私は現在、SQL クエリを解析し、その関係式のツリーを作成するプロジェクトに取り組んでいます。主な目標は、クエリで結合パートナーを特定することです。したがって、結合式をツリーの葉までプッシュしたいと思います。これを実現するために、Apache Calcite を使用することにしました。現時点では、私のコードはおおよそ次のようになります。

Planner planner = Frameworks.getPlanner(Frameworks.newConfigBuilder().defaultSchema(Frameworks.createRootSchema(false)).build());

SqlNode parsed = planner.parse("SELECT s.dnasamplename, e.Total_expression_level, e.Soluble_expression_level, s.id " +
            "FROM table1 e" +
            "JOIN table2 s on s.constructname = e.Clone_name" +
            "WHERE e.Total_expression_level like '0:%'");

planner.validate(parsed);

RelRoot relRoot = planner.rel(parsed);

Plannerの rel-Method を直接実行しようとすると、最初にクエリを検証する必要があるというエラーが表示されます。そして、それが私が問題に直面するポイントです。有効なスキーマがありません。クエリをリレーショナル クエリ プランに変換したいだけです。検証プロセスをスキップする方法はありますか?

4

1 に答える 1

3

検証プロセスをスキップすることはできません。SQL からリレーショナルへのコンバーターは、バリデーターによって以前に作成された状態に依存します。

人々は、SQL が無効な場合にバリデーターが例外をスローするのを見て、これが唯一の目的であると想像します。しかし、状態を構築することも同様に重要です。状態には、各 SqlNode の型のマップ、SELECT 句の "*" と "tableAlias.*" の展開、および完全修飾識別子が含まれます。

スキーマが欠落しているか不完全な場合は、Apache Drill と同様のアプローチを試すことができます。バリデーターがテーブルの特定の列を要求し、テーブルにその列がない場合、そのテーブルの Calcite 名前空間は「はい、その列があります!」と言います。そしてそれを追加します。したがって、検証プロセスは成功し、各名前空間には、クエリに必要な追加の列のリストが含まれます。

于 2016-11-26T00:08:37.923 に答える