[お詫びと訂正]結合したQueryへのfetch()的アクセス
前回のエントリーでqueryをitertools.chain()してitertools.islice()すると複数のqueryを結合してfetch()できるよ。と書きましたが、その後の検証で非常に非効率な処理が走る事が判明したので訂正します。
具体的にはitertools.islice()でイテレーターをスキップさせると内部的にはスキップさせた分だけnext()が走るみたいです。
つまり
例えば
ちなみに余談ですが、
具体的にはitertools.islice()でイテレーターをスキップさせると内部的にはスキップさせた分だけnext()が走るみたいです。
つまり
islice('ABCDEFG', 2, 4)はC、Dを返すのですが、A、Bに関して戻り値に含まれないだけで内部では走査されちゃうようです。
例えば
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) #1000番から1020番のQuery結果を得る islice(qchain,1000,1020)を実行した場合、queryが1000回、next()を実行する事になります。 という訳でこの方法はトンでもないバッドノウハウだったので、この場を借りて深くお詫びいたします。
ちなみに余談ですが、
q1 = HogeModel.all().filter("name =", "Spike Spigel") q1[1000:1020]と実行した場合はfetch()が走り、next()をぶん回す事は無いようです。