allegro filter展開機能
criteriaはやめてfilterにする。
class Expression{ var $text; var $parameters; public function __construct($text,$parameter = array()){ $this->text = $text; $this->parameters = $parameters; } } class ExpressionFactory{ var $ctx; public function relational($field,$parameter,$operator){ $expr = new Expression(); //TODO: when field is FieldMeta,or contains "." or not support named parameter... $expr->text = $field . " = :" . $field; $expr->parameters[] = $parameter; } public function match($field,$parameter){ $expr = new Expression(); //TODO: when field is FieldMeta,or contains "." or not support named parameter... $expr->text = $field . " LIKE :" . $field . " + '%'"; $expr->parameters[] = $parameter; } } class Filter{ function assemble($ctx){ $ctx->filterAsm->assemble($this); foreach($exprs as $expr){ $expr->assemble($ctx); $text = $expr->getText(); $parameters[] = $expr->getParameters(); } } } class FilterAssembler{ var $text; var $parameters; function assemble($filter){ foreach($filter->expressions as $expr){ $this->assembleExpression($expr); $text = $expr->getText(); $parameters[] = $expr->getParameters(); } } function assembleExpression($expr){ if($expr instanceof ComplexExpression){ $this->assembleComplexExpression($expr); } $this->text .= $expr->text; } function assembleComplexExpression($expr){ $complex = $expr; // as Complex; $complex->text = "("; foreach($complex->expressions as $subExpression){ $this->assembleExpression($subExpression); $complex->text .= $subExpression->text; } $complex->text .= ")"; } }
dbとLDAPだけだったらこれで良い。