DDL作成時のエンティティ依存関係解決&DDL作成アルゴリズム(図解)
ActiveObjectsのマイグレーション処理の流れd:id:nattou_curry_2:20081109:1226228944で省略した、依存関係の解決とDDL作成のアルゴリズムについて図解しました。
ステップ1 エンティティインタフェースから依存関係を調べる - parseDependencies()メソッド
指定されたエンティティインタフェースのすべてのメソッドを調べます。メソッドの属性型がエンティティである場合、指定されたエンティティインタフェースはその属性型(エンティティ)に依存すると判断されます。
さらに、その属性型(エンティティ)のすべてのメソッドを調べ・・・ということが再帰的に行われます。
その結果として、依存関係のマッピングがdeps引数に格納され、依存先を持たないエンティティのセットがroots引数に格納されます。
ステップ2 rootsの先頭から順にテーブルDDLを作成する - parseDDL()メソッド
ステップ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を作成する。
おわりに
マイグレーション時には、上記のような手順により、依存関係のあるエンティティのテーブルが漏れなく(?)作成されるようです。
ただし、今回はソースを読んだだけで動かしていないので、勘違いもあるかもしれません。