2012年1月10日火曜日

Slim3 Source Code Reading #3の前に(その2)

午前中にGetについての記事を書いたのですが、
Queryについてもメモを残しておきたいと思います。

実はQueryについては読む予定は無かったのですが、
開発環境での問題なのか、Putした結果が反映されるのが遅いという現象が
発生したので、Datastore.query(t).asList();という書き方がおかしいのか?と
思って、読み進めてみました。
実際はGetと同じくデータストアの読み取りなのでこちらも読んでおくべきと
思ったのでメモしておく事にします。

先に概要をメモ

  • Datastore.query(class)を呼び出すとDatastore.java3965行目が呼び出される。
    • 中ではDatastoreDelegate.query(class)を呼び出すので、DatastoreDelegate.java2397行目が実行される。
      • この中身はAsyncDatastoreDelegate.query(class)を呼び出すだけ。
        • AsyncDatastoreDelegate.java1940行目が実行される。
          • 中身はModelQueryクラスのインスタンスを生成してreturn
            • コンストラクタの引数は、AsyncDatastoreServiceとModelMetaクラス
            • ModelQueryクラスのコンストラクタでappengineAPIのQueryクラスを生成する。
まとめると、「Datastore.query()はModelMetaで指定したKind名のQuery」を生成する。
という簡単なものでした。

では、asList()メソッドを呼び出すとどうなるか。
ModelQuery.java241行目が呼び出されます。

最初にappengineAPIのPreparedQuery#asList(options)が呼び出され、結果が返ります。(トランザクションがセットされていればトランザクションも使われます)

そして、PreparedQuery#asList()で取得された結果(Entity)をModelMetaに変換し、
ModelMetaからModelクラスへの変換を行います。(取得された件数分全て)
ここで、Model#postGet()も呼び出されますので、このタイミングで編集処理が
実行されます。
よって、データ数が多いときには、適切にLimit指定を行わないと、
「表示しない(使わない)データを処理する」ことになるケースもあるということになります。