From 73942e7ec7d51e07f76af8280e0ee9db16eafd45 Mon Sep 17 00:00:00 2001 From: zYne Date: Fri, 23 Mar 2007 20:25:56 +0000 Subject: [PATCH] Check constraint parser added --- lib/Doctrine/Query/Check.php | 159 +++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 lib/Doctrine/Query/Check.php diff --git a/lib/Doctrine/Query/Check.php b/lib/Doctrine/Query/Check.php new file mode 100644 index 000000000..babb35f82 --- /dev/null +++ b/lib/Doctrine/Query/Check.php @@ -0,0 +1,159 @@ +. + */ + +/** + * Doctrine_Query_Check + * + * @package Doctrine + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision: 1080 $ + * @author Konsta Vesterinen + */ +class Doctrine_Query_Check +{ + /** + * @var Doctrine_Table $table Doctrine_Table object + */ + protected $table; + /** + * @var string $sql database specific sql CHECK constraint definition + * parsed from the given dql CHECK definition + */ + protected $sql; + /** + * @param Doctrine_Table|string $table Doctrine_Table object + */ + public function __construct($table) + { + if ( ! ($table instanceof Doctrine_Table)) { + $table = Doctrine_Manager::getInstance() + ->getCurrentConnection() + ->getTable($table); + } + $this->table = $table; + } + /** + * getTable + * returns the table object associated with this object + * + * @return Doctrine_Connection + */ + public function getTable() + { + return $this->table; + } + /** + * parse + * + * @param string $dql DQL CHECK constraint definition + * @return string + */ + public function parse($dql) + { + $this->sql = $this->parseClause($dql); + } + /** + * parseClause + * + * @param string $alias component alias + * @param string $field the field name + * @param mixed $value the value of the field + * @return void + */ + public function parseClause($dql) + { + $parts = Doctrine_Query::sqlExplode($dql, ' AND '); + + if (count($parts) > 1) { + $ret = array(); + foreach ($parts as $part) { + $ret[] = $this->parseSingle($part); + } + + $r = implode(' AND ', $ret); + } else { + $parts = Doctrine_Query::quoteExplode($dql, ' OR '); + if (count($parts) > 1) { + $ret = array(); + foreach ($parts as $part) { + $ret[] = $this->parseClause($part); + } + + $r = implode(' OR ', $ret); + } else { + $ret = $this->parseSingle($dql); + return $ret; + } + } + return '(' . $r . ')'; + } + public function parseSingle($part) + { + $e = explode(' ', $part); + + $e[0] = $this->parseFunction($e[0]); + + switch ($e[1]) { + case '>': + case '<': + case '=': + case '!=': + case '<>': + + break; + default: + throw new Doctrine_Query_Exception('Unknown operator ' . $e[1]); + } + + return implode(' ', $e); + } + public function parseFunction($dql) + { + if (($pos = strpos($dql, '(')) !== false) { + $func = substr($dql, 0, $pos); + $value = substr($dql, ($pos + 1), -1); + + $expr = $this->table->getConnection()->expression; + + if ( ! method_exists($expr, $func)) { + throw new Doctrine_Query_Exception('Unknown function ' . $func); + } + + $func = $expr->$func($value); + } + return $func; + } + /** + * getSql + * + * returns database specific sql CHECK constraint definition + * parsed from the given dql CHECK definition + * + * @return string + */ + public function getSql() + { + return $this->sql; + } +}