Slim3 Datastoreを使ってTODOリストサービスを作ってみた。

昨日はlow-level APIでTODOリストサービスを作ってみたんだけど、Slim3のDatastoreの機能が追加されたようなので、そちらを使って同じようなサービスを作ってみた。

Slim3 Datastoreは内部ではlow-level APIを使っているのでJDOを使うよりパフォーマンスがいいらしい。
Google グループ
JDOよりも3倍近く早い感じだね。(まだ、パフォーマンスが影響するようなサービスは作ってないんだけど。。どっかで試してみよう)

そして、low-level APISlim3 Datastoreの最大の違い。Slim3ではlow-level APIのEntityに当たるクラスをモデルとして定義して使えるという所。なので、KindのプロパティにアクセスするときEntityの場合、entity.getProperty(String propertyName)(また、値をセットするときはentity.setProperty(String propertyName, Object value))としていた所を、model.getName()と書けること。また、モデルに対応したメタクラス(モデル名+Metaというくらすが、コンパイル時に自動生成される)を使ってタイプセーフなクエリを書くことが出来る。

以下は、low-level APIのEntityの操作。Kindの指定、プロパティの指定には文字列を使う。

Entity todo = new Entity("Category");
todo.setProperty("name", asString("name"));
todo.setProperty("createdAt", new Date());

以下は、Slim3 Datastoreの場合こんな感じ。独自に定義したモデルをそのままPutしたりするイメージ。

Category c = new Category();
c.setName(asString("name"));
c.setCreatedAt(new Date());

// 保存
Datastore.put(c);

ちなみにモデルの定義はこんな感じ。クラスに@Modelアノテーションをつけて、Keyを定義し@PrimaryKeyアノテーションをつける。ちなみに保存させたくないフィールドには@Impermanentをつけるといいみたい。

@Model
public class Category implements Serializable {
    @PrimaryKey
    private Key key;
    
    private String name;
    // ・・・getter, setter

モデルに使えるアノテーション

  • @Impermanent 保存したくないフィールドに設定
  • @PrimaryKey Keyに設定
  • @Unindexed Indexをつけたくないフィールドに設定
  • @Version
  • @Text
  • @Blob

Version, Text, Blobは元々使ったことがないのでよく分かりません(’□’)

※追記(2009/10/13):これらのアノテーションは廃止されて、変わりにAttributeアノテーションになります↓

次は、クエリの例。low-level APIでは以下のような感じ。

// Kind:Categoryのnameプロパティの値が「blank」のものを取得する
Query q = new Query("Category");
q.addFilter("name", Query.FilterOperator.EQUAL, "blank");
PreparedQuery pq = datastoreService.prepare(q);
Entity category = pq.asSingleEntity();

Slim3 Datastoreの場合は以下のような感じ。

// Kind:Categoryのnameプロパティの値が「blank」のものを取得する
CategoryMeta cm = new CategoryMeta();
Category category = Datastore.query(cm).filter(cm.name.equal("blank"))

自動生成されたCategoryMetaクラスを使ってタイプセーフなフィルタ操作を行えるのが大きな違い。またメタクラスそのものを渡すことで戻り値のモデルも特定してくれるのでキャストしなくてもいいようになってますね。

まだ、ざっくり触ってみただけなのでこれから色々試して見ようと思います。

JDO、low-level API, Slim3 Datastoreを触ってみて思ったことは、
JDOは複雑で分かりにくい(そしてパフォーマンスは悪いらしい)。
low-level APIはシンプルで使いやすい。今回のTODOリストサービスくらいのものだったらSlim3 Datastoreを使うまでもなくサクサクできる。でも、もっと複雑なものになればSlim3 Datastoreのように型を指定した上でデータやプロパティにアクセス出きるのがありがたいと思うんじゃないかなと思う。GAEをJavaでやる利点の一つになりそう。

Slim3 Datastoreを使ったサンプルは以下からチェックアウトできます。
Google Code Archive - Long-term storage for Google Code Project Hosting.

  • プロジェクト名:todo-s3-datastore ・・・ Slim3 Datastoreを使ったTODOリストサービス
  • プロジェクト名:todo-low-level-api ・・・ low-level APIを使ったTODOリストサービス