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のエラー処理も付けましたので、まあ近々。

*1:あるいはSELECT * にしちゃうか。

*2:オリジナルの slice の挙動とか。prev や last や pos がないのもね。

*3:それでも slice の挙動はオリジナルと違いますが。