思いついたこと

寝ようと思った瞬間になんか思いつくのはもはや呪い。

@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の構文作ってそれっぽい動きをさせればよさげ。書いててそっちのほうがよさそうだと思いつつある。