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だけだったらこれで良い。