CDBIとDBICのsearchメソッド比較

CDBIDBICのsearchメソッド比較

Class::DBIのsearchは実際には、search自体が何かのクラスのメソッドではなく、
Class::DBI::add_searcherメソッドで動的に作られているメソッド(クロージャ)だた。
Class::DBI::add_searcherメソッドにsearchとClass::DBI::Search::Basicが
パラメータで渡されて、


*{"$self\::$name"} = sub {
$class->new(@_)->run_search;
};

と、クロージャが作られてると。

Class::DBI::Search::Basic::run_searchメソッドでは、
sth_to_objectsメソッドを実行してる。

sth_to_objectsメソッドでは、$sth->{Active}がunlessの場合、
$sth->execute(@$args)を実行。
$sth->fetchをwhileでまわして、問答無用で全カラム情報を取得。
取得したカラム情報を_ids_to_objectsメソッドに渡してると。

DBIx::Classとの大きな違いは、
$sth->fetchで一気に全情報を取ってる所ですね。
大量データのあるテーブルを検索した場合はテラヤバス。

Class::DBI::Sweetのsearchメソッドは、結局、sth_to_objectsメソッドを使ってる。
まあ、キャッシュを使って効率化は図ってるみたいですが。

前にDBICのsearchメソッド実行の流れを書きましたが、
CDBIではこんなの


searchメソッド実行
 ↓       ↓
 初回の場合   2回目以降の場合
 ↓       ↓
 executeを実行  ↓
 ↓       ↓
 fetchで全情報を取得
 ↓
 nextメソッドを実行
 ↓
 1データ取得

こんなんですた。


(追記)
このアタリにつてはkatoさんのサイトも要チェック!!
http://www.lost-season.jp/mt/2005/11/2005112322.html


(さらに追記)
DBICsvnリポジトリ
http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/