2005-01-10
Class::DBI::Plugin::Iterator 0.05
makamakaさんから指摘があった点をいくつか修正しました。
修正点
とりあえず、
- ORDER BY があったら削る
- GROUP BY があったらCOUNT(DISTINCT cols)にてカウントする
ようにしました。
GROUP BYのほうはエイリアスを使ってるとうまく動かない気がするので、makamakaさんのようにサブクエリーを使うように変えたほうが良いのかなと思いつつ。
サブクラス
Class::DBI::Plugin::Iterator::mysql3はLIMIT構文の対応をしました。
Class::DBI::Plugin::Iterator::mysql4ではFOUND_ROWS()を使っているので、カウントできるクエリーの種類が増えたんじゃないかと思います。
countメソッドの処理
countメソッドの部分はエラー処理をちゃんとして、エラーが起こったときは通常のイテレータのデータを取得するように変更したほうがいいのかな……。
Class::DBIのEsssentials
なんと、0.92で変更になっていたんですか。
そいつはちょっとびっくり。
パフォーマンスを気にする人はちゃんとEssentialsを設定しましょう*1、ということで。
Essentialsを指定しないと余分なクエリーが増えるため、Plugin::Iteratorを使ってもあまりパフォーマンスが改善されませんからね。
Class::DBIのイテレータ
コメントにちょっと補足。
個人的には Class::DBI::Iterator が next で最後まで取得したあとに reset しない仕様とか、他にもいろいろ好きじゃない点が多かったりします*2。で、ごちゃごちゃ変更してたけど、んでもオリジナルとあわせておかないとマズイかなー、と思って現状のようになってます*3。
コメントを書いた後で気付いたんですが、makamakaさんの方式にしたほうがcountしなくて済むというメリットがあるので、次のリリースでは変更すると思います。
allメソッドもcountを使わないようにしたり、countのエラー処理も付けましたので、まあ近々。