今日1時間悩んだ問題

問題を経過時間で絞り込んで易しい問題、難しい問題、と分類しようとか思った

    easy =   Question.all().order("elapse").filter("elapse >", 5).fetch(10)
    normal = Question.all().order("elapse").filter("elapse >", 15).fetch(14)
    hard =   Question.all().order("elapse").filter("elapse >", 25).fetch(5)

しかしこれではなぜかeasyもnormalもhardも先頭部分が同じリストが返ってくる。どこが間違っているのか答えよ。

1

2

4

8

16

32

64

解答

1年前にほぼ同じ問題に引っかかっていた。GAE DatastoreでIntegerFieldに対して不等号で絞り込む際にfloatを使っては行けない

今回のケースではelapseがdb.FloatProperty()であるにも関わらずintでfilter仕様としているのが間違い。db.FloatProperty()に対してintで絞り込むと 15.0 > 5.0 > 15 > 5 > None という順になっているらしく、5秒未満で回答した問題が存在しない関係上easyの部分が見かけ上正しく動くので「easyとnormalのなにが違うんだーーー」とはまりまくり。「こうやればいいのか?違うのか、じゃあこれか?」なんて精神状態になったら完全に泥沼にハマっているので、そういう時には一旦離れて別のことをして、戻ってきて「そういえばアレの値はどうなってんだろ」と高いところから眺めないとだな。実際はもうちょっと複雑なコードになっていたんだけど、俯瞰して整理していったらこういう問題に帰着して、あっさり解決した。