データストアのクエリ

久しぶりのApp Engineの学習。忘れてしまっていることもあるかと思いますが、分からない箇所は調べながら、また細々と続けていこうと思います。


これまではエンティティのキーを使ってエンティティを特定し、特定したただ一つのエンティティに対して様々な操作を行って来ました。このようなケースが当てはまるのは、たとえばユーザ情報を特定する場合などが当ります。結果が一件ですからね。

でもたとえば掲示板みたいにある条件に当てはまる記事を全て取ってくるという場合、各記事のキーを全て知ることは出来ません。というか何らかの条件を与えて、その条件に一致するエンティティを全て取ってくるのが一般的な動作でしょう。これがクエリと呼ばれるものです。

クエリと種別

クエリとは具体的に何ぞや?ってことなんですが、こんなものから構成されています。

  1. エンティティの種別
  2. 0個以上のフィルタ
  3. 0個以上のソート順序


最近仕事でAndroidのコンテンツプロバイダを使うことが多いのですが、その時のクエリもほとんど一緒ですね。エンティティの種別とコンテンツプロバイダのURIもなんとなく似ているもののように感じます。つまりRDBMSSQLととってもアナロジーを感じるわけです。

そんなゆるい理解のもと、次に進みます。

クエリの結果とキー

App Engineのクエリの結果は次の二つの内いずれかしか選択出来ません。

  1. 完全なエンティティ
  2. キー


完全なエンティティを返すとは、SQLのように一部のプロパティだけを選択して取得する、ということは出来ないことを意味します。

キーを返すとは、まずは条件に一致するエンティティのキーだけ取得しておき、必要になったら、そのキーを使ってエンティティを読み込むことが出来る、ということです。

GQL

次にこれまで述べてきたクエリを構築する方法です。GQLとはGoogle Query Languageの略です (ホント?) 。たとえばこんな風に指定します。

SELECT * FROM Book
         WHERE copyright_year > 1900
         ORDER BY copyright_year DESC


何となくわかりますよね。copyright_yearが1900よりも大きいエンティティをBook種別から降順で収集せい、と命令しているのです。

なお、条件に使える演算子は基本的な =, <, <=, >, >=以外にも!=やINなんかも利用出来るようです。でも!=やINは複数のクエリに分割されて発行されるので注意が必要です (もちろん一回のクエリよりも断然遅くなるのです) 。


その他に覚えておかなきゃいけないのがLIMITとOFFET。LIMITは取得する最大件数の指定、OFFSETは何件エンティティを飛ばすのかの指定です。先ほどの例でいうとこんな感じで書けます。

SELECT * FROM Book
         WHERE copyright_year > 1900
         ORDER BY copyright_year DESC
         LIMIT 5
         OFFSET 10


先頭から10件はスキップして、最大5件まで取得するわけです。

最後に上でクエリにはエンティティ全体を返す場合とキーを返す場合があると書きましたが、これはSELECT文の書き方で変わります。

  1. SELECT * ...: エンティティ全体を返す
  2. SELECT __key__ ...: キーを返す


あぁ〜、覚えることがいっぱいです。

明日からはクエリを使ってコードを書いていこうと思います。