データストアのクエリ

昨日は珍しく仕事で一緒になった方々と渋谷 (都会!) で飲みました。とても楽しく飲めたのですが、いかんせんお酒が弱いので、ビール4杯めぐらいから顔が真っ赤になっているのが分かりました。

なので (?) 今日はちょっとだらけた一日になってしまったので、少しだけ勉強してから寝ることにします (だらけたまま一日が終わるのはちょっと気持ち悪いので) 。

複数のプロパティに関するフィルタ

複数のプロパティを使ったフィルタを考えています。たとえばこんな感じ。

SELECT * Player WHERE charClass='ヒーロー' AND level < 10


これはcharClassプロパティの値が「ヒーロー」でlevelプロパティの値が10未満のエンティティを集めるクエリです。たとえば次のようなエンティティがデータストア上に存在したとします。

名前 レベル 得点 クラス
ウルトラマン 7 1366 ヒーロー
仮面ライダー 22 1096 ヒーロー
バルタン星人 21 2003 怪獣
ゴレンジャー 2 2003 ヒーロー
ショッカー 24 33311 悪者


上記クエリの結果はこうありたい。

名前 レベル 得点 クラス
ウルトラマン 7 1366 ヒーロー
ゴレンジャー 2 2003 ヒーロー


この結果を得るためには次のようなインデックスが必要になります。

キー クラス レベル
ゴレンジャーのキー ヒーロー 2
ウルトラマンのキー ヒーロー 7
仮面ライダーのキー ヒーロー 22
バルタン星人のキー 怪獣 21
ショッカーのキー 悪者 24


つまりクラスプロパティの値でソートされ、かつレベルプロパティの値でソートされているインデックスが必要になります。

デバッグサーバーでこのクエリを実行すると次のようなindex.yamlファイルが出力されます。

- kind: Player
  properties:
  - name: charclass
  - name: level


なるほど、納得。ていうか今まで何でこんなシンプルなことが分からなかったんだろうか。。。