1
0
mirror of synced 2024-12-13 22:56:04 +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])) {
throw new Doctrine_Hydrate_Exception('Unknown query part ' . $name);
}
}
$this->parts[$name] = array($part);
}
/**
@ -174,9 +174,8 @@ class Doctrine_Hydrate2
*
* @return void
*/
public function copyAliases(Doctrine_Hydrate $query)
public function copyAliases($query)
{
$this->tableAliases = $query->getTableAliases();
$this->aliasHandler = $query->aliasHandler;
return $this;
@ -307,9 +306,11 @@ class Doctrine_Hydrate2
/**
* _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));
@ -319,7 +320,7 @@ class Doctrine_Hydrate2
$query = $this->view->getSelectSql();
}
if ($this->isLimitSubqueryUsed() &&
if ($this->isLimitSubqueryUsed() &&
$this->conn->getDBH()->getAttribute(Doctrine::ATTR_DRIVER_NAME) !== 'mysql') {
$params = array_merge($params, $params);
@ -374,7 +375,7 @@ class Doctrine_Hydrate2
*/
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)) {
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;
$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);
@ -1045,7 +1043,7 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
*/
public function addWhere($where, $params = array())
{
if(is_array($params)) {
if (is_array($params)) {
$this->params = array_merge($this->params, $params);
} else {
$this->params[] = $params;
@ -1068,10 +1066,16 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
* adds conditions to the HAVING part of the query
*
* @param string $having DQL HAVING part
* @param mixed $params an array of parameters or a simple scalar
* @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);
}
/**
@ -1150,11 +1154,8 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
*/
public function where($where, $params = array())
{
if(is_array($params)) {
$this->params = array_merge($this->params, $params);
} else {
$this->params[] = $params;
}
$this->params = (array) $params;
return $this->getParser('where')->parse($where);
}
/**
@ -1167,11 +1168,8 @@ class Doctrine_Query2 extends Doctrine_Hydrate2 implements Countable
*/
public function having($having, $params)
{
if(is_array($params)) {
$this->params = array_merge($this->params, $params);
} else {
$this->params[] = $params;
}
$this->params = (array) $params;
return $this->getParser('having')->parse($having);
}
/**

View File

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

View File

@ -31,14 +31,16 @@
* @since 1.0
* @version $Revision$
*/
class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase
{
public function prepareData() { }
public function prepareTables() {
$this->tables = array('entity');
parent::prepareTables();
}
public function testDirectParameterSetting() {
public function testDirectParameterSetting()
{
$this->connection->clear();
$user = new User();
@ -55,14 +57,15 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone');
}
public function testDirectMultipleParameterSetting() {
public function testDirectMultipleParameterSetting()
{
$user = new User();
$user->name = 'someone.2';
$user->save();
$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();
@ -70,10 +73,13 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone');
$this->assertEqual($users[1]->name, 'someone.2');
}
public function testDirectMultipleParameterSetting2() {
public function testDirectMultipleParameterSetting2()
{
$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();
@ -82,7 +88,7 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[1]->name, 'someone.2');
// 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();
@ -90,7 +96,8 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone');
$this->assertEqual($users[1]->name, 'someone.2');
}
public function testNotInExpression() {
public function testNotInExpression()
{
$q = new Doctrine_Query2();
$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[0]->name, 'someone.2');
}
public function testExistsExpression() {
public function testExistsExpression()
{
$q = new Doctrine_Query2();
$user = new User();
@ -109,7 +117,7 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
// find all users which have groups
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();
} catch(Doctrine_Exception $e) {
$this->fail();
@ -119,12 +127,13 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone with a group');
}
public function testNotExistsExpression() {
public function testNotExistsExpression()
{
$q = new Doctrine_Query2();
// find all users which don't have groups
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();
} catch(Doctrine_Exception $e) {
$this->fail();
@ -134,10 +143,12 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->name, 'someone');
$this->assertEqual($users[1]->name, 'someone.2');
}
public function testComponentAliases() {
public function testComponentAliases()
{
$q = new Doctrine_Query2();
$q->from('User u')->addWhere('u.id IN (?, ?)', array(1,2));
$users = $q->execute();
$this->assertEqual($users->count(), 2);
@ -145,7 +156,8 @@ class Doctrine_Query_Where_TestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[1]->name, 'someone.2');
}
public function testComponentAliases2() {
public function testComponentAliases2()
{
$q = new Doctrine_Query2();
$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[0]->name, 'someone');
}
public function testComponentAliases3() {
$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() {
public function testOperatorWithNoTrailingSpaces()
{
$q = new Doctrine_Query2();
$q->from('User')->where("User.name='someone'");
$q->select('User.id')->from('User')->where("User.name='someone'");
$users = $q->execute();
$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)");
}
public function testOperatorWithNoTrailingSpaces2() {
public function testOperatorWithNoTrailingSpaces2()
{
$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();
$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)");
}
public function testOperatorWithSingleTrailingSpace() {
public function testOperatorWithSingleTrailingSpace()
{
$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();
$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)");
}
public function testOperatorWithSingleTrailingSpace2() {
public function testOperatorWithSingleTrailingSpace2()
{
$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();
$this->assertEqual($users->count(), 0);