DDL作成時のエンティティ依存関係解決&DDL作成アルゴリズム(図解)

ActiveObjectsマイグレーション処理の流れd:id:nattou_curry_2:20081109:1226228944で省略した、依存関係の解決とDDL作成のアルゴリズムについて図解しました。

今回の対象とするエンティティ関連図


以下は、この関連図に現れる、EntityAのマイグレーションを行った際の、依存関係解決→テーブルDDLの作成を想定しています。

ステップ1 エンティティインタフェースから依存関係を調べる - parseDependencies()メソッド

指定されたエンティティインタフェースのすべてのメソッドを調べます。メソッドの属性型がエンティティである場合、指定されたエンティティインタフェースはその属性型(エンティティ)に依存すると判断されます。
さらに、その属性型(エンティティ)のすべてのメソッドを調べ・・・ということが再帰的に行われます。
その結果として、依存関係のマッピングがdeps引数に格納され、依存先を持たないエンティティのセットがroots引数に格納されます。

作成されるdepsとroots


ステップ2 rootsの先頭から順にテーブルDDLを作成する - parseDDL()メソッド

ステップ2.1 EntityCのテーブルDDLを作成する。

rootsの先頭にあるEntityCのテーブルDDLを作成します。
このとき、EntityCはdepsとrootsから削除されます。

ステップ2.2 EntityDのテーブルDDLを作成する。

rootsの先頭にあるEntityDのテーブルDDLを作成します。
このとき、EntityDはdepsとrootsから削除されます。

ステップ2.3 EntityEのテーブルDDLを作成する。

rootsの先頭にあるEntityEのテーブルDDLを作成します。
このとき、EntityEはdepsとrootsから削除されます。
また、依存先が空になったのでEnitityBの依存関係はdepsから削除され、rootsにEntityBが追加されます。

ステップ2.4 EntityBのテーブルDDLを作成する。

rootsの先頭にあるEntityBのテーブルDDLを作成します。
このとき、EntityBはdepsとrootsから削除されます。
また、依存先が空になったのでEnitityAの依存関係はdepsから削除され、rootsにEntityAが追加されます。

ステップ2.5 EntityAのテーブルDDLを作成する。

このとき、EntityAはrootsから削除されます。

おわりに

マイグレーション時には、上記のような手順により、依存関係のあるエンティティのテーブルが漏れなく(?)作成されるようです。
ただし、今回はソースを読んだだけで動かしていないので、勘違いもあるかもしれません。