■2004-12-29
* [Perl] Class::DBI::Plugin::Iteratorの改造2
Class::DBI::Plugin::Iteratorのcountは、SELECT 〜 FROMの部分を一律にSELECT count(*) FROM に書き換えるので、Music::CD->search(year => 2004, {order_by => 'artist'});
のようにORDER BYを利用すると動作しません。また例えばset_sqlを通じてGROUP BYを利用する場合、期待通りには動かないはずです。そこでnextに続き、countも改造してみました。
ORDER BY節は削除し、GROUP BY節は副問い合わせにします(ので、FROM節で副問い合わせのできないシステムではGROUP BYを入れるとcountできません)。
あとイテレータの切り替え用にplugin_iterator_off
というクラスメソッドも追加。また、next_cache_num
をイテレータ側にもオブジェクトメソッドとして導入。これで大分使い勝手がよくなりました。 (v.0.3との差分)