1
0
mirror of synced 2025-01-18 22:41:43 +03:00

new DQL model now supports WHERE clauses and subqueries

This commit is contained in:
zYne 2007-05-15 15:08:23 +00:00
parent 3578ca5585
commit 129fa3360a
4 changed files with 66 additions and 58 deletions

View File

@ -166,7 +166,7 @@ class Doctrine_Hydrate2
{ {
if ( ! isset($this->parts[$name])) { if ( ! isset($this->parts[$name])) {
throw new Doctrine_Hydrate_Exception('Unknown query part ' . $name); throw new Doctrine_Hydrate_Exception('Unknown query part ' . $name);
} }
$this->parts[$name] = array($part); $this->parts[$name] = array($part);
} }
/** /**
@ -174,9 +174,8 @@ class Doctrine_Hydrate2
* *
* @return void * @return void
*/ */
public function copyAliases(Doctrine_Hydrate $query) public function copyAliases($query)
{ {
$this->tableAliases = $query->getTableAliases();
$this->aliasHandler = $query->aliasHandler; $this->aliasHandler = $query->aliasHandler;
return $this; return $this;
@ -307,9 +306,11 @@ class Doctrine_Hydrate2
/** /**
* _fetch * _fetch
* *
* * @param array $params prepared statement parameters
* @param integer $fetchMode the fetchmode
* @see Doctrine::FETCH_* constants
*/ */
public function _fetch($params = array(), $return = Doctrine::FETCH_RECORD) public function _fetch($params = array(), $fetchMode = Doctrine::FETCH_RECORD)
{ {
$params = $this->conn->convertBooleans(array_merge($this->params, $params)); $params = $this->conn->convertBooleans(array_merge($this->params, $params));
@ -319,7 +320,7 @@ class Doctrine_Hydrate2
$query = $this->view->getSelectSql(); $query = $this->view->getSelectSql();
} }
if ($this->isLimitSubqueryUsed() && if ($this->isLimitSubqueryUsed() &&
$this->conn->getDBH()->getAttribute(Doctrine::ATTR_DRIVER_NAME) !== 'mysql') { $this->conn->getDBH()->getAttribute(Doctrine::ATTR_DRIVER_NAME) !== 'mysql') {
$params = array_merge($params, $params); $params = array_merge($params, $params);
@ -374,7 +375,7 @@ class Doctrine_Hydrate2
*/ */
public function execute($params = array(), $return = Doctrine::FETCH_RECORD) public function execute($params = array(), $return = Doctrine::FETCH_RECORD)
{ {
$array = (array) $this->_fetch($params = array(), $return = Doctrine::FETCH_RECORD); $array = (array) $this->_fetch($params, $return = Doctrine::FETCH_RECORD);
if (empty($this->_aliasMap)) { if (empty($this->_aliasMap)) {
throw new Doctrine_Hydrate_Exception("Couldn't execute query. Component alias map was empty."); throw new Doctrine_Hydrate_Exception("Couldn't execute query. Component alias map was empty.");

View File

@ -316,14 +316,12 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
list($dql, $alias) = $value; list($dql, $alias) = $value;
$sql = $this->createSubquery()->parseQuery($dql, false)->getQuery(); $sql = $this->createSubquery()->parseQuery($dql, false)->getQuery();
reset($this->tableAliases);
$tableAlias = current($this->tableAliases);
reset($this->compAliases);
$componentAlias = key($this->compAliases); reset($this->_aliasMap);
$componentAlias = key($this->_aliasMap);
$tableAlias = $this->getTableAlias($componentAlias);
$sqlAlias = $tableAlias . '__' . count($this->aggregateMap); $sqlAlias = $tableAlias . '__' . count($this->aggregateMap);
@ -1045,7 +1043,7 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
*/ */
public function addWhere($where, $params = array()) public function addWhere($where, $params = array())
{ {
if(is_array($params)) { if (is_array($params)) {
$this->params = array_merge($this->params, $params); $this->params = array_merge($this->params, $params);
} else { } else {
$this->params[] = $params; $this->params[] = $params;
@ -1068,10 +1066,16 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
* adds conditions to the HAVING part of the query * adds conditions to the HAVING part of the query
* *
* @param string $having DQL HAVING part * @param string $having DQL HAVING part
* @param mixed $params an array of parameters or a simple scalar
* @return Doctrine_Query * @return Doctrine_Query
*/ */
public function addHaving($having) public function addHaving($having, $params = array())
{ {
if (is_array($params)) {
$this->params = array_merge($this->params, $params);
} else {
$this->params[] = $params;
}
return $this->getParser('having')->parse($having, true); return $this->getParser('having')->parse($having, true);
} }
/** /**
@ -1150,11 +1154,8 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
*/ */
public function where($where, $params = array()) public function where($where, $params = array())
{ {
if(is_array($params)) { $this->params = (array) $params;
$this->params = array_merge($this->params, $params);
} else {
$this->params[] = $params;
}
return $this->getParser('where')->parse($where); return $this->getParser('where')->parse($where);
} }
/** /**
@ -1167,11 +1168,8 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
*/ */
public function having($having, $params) public function having($having, $params)
{ {
if(is_array($params)) { $this->params = (array) $params;
$this->params = array_merge($this->params, $params);
} else {
$this->params[] = $params;
}
return $this->getParser('having')->parse($having); return $this->getParser('having')->parse($having);
} }
/** /**

View File

@ -34,7 +34,7 @@ class Doctrine_Query_Orderby_TestCase extends Doctrine_UnitTestCase
{ {
public function testOrderByAggregateValueIsSupported() public function testOrderByAggregateValueIsSupported()
{ {
$q = new Doctrine_Query(); $q = new Doctrine_Query2();
$q->select('u.name, COUNT(p.phonenumber) count') $q->select('u.name, COUNT(p.phonenumber) count')
->from('User u') ->from('User u')
@ -45,7 +45,7 @@ class Doctrine_Query_Orderby_TestCase extends Doctrine_UnitTestCase
} }
public function testOrderByRandomIsSupported() public function testOrderByRandomIsSupported()
{ {
$q = new Doctrine_Query(); $q = new Doctrine_Query2();
$q->select('u.name, RANDOM() rand') $q->select('u.name, RANDOM() rand')
->from('User u') ->from('User u')

View File

@ -31,14 +31,16 @@
* @since 1.0 * @since 1.0
* @version $Revision$ * @version $Revision$
*/ */
class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase { class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase
{
public function prepareData() { } public function prepareData() { }
public function prepareTables() { public function prepareTables() {
$this->tables = array('entity'); $this->tables = array('entity');
parent::prepareTables(); parent::prepareTables();
} }
public function testDirectParameterSetting() { public function testDirectParameterSetting()
{
$this->connection->clear(); $this->connection->clear();
$user = new User(); $user = new User();
@ -55,14 +57,15 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone'); $this->assertEqual($users[0]->name, 'someone');
} }
public function testDirectMultipleParameterSetting() { public function testDirectMultipleParameterSetting()
{
$user = new User(); $user = new User();
$user->name = 'someone.2'; $user->name = 'someone.2';
$user->save(); $user->save();
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User')->addWhere('User.id IN (?, ?)', array(1,2)); $q->from('User')->addWhere('User.id IN (?, ?)', array(1, 2));
$users = $q->execute(); $users = $q->execute();
@ -70,10 +73,13 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone'); $this->assertEqual($users[0]->name, 'someone');
$this->assertEqual($users[1]->name, 'someone.2'); $this->assertEqual($users[1]->name, 'someone.2');
} }
public function testDirectMultipleParameterSetting2() { public function testDirectMultipleParameterSetting2()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User')->where('User.id IN (?, ?)', array(1,2)); $q->from('User')->where('User.id IN (?, ?)', array(1, 2));
$this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id FROM entity e WHERE e.id IN (?, ?) AND (e.type = 0)');
$users = $q->execute(); $users = $q->execute();
@ -82,7 +88,7 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[1]->name, 'someone.2'); $this->assertEqual($users[1]->name, 'someone.2');
// the parameters and where part should be reseted // the parameters and where part should be reseted
$q->where('User.id IN (?, ?)', array(1,2)); $q->where('User.id IN (?, ?)', array(1, 2));
$users = $q->execute(); $users = $q->execute();
@ -90,7 +96,8 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone'); $this->assertEqual($users[0]->name, 'someone');
$this->assertEqual($users[1]->name, 'someone.2'); $this->assertEqual($users[1]->name, 'someone.2');
} }
public function testNotInExpression() { public function testNotInExpression()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User u')->addWhere('u.id NOT IN (?)', array(1)); $q->from('User u')->addWhere('u.id NOT IN (?)', array(1));
@ -99,7 +106,8 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users->count(), 1); $this->assertEqual($users->count(), 1);
$this->assertEqual($users[0]->name, 'someone.2'); $this->assertEqual($users[0]->name, 'someone.2');
} }
public function testExistsExpression() { public function testExistsExpression()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$user = new User(); $user = new User();
@ -109,7 +117,7 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
// find all users which have groups // find all users which have groups
try { try {
$q->from('User u')->where('EXISTS (FROM Groupuser(id) WHERE Groupuser.user_id = u.id)'); $q->from('User u')->where('EXISTS (SELECT Groupuser.id FROM Groupuser WHERE Groupuser.user_id = u.id)');
$this->pass(); $this->pass();
} catch(Doctrine_Exception $e) { } catch(Doctrine_Exception $e) {
$this->fail(); $this->fail();
@ -119,12 +127,13 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone with a group'); $this->assertEqual($users[0]->name, 'someone with a group');
} }
public function testNotExistsExpression() { public function testNotExistsExpression()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
// find all users which don't have groups // find all users which don't have groups
try { try {
$q->from('User u')->where('NOT EXISTS (FROM Groupuser(id) WHERE Groupuser.user_id = u.id)'); $q->from('User u')->where('NOT EXISTS (SELECT Groupuser.id FROM Groupuser WHERE Groupuser.user_id = u.id)');
$this->pass(); $this->pass();
} catch(Doctrine_Exception $e) { } catch(Doctrine_Exception $e) {
$this->fail(); $this->fail();
@ -134,10 +143,12 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone'); $this->assertEqual($users[0]->name, 'someone');
$this->assertEqual($users[1]->name, 'someone.2'); $this->assertEqual($users[1]->name, 'someone.2');
} }
public function testComponentAliases() { public function testComponentAliases()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User u')->addWhere('u.id IN (?, ?)', array(1,2)); $q->from('User u')->addWhere('u.id IN (?, ?)', array(1,2));
$users = $q->execute(); $users = $q->execute();
$this->assertEqual($users->count(), 2); $this->assertEqual($users->count(), 2);
@ -145,7 +156,8 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[1]->name, 'someone.2'); $this->assertEqual($users[1]->name, 'someone.2');
} }
public function testComponentAliases2() { public function testComponentAliases2()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User u')->addWhere('u.name = ?', array('someone')); $q->from('User u')->addWhere('u.name = ?', array('someone'));
@ -155,47 +167,44 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users->count(), 1); $this->assertEqual($users->count(), 1);
$this->assertEqual($users[0]->name, 'someone'); $this->assertEqual($users[0]->name, 'someone');
} }
public function testComponentAliases3() { public function testOperatorWithNoTrailingSpaces()
{
$users = $this->connection->query("FROM User u WHERE u.name = ?", array('someone'));
$this->assertEqual($users->count(), 1);
$this->assertEqual($users[0]->name, 'someone');
}
public function testOperatorWithNoTrailingSpaces() {
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User')->where("User.name='someone'"); $q->select('User.id')->from('User')->where("User.name='someone'");
$users = $q->execute(); $users = $q->execute();
$this->assertEqual($users->count(), 1); $this->assertEqual($users->count(), 1);
$this->assertEqual($q->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name = 'someone' AND (e.type = 0)"); $this->assertEqual($q->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name = 'someone' AND (e.type = 0)");
} }
public function testOperatorWithNoTrailingSpaces2() { public function testOperatorWithNoTrailingSpaces2()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User')->where("User.name='foo.bar'"); $q->select('User.id')->from('User')->where("User.name='foo.bar'");
$users = $q->execute(); $users = $q->execute();
$this->assertEqual($users->count(), 0); $this->assertEqual($users->count(), 0);
$this->assertEqual($q->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name = 'foo.bar' AND (e.type = 0)"); $this->assertEqual($q->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name = 'foo.bar' AND (e.type = 0)");
} }
public function testOperatorWithSingleTrailingSpace() { public function testOperatorWithSingleTrailingSpace()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User')->where("User.name= 'foo.bar'"); $q->select('User.id')->from('User')->where("User.name= 'foo.bar'");
$users = $q->execute(); $users = $q->execute();
$this->assertEqual($users->count(), 0); $this->assertEqual($users->count(), 0);
$this->assertEqual($q->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name = 'foo.bar' AND (e.type = 0)"); $this->assertEqual($q->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name = 'foo.bar' AND (e.type = 0)");
} }
public function testOperatorWithSingleTrailingSpace2() { public function testOperatorWithSingleTrailingSpace2()
{
$q = new Doctrine_Query2(); $q = new Doctrine_Query2();
$q->from('User')->where("User.name ='foo.bar'"); $q->select('User.id')->from('User')->where("User.name ='foo.bar'");
$users = $q->execute(); $users = $q->execute();
$this->assertEqual($users->count(), 0); $this->assertEqual($users->count(), 0);