Propelでたくさんの行をdoSelectする関数

こんにちは、らいあです。
Dinoのプログラマーは毎日いろんなツールや関数を作って遊んでいます。
僕が今日作った関数を紹介しますね。

Peerクラスにペタって貼り付けると使えます。
プログラムって楽しいですよね!

 
    /**
     * 結果セットを指定関数に渡すdoSelectです。
     *
     * 膨大な結果セットをループでまわしたいときに使うと良いでしょう。
     * 内部的には$LIMITレコードずつOFFSET/LIMITをかけながらSQLを回します。
     * ※つまりアトミックでないことに注意すること
     *
     * @param function $proc 行オブジェクトを第一引数に受け取る関数
     * @param Criteria $crit
     * @param array options そのまま関数の第二引数に渡されます
     */
    public static function doSelectLimitedForeach($crit, $proc, $options=array())
    {
        static $LIMIT = 100;
 
        $orgOffset = $crit->getOffset();
        $orgLimit = $crit->getLimit();
        $endBounds = $orgLimit+$orgOffset;
 
        for ($offset=$orgOffset; $offset<$endBounds; $offset+=$LIMIT) {
 
            if ($offset+$LIMIT > $endBounds) {
                $limit = $endBounds-$offset;
            } else {
                $limit = $LIMIT;
            }
 
            $crit->setOffset($offset);
            $crit->setLimit($limit);
 
            foreach (self::doSelect($crit) as $it) {
                $proc($it, $options);
            }
        }
    }
 
    /**
     * 結果セットを指定関数に渡すretrieveByPKsです。
     *
     * 膨大な結果セットをループでまわしたいときに使うと良いでしょう。
     * 内部的には$LIMITレコードずつSQLを回します。
     * ※つまりアトミックでないことに注意すること
     *
     * @param function $proc 行オブジェクトを第一引数に受け取る関数
     * @param array $idList IDの一覧
     * @param array options そのまま関数の第二引数に渡されます
     */
    public static function retrieveByPKsLimitedForeach($idList, $proc, $options=array())
    {
        static $LIMIT = 100;
 
        for ($offset=0; $idList; $offset+=$LIMIT) {
 
            $target = array_splice($idList, $offset, $LIMIT);
 
            foreach (self::retrieveByPKs($target) as $it) {
                $proc($it, $options);
            }
        }
    }

コメント / トラックバック 1 件

#1 tumf 2008/04/11 09:24

$procの使い方始めてみました
call_user_funcより簡単ですね

コメントする