. */ /** * InExpression = ["NOT"] "IN" "(" (Atom {"," Atom} | Subselect) ")" * * @package Doctrine * @subpackage Query * @author Guilherme Blanco * @author Janne Vanhala * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://www.phpdoctrine.org * @since 1.0 * @version $Revision$ */ class Doctrine_Query_Production_InExpression extends Doctrine_Query_Production { protected $_not; protected $_subselect; protected $_atoms = array(); public function syntax($paramHolder) { // InExpression = ["NOT"] "IN" "(" (Atom {"," Atom} | Subselect) ")" $this->_not = false; if ($this->_isNextToken(Doctrine_Query_Token::T_NOT)) { $this->_parser->match(Doctrine_Query_Token::T_NOT); $this->_not = true; } $this->_parser->match(Doctrine_Query_Token::T_IN); $this->_parser->match('('); if ($this->_isNextToken(Doctrine_Query_Token::T_SELECT)) { $this->_subselect = $this->AST('Subselect', $paramHolder); } else { $this->_atoms[] = $this->AST('Atom', $paramHolder); while ($this->_isNextToken(',')) { $this->_parser->match(','); $this->_atoms[] = $this->AST('Atom', $paramHolder); } } $this->_parser->match(')'); } public function buildSql() { return (($this->_not) ? 'NOT ' : '') . 'IN (' . (($this->_subselect !== null) ? $this->_subselect->buildSql() : implode(', ', $this->_mapAtoms())) . ')'; } protected function _mapAtoms() { return array_map(array(&$this, '_mapAtom'), $this->_atoms); } protected function _mapAtom($value) { return $value->buildSql(); } }