プロジェクトは次のように構成されています。
プロジェクトのパッケージの場合、ソースファイルは次の合理的に配置されます。
選択を論理計画において適切な位置にプッシュするために、同じ範囲条件のグループ属性にユニオンFindデータ構造を実装しました。 1つの関係と数値の間、または同じ関係の2つの属性の間の平等、よりグレーター、マイナータンの式を含む選択条件は、結合条件の後に押し下げられます。 Uneqalityおよびその他の使用可能な選択コンディションは、参加オペレーターに押し上げられます。
SelectionOpTimizerというクラスを作成して、使用する選択方法を処理しました。最初に、選択に関与する1つの関係のすべての属性のインデックスの可用性を確認します。これらの属性に適切なインデックスがない場合は、プレーンスキャン方法を選択します。これらの属性にインデックスオプションがある場合、コストを比較し、コストが最も低いコストを選択します。
最適な結合順序を選択するように動的なプログラミング方法を埋め込むいくつかの問題がありました。私たちがカレットに実装した妥協したソリューションは、各テーブルサイズに基づいて参加順序を選択することです。
私たちのロジックは、該当する場合はソートマージ結合を使用することです。 SMJが適用されない場合、ブロックネストループ結合を使用することを選択します。
プログラムのトップレベルのエントリは、 client.sqlinterpreter.main()にあります。
インタープリターは、入力ファイルを読み取り、クエリ評価者に転送し、最終的に結果をファイルに出力します。
Where句の条件を次のように分類します。1。定数間の比較。 2。テーブル内の選択条件。 3。クロステーブル結合条件。
解析の開始時に、すべての条件は、再帰的に式を分割することによって抽出されます。次に、各テーブルについて、次のことを記録します。1)選択条件、2)前のすべてのテーブルとの結合条件。このようにして、テーブルから沿って移動し、新しいテーブルを現在の左サブツリーと結合する必要がある場合にのみ、関連する条件に焦点を合わせることができます。そしてもちろん、一定の条件はすべての前に処理されます。
指示に従って、sortoperatorを実装しました。特定の順序付けされた要素が投影されていない場合(例えば、SBでS順序からSAを選択してください)、明確な場合、順序を維持するためにハッシュセットを使用する別の演算子があります。
BPlustreeクラスを提供し、そのコンストラクターは、指定された関係データから1つの副間属性にシリアル化されたインデックスファイルを構築できます。また、ユーザーが実行中にインデックススキャンオペレーターを使用する必要がある場合に、ツリーインデックスの降下機能を提供します。これにより、タプル検索時間が短くなります。
B+ Tree Indexを使用して、インデックス選択のインデックススキャンオペレーターを実装しました。式がインデックス属性を含む式を評価し、Daserilizerを呼び出して、B+ツリーのリーフノードから最初に満たされたデータ入力を取得します。その後、ファイルがクラスター化されている場合、タプルを直線的にフェッチします。
以前の設計では、論理選択演算子に、論理選択演算子の子がスキャン演算子でなければならないという重要な制約を与えました。したがって、訪問者パターンを使用して物理的な計画を構築する場合、せいぜい選択オペレーターに移動するだけです。また、訪問者が選択オペレーターに移動する場合、選択オペレーターの子がフルスキャンオペレーターまたはインデックススキャンオペレーターである必要がある場合に、ロジックが決定できます。
情報を構成ファイルからカタログに保存したため。まず、データベースカタログがインデックスクエリがオンになっていることを示している場合、このクエリでインデックスの可用性を確認する必要があります。
Indexが選択条件に適用されるかどうかをチェックするHasidxattrという方法があります。つまり、このテーブルの選択条件は、インデックス付き属性に等しく、等しく、より少ない、より少ない、より大きい、より大きい場合、子供としてインデックススキャンオペレーターを構築するのに適しています。次に、LowKeyとHighkeyをすべての選択条件に依存し、オペレーターを構築します。
hasidxattrがfalseを返す場合、通常のフルスキャン演算子を構築する必要があります。
最後に、アッパーレベルに戻ります。
2つのテスト戦略を利用しています
基本的なテストのために、オペレーターを手動で構築し、タプルをダンプして、オペレーターがイテレーターモデルに関して作業できることを証明します。
エンドツーエンドテストは、インタープリター全体をテスト中のユニットとして取得するテストです。テストケースは、入力クエリファイルを取得し、クエリを実行し、最後に結果をターゲットファイルに印刷します。
テストをより適切に実行するために、MySQLデータベースの結果を予想出力としてダンプするBASHスクリプトを作成しました。したがって、比較的複雑なテストケースを構築することは非常に簡単です。
また、出力の正しさを自動的に判断する2つのファイルを比較するために、UTILクラスDIFFを作成しました。