[seasar-php:131] Re: S2DaoのDTOについて

ISHITOYA Kentaro [E-MAIL ADDRESS DELETED]
2007年 5月 13日 (日) 01:20:23 JST


石戸谷です。

もうひとつ報告させていただきます。
SQLParserImplの33行目
$sql = preg_replace('/(.+);$/s', '\1', trim($sql));
が、ボトルネックになっています。

xdebugをいれて計測したところ、このpreg_replaceで3000文字ほどのSQLの処理
に7秒かかっていました。
最後の;があればすぐに処理が帰るのですが、セミコロンが存在しない文字列に
対してこの正規表現を適用するとものすごく重くなります。正規表現の内部処理
には疎いのでなぜ遅くなるかはわからないです。

$sql = preg_replace('/;$/s', '', trim($sql));
とすると、問題ない速度になりましたが、処理的にはあっていますでしょうか。

以上です。
失礼いたします。

ISHITOYA Kentaro wrote:
> 石戸谷です。
>
> ご返答ありがとうございます。
>   
>> "nickname" というカラム名はBeanで指定されているみたいなのですが、
>> DTO側でも_COLUMN定義で"nickname" と指定しても動作は変わらずでしょうか
>>     
> _COLUMNを定義しても、動作は変わりませんでした。
>
> 下記485行目周辺をコメントアウトすると、
> persons.nickname = 'administrator'
> というWHERE句が生成され、元に戻すと、生成されませんでした。
> 利用したDTOは下記です。
>
> class CMMesse_AutoPersonsDto extends CMMesse_Entity{
> protected $nickname;
> const nickname_COLUMN = 'nickname';
> public function setNickname($entity){
> $this->nickname = $entity;
> }
> public function getNickname(){ return $this->nickname; }
> }
>
> ところで、createAutoSelectSqlByDtoで生成されるWHERE句ですが、Dtoに複数の
> プロパティがあって、先行するプロパティが nullのときに、不必要なANDが生成
> されてしまいます。
> 具体的には、
> class hogeDto{
> protected $first;
> protected $second;
> protected $third;
> }
> のとき、次のように$firstがnullだと、
> $hogeDto->setFirst(null);
> $hogeDto->setSecond('moge');
> $hogeDto->setThird('hoga');
>
> SQLコマンドが、
> WHERE /*BEGIN*/ WHERE
> /*IF $first != null */$first = /*$first*/null /*END*/
> /*IF $second != null */AND $second = /*$second*/null /*END*/
> /*IF $third != null */AND $third = /*$third*/null /*END*/
> /*END*/
> となり、SQL文は
>
> AND $second = 'moge' AND $third = 'hoga'
>
> となってしまいます。
> あまりうまい解決方法が思い浮かばないので、ご報告まで。
>
> 以上よろしくお願いいたします。
> _______________________________________________
> seasar-php mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-php
>   



seasar-php メーリングリストの案内