データストアのクエリ

Android BindingもちょっとダレてきたのでApp Engineの勉強に戻ります。気が向いたらまたAndroid Bindingについて調べることにします。

自動インデックスとシンプルなクエリ

以前に少しだけインデックスについて勉強しました。インデックスには以下の2種類があります。

  1. 自動インデックス
  2. カスタムインデックス


今回は自動インデックスについて見ていきます。

自動インデックスとは特にこちらで指定しなくてもApp Engine側で自動的に作成してくれるインデックスのことで、全ての種別のエンティティの各プロパティに対して値を昇順、降順に並べたもののことです。ここで重要なのが、各プロパティに対してというところです。つまり昇順、降順に並んでいるのはただ一つのプロパティの値だけなのです。


この自動インデックスに対するクエリ (シンプルなクエリ) をいくつか見ていきます。

ある種別の全てのエンティティを返すクエリ

シンプルなクエリの中でも一番シンプルなクエリです。GQLで書くとこんな感じになります。

SELECT * FROM Player


Playerという種別の全てのエンティティを取得するクエリです。このクエリはPlayer種別の全てのエンティティキーのリストに対して発行されます。つまりそのようなインデックスが種別ごとに存在する、ということです。一番シンプルなインデックスですね。このキーからそれぞれのエンティティを抽出して、アプリケーションに返すわけです。

等価演算子フィルタを1つだけ持つクエリ

次は等価演算子 (=) を使ったWHERE節 (フィルタ) を持つクエリを考えます。

SELECT * FROM Player WHERE level = 7


これはlevelプロパティの値が7である全てのPlayer種別のエンティティを取得するクエリです。このクエリはlevelプロパティを昇順に並べたインデックスを利用します。


たとえばこんな感じのインデックスがあった場合、上から見て初めてlevelプロパティの値が7になる行と、そこから順に見て初めてlevelプロパティの値が7以外になる行を見付出し、その間の行のキーに対するエンティティ列をアプリケーションに返すわけです (この場合はエンティティは一つしかありませんが一般には複数あります) 。

不等号フィルタ群を持つクエリ

次のような不等号フィルタを持ったクエリを考えます。

SELECT * FROM Player WHERE level >= 1 AND level < 11


これはlevelプロパティの値が1以上11未満のエンティティを取得するクエリです。この場合も先ほどと同様にlevelプロパティの値を昇順にソートしたインデックスを使います。想像の通り、先頭から見て初めて条件に一致する行と、そこから見て初めて条件に一致しない行の間がクエリの結果になります。

等価演算子フィルタと同じでとてもシンプルな戦略ですよね。

ソート順序が1つ指定されたクエリ

たとえばこちらのクエリ。

SELECT * FROM Player ORDER BY level


これはPlayer種別の全てのエンティティをlevelプロパティの値で昇順にソートして返すクエリです。このようの昇順ソートが指定されている場合、ソート指定されているプロパティの昇順ソートインデックスがそのまま利用されます。もちろん

SELECT * FROM Player ORDER BY level DESC


は逆順のクエリです。この場合App Engineは降順にソートされたインデックスを用いて、昇順指定とまったく同じロジックでエンティティを取得します。

キーに関するクエリ

以前にもちょっと勉強したようにクエリでキーのみを取得することが可能ですが、このキーのみを取得するクエリにフィルタやソートを指定することが出来ます。たとえばこんな感じ。

SELECT * From Player WHERE __key__ >= xxx


キーの値がxxx以上の全てのエンティティを取得します。利用するインデックスはキーのみのインデックスです。ちなみに逆順で取得する場合はカスタムインデックスが必要となります。

種別を指定しないクエリ

なんとApp Engineでは全種別の全エンティティを対象にしたクエリを使うことが出来ます。いまいち使い道が想像できませんが。ちなみにこの場合フィルタやソート指定はキーに対してしか出来ません。