思いついたこと
寝ようと思った瞬間になんか思いつくのはもはや呪い。
@Dao(Hoge.class) public interface HogeDao { @Read Hoge get( // WHERE email = :email AND ANCESTOR = :parentKey @Parent String parentKey, String email ); @Read @OrderBy("date asc") List<Hoge> get( // WHERE date >= :from AND date <= :to @GreaterThanOrEquals("date") from, // @GEでいいか @LessThanOrEquals("date") to // @LEでいいか ); @Append @Transactional Foo insert( // (WHERE email = :email).fooList.add(Foo) @Property("email") String email, @Child("foo_list") Foo ); }
BigTableはモデルが複雑じゃないし、クエリもたいしたことかけないので上記で十分だと思う。
他の手法に対する優位性は、
- 静的解析できる
- モデルとの整合性
- GQLとしての正当性
- インデククスの自動生成
- JDOに縛られない
- JDOのクエリがいまだに好きになれない
- PersistentManager.retrieve 周りがいまだに怪しげ
未検証なのは、Entity Groupを使ったトランザクション内での更新を宣言的にカバーできるかどうか。まだ実例を積んでないからなんともいえない。
最悪の場合、GQLにINSERT/UPDATEの構文作ってそれっぽい動きをさせればよさげ。書いててそっちのほうがよさそうだと思いつつある。