結合したQueryへのfetch()的アクセス
[ご注意!]
以下のエントリーは、状況により大きく負荷がかかる場合があります。詳しくはこちらをお読みください
前回のエントリーでBigtableから複数のQueryを結合する方法を紹介ました。 この方法は非常に便利ですが、chain()メソッドにより結合したQueryはitertools.chainオブジェクトに変換されてしまうのでQuery固有のメソッドが使えません。
うっかりfetch()とかcount()を実行すると
AttributeError: 'itertools.chain' object has no attribute 'count'
とお叱りを受けます。
特にfetch()が使えないのは致命的に思えます。 例えば1000件の検索結果の中から200番から210番だけ取り出したい場合に途方に暮れるじゃないですか。
で、ここでキラーメソッドの登場です。 itertools.islice()メソッドです。
islice('ABCDEFG', 2, 4)と実行するとC,Dを返すイテレータを生成してくれます。 Queryに対して使う場合はこんな感じです。
q1 = HogeModel.all().filter("name =", "Spike Spigel") q2 = HogeModel.all().filter("name =", "Jet Black") q3 = HogeModel.all().filter("name =", "Faye Valentine") qchain = chain(q1,q2,q3) #10番から20番のQuery結果を得る islice(qchain,10,20)これにより実質的にfetch()メソッドが利用可能となり、万々歳なわけですが、ホントにitertoolsはスゲー奴ですね。
ちなみにitertoolsのソースコードを見てやろうと/System/Library/Frameworks/Python.framework/Versions/ の中を探してみたけど見つかりませんでした。いけずな奴です。
ActionScriptにはビルトインなイテレータが存在しないし、 実際のコーディングでもワザワザ定義して使う事は稀だと思います。 最近、周囲のFlasherさんたちがGAE/Pyに参入し始めていますが、僕のようにイテレータに不慣れな人も結構多いんじゃないのかと思ったりする今日この頃でした。
次回は実際にchain()、islice()を使って複数Queryの検索結果をPagenateさせてみたいと思います。