slim3を使ってて、ここはこうだったら良いのになーとか思ってた事

すごーくお世話になって、勉強させてもらったslim3に、あーだこーだ言うのはちょっと気が引けるけど、せっかくなので勇気を出して書いてみる。


と言っても、しばらくGAEから離れているのであんまり出てこないですが、とりあえず出てきた3つ。

1.ModelQueryでカーソルを扱えるIteratorを取りたい

今のモデルクエリにはカーソルを扱えるIteratorを取る手段が無いです(AbstractQueryにはありますが)
たとえば、
S3QueryResultIterator (extends ModelIterator)
みたいなクラスを返してくれる、
asQueryResultIterator()
みたいなメソッドがほしいなーとずっと思ってました。


カーソル使いたいなら今slim3にある、asQueryResultListじゃだめかって話ですが、
このメソッドはクエリの結果をすべてメソッド内で取得するので(このメソッドの挙動としては正しいです)、このメソッドの実行時間がクエリの結果件数に依存してしまいます。
何が問題かというと、
↓のAsync Queryの説明にあるように、

However, when you invoke PreparedQuery.asIterable(), PreparedQuery.asIterator() or PreparedQuery.asList(), both DatastoreService and AsyncDatastoreService immediately return and asynchronously prefetch results.

http://code.google.com/intl/en/appengine/docs/java/datastore/async.html

な挙動になってくれないんです。
つまり、asQueryResultListを使った場合、

This allows your application to perform work in parallel while query results are fetched.

って事にならないんです。
asIteratorってメソッドがありますが、これはカーソルを扱えない。


もうひとつ自分がこまった問題として、asQueryResultListだと
カーソル位置が結果セットの最後のデータ位置になっているので、
TQチェーンバッチ等で処理できるだけ処理して、次のTQに、続きのカーソルを渡すって感じの事ができない。(説明わかりにくいかな)

2.リスナーはAttributeListenerだけじゃなくてModelListenerもほしい

たとえば、
custom indexを作りたくなくて複合属性つくる場合とか、
putの前に属性まとめて圧縮したりとか、
検索の為に、あるリスト属性のsizeをもつ属性(カウンタキャッシュっていうのかな?)を更新したりとか
等々、属性単位じゃなくて、モデル単位でのprePut,postGetができるモデルリスナーがほしいなーと

3.(ついでに)ControllerでasMap, asObjectとかあったらいいなーと思ってた

あと、ついでですが、
ControllerにasMap, asObjectとかあったらいいなーと