データストアのクエリ
気を取り直して勉強、勉強。
カスタムインデックスと複雑なクエリ
前に勉強した自動インデックスとは別のカスタムインデックスについて勉強します。・・・と言いつつ、この自動インデックスやカスタムインデックスって単語は正式名称じゃないんですね。本書にも「・・・と呼ぶことにしましょう」と書いてあるし。
自動インデックスはある一つのプロパティに関して昇順、降順にソートしたキーとプロパティの対のリストでした。ここで重要なのが一つのプロパティであること。このようなインデックスは何も設定しなくてもApp Engineが自動で作成し、更新してくれます。
ですが、例えば以下のようなクエリはどうでしょうか?
SELECT * FROM Player ORDER BY level, score
つまりレベルの値で昇順ソートした上にスコアの値で昇順ソートするクエリです。ここでは二つのプロパティが存在しています。つまり二つのプロパティの条件を同時に満たす必要があるのです。自動インデックスではこの要求に答えることが出来ません。
そこでカスタムインデックスの登場というわけです。
ここ、Google Codeのドキュメントを読んでも理解出来なかったので心して勉強します。
複数のソート順序
上で示した例についてもっと見ていきましょう。ソート指定に2つのプロパティを使っています。そのためインデックスも2つのプロパティでソートされたものが必要になります。たとえば以下のようなものになります。
赤枠で囲っている部分はlevelの値は同じなので、scoreの値でソートされています。このようなインデックスがあれば、後は簡単ですよね。
デバッグサーバを起動して、このクエリを発行してみましょう。
class Sort1Page(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html' # ... 省略 ... query = db.GqlQuery('SELECT * FROM Player ORDER BY level, score') for player in query: body += u''' <tr align=center> <td>%s</td> <td>%d</td> <td>%d</td> <td>%s</td> </tr> ''' % (player.name, player.level, player.score, player.charclass) # ... 省略 ... self.response.out.write(body)
するとアプリケーションのディレクトリにindex.yamlというファイルが出力されました。中身を見てみるとこんな感じ。
ndexes: # AUTOGENERATED # This index.yaml is automatically updated whenever the dev_appserver # detects that a new type of query is run. If you want to manage the # index.yaml file manually, remove the above marker line (the line # saying "# AUTOGENERATED"). If you want to manage some indexes # manually, move them above the marker line. The index.yaml file is # automatically uploaded to the admin console when you next deploy # your application using appcfg.py. - kind: Player properties: - name: level - name: score
種別があって、
- kind: Player
どのプロパティでソートするかの指定があります。
properties: - name: level - name: score
もしクエリが降順ソート指定であれば
properties: - name: level direction: desc - name: score direction: desc
となります。このファイルが上記プロパティ2つを指定したソートクエリで必要になるカスタムインデックスのための設定ファイルです。これはアプリケーションと一緒にディプロイする必要があります。