読譜活動 – ZetaSQL – Algebrizer
さて間が空いてしまったが続けます。04:07. ベッドから直行してしまったが、あとで着替えコーヒー休憩が必要。
- evaluator.h および evaluator_base.h を見ると、評価は PreparedStatement という形で API になっていることがわかる。Execute() というメンバ関数がある。
- そして internal::Evaluator という非公開クラスに移譲される。
- このクラスは SQL を Prepare() のち ExecuteAfterPrepare() する。
- Prepare() は要するに Analyzer すなわち resolved AST を作るんでしょ・・・と思いきや、それに加えて Algebrizer というのがあるな。
- Algebrizer::AlgebrizeQueryStatementAsRelation() という関数が呼ばれているので見てみるとジャンプ先の algebrizer.cc は突然 5000 具合あってギャーっとなる。関係代数に変換するということなのだろうか・・・。
- 関数の出力は RelationalOp クラス。これは operator.h に定義されている AlgebraOp のサブクラスで、Yet another tree を構成している。そういえば Duck にも Logical op だの physical op だのがあったね。つまり Algebrizer はいわゆる planner なのだな。
- で Resolved AST を traverse して Algebra tree に変換していく。たとえば ResolvedTableScan は TableScanOp になる by AlgebrizeTableScan() この辺の方のデザインは duck もだいたい同じで duck と zeta が互いをコピーするのはタイミング的にどう考えても不可能なので、なんか元ネタというか系譜があるな。どこから来たのだろうねこのデザイン/アーキテクチャ。
ここから先は自分の関係代数というかデータベースリテラシ不足で読んでもわからん感。修行して出直す必要がありそう。
肝心の Evaluation はまだ読んでないけど、理解のない状態でこれ以上読み進めても不毛なので Zeta Reading はここまで。