Commit 1dfbc5b0 authored by zYne's avatar zYne

fixed the handling of aliases within DQL DELETE and UPDATE queries

parent 9b525f34
...@@ -34,6 +34,30 @@ Doctrine::autoload('Doctrine_Access'); ...@@ -34,6 +34,30 @@ Doctrine::autoload('Doctrine_Access');
*/ */
abstract class Doctrine_Hydrate extends Doctrine_Access abstract class Doctrine_Hydrate extends Doctrine_Access
{ {
/**
* QUERY TYPE CONSTANTS
*/
/**
* constant for SELECT queries
*/
const SELECT = 0;
/**
* constant for DELETE queries
*/
const DELETE = 1;
/**
* constant for UPDATE queries
*/
const UPDATE = 2;
/**
* constant for INSERT queries
*/
const INSERT = 3;
/**
* constant for CREATE queries
*/
const CREATE = 4;
/** /**
* @var array $fetchmodes an array containing all fetchmodes * @var array $fetchmodes an array containing all fetchmodes
*/ */
...@@ -109,6 +133,12 @@ abstract class Doctrine_Hydrate extends Doctrine_Access ...@@ -109,6 +133,12 @@ abstract class Doctrine_Hydrate extends Doctrine_Access
'limit' => false, 'limit' => false,
'offset' => false, 'offset' => false,
); );
/**
* @var integer $type the query type
*
* @see Doctrine_Query::* constants
*/
protected $type = self::SELECT;
/** /**
* constructor * constructor
* *
...@@ -605,6 +635,24 @@ abstract class Doctrine_Hydrate extends Doctrine_Access ...@@ -605,6 +635,24 @@ abstract class Doctrine_Hydrate extends Doctrine_Access
} }
return false; return false;
} }
/**
* getType
*
* returns the type of this query object
* by default the type is Doctrine_Hydrate::SELECT but if update() or delete()
* are being called the type is Doctrine_Hydrate::UPDATE and Doctrine_Hydrate::DELETE,
* respectively
*
* @see Doctrine_Hydrate::SELECT
* @see Doctrine_Hydrate::UPDATE
* @see Doctrine_Hydrate::DELETE
*
* @return integer return the query type
*/
public function getType()
{
return $this->type;
}
/** /**
* applyInheritance * applyInheritance
* applies column aggregation inheritance to DQL / SQL query * applies column aggregation inheritance to DQL / SQL query
...@@ -627,14 +675,22 @@ abstract class Doctrine_Hydrate extends Doctrine_Access ...@@ -627,14 +675,22 @@ abstract class Doctrine_Hydrate extends Doctrine_Access
$index = 0; $index = 0;
foreach ($array as $tableAlias => $maps) { foreach ($array as $tableAlias => $maps) {
$a = array(); $a = array();
// don't use table aliases if the query isn't a select query
if ($this->type !== Doctrine_Query::SELECT) {
$tableAlias = '';
} else {
$tableAlias .= '.';
}
foreach ($maps as $map) { foreach ($maps as $map) {
$b = array(); $b = array();
foreach ($map as $field => $value) { foreach ($map as $field => $value) {
if ($index > 0) { if ($index > 0) {
$b[] = '(' . $tableAlias . '.' . $field . ' = ' . $value $b[] = '(' . $tableAlias . $field . ' = ' . $value
. ' OR ' . $tableAlias . '.' . $field . ' IS NULL)'; . ' OR ' . $tableAlias . $field . ' IS NULL)';
} else { } else {
$b[] = $tableAlias . '.' . $field . ' = ' . $value; $b[] = $tableAlias . $field . ' = ' . $value;
} }
} }
......
...@@ -31,30 +31,6 @@ Doctrine::autoload('Doctrine_Hydrate'); ...@@ -31,30 +31,6 @@ Doctrine::autoload('Doctrine_Hydrate');
* @author Konsta Vesterinen <kvesteri@cc.hut.fi> * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/ */
class Doctrine_Query extends Doctrine_Hydrate implements Countable { class Doctrine_Query extends Doctrine_Hydrate implements Countable {
/**
* QUERY TYPE CONSTANTS
*/
/**
* constant for SELECT queries
*/
const SELECT = 0;
/**
* constant for DELETE queries
*/
const DELETE = 1;
/**
* constant for UPDATE queries
*/
const UPDATE = 2;
/**
* constant for INSERT queries
*/
const INSERT = 3;
/**
* constant for CREATE queries
*/
const CREATE = 4;
/** /**
* @param array $subqueryAliases the table aliases needed in some LIMIT subqueries * @param array $subqueryAliases the table aliases needed in some LIMIT subqueries
*/ */
...@@ -87,12 +63,7 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable { ...@@ -87,12 +63,7 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable {
*/ */
private $pendingFields = array(); private $pendingFields = array();
/**
* @var integer $type the query type
*
* @see Doctrine_Query::* constants
*/
protected $type = self::SELECT;
/** /**
* create * create
...@@ -126,6 +97,7 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable { ...@@ -126,6 +97,7 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable {
$this->isSubquery = (bool) $bool; $this->isSubquery = (bool) $bool;
return $this; return $this;
} }
/** /**
* getAggregateAlias * getAggregateAlias
* *
......
...@@ -46,9 +46,9 @@ class Doctrine_Query_Set extends Doctrine_Query_Part ...@@ -46,9 +46,9 @@ class Doctrine_Query_Set extends Doctrine_Query_Part
$reference = implode('.', $e); $reference = implode('.', $e);
$alias = $this->query->getTableAlias($reference); $alias = $this->query->getTableAlias($reference);
$table = $this->query->getTable($alias);
$fieldname = $alias ? $alias . '.' . $field : $field; $result[] = $table->getColumnName($field) . ' = ' . $set[1];
$result[] = $fieldname . ' = ' . $set[1];
} }
return implode(', ', $result); return implode(', ', $result);
......
...@@ -132,7 +132,7 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition ...@@ -132,7 +132,7 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition
$trimmed = Doctrine_Query::bracketTrim($value); $trimmed = Doctrine_Query::bracketTrim($value);
if (substr($trimmed, 0, 4) == 'FROM' || substr($trimmed, 0, 6) == 'SELECT') { if (substr($trimmed, 0, 4) == 'FROM' || substr($trimmed, 0, 6) == 'SELECT') {
// subquery found // subquery found
$q = new Doctrine_Query(); $q = new Doctrine_Query();
$value = '(' . $q->isSubquery(true)->parseQuery($trimmed)->getQuery() . ')'; $value = '(' . $q->isSubquery(true)->parseQuery($trimmed)->getQuery() . ')';
...@@ -171,7 +171,13 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition ...@@ -171,7 +171,13 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition
$value = $enumIndex; $value = $enumIndex;
} }
default: default:
$fieldname = $alias ? $alias . '.' . $field : $field;
if ($this->query->getType() === Doctrine_Query::SELECT) {
$fieldname = $alias ? $alias . '.' . $field : $field;
} else {
$fieldname = $field;
}
$where = $fieldname . ' ' $where = $fieldname . ' '
. $operator . ' ' . $value; . $operator . ' ' . $value;
} }
......
...@@ -5,13 +5,13 @@ class Doctrine_Query_Delete_TestCase extends Doctrine_UnitTestCase { ...@@ -5,13 +5,13 @@ class Doctrine_Query_Delete_TestCase extends Doctrine_UnitTestCase {
$q->parseQuery('DELETE FROM User'); $q->parseQuery('DELETE FROM User');
$this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (e.type = 0)'); $this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (type = 0)');
$q = new Doctrine_Query(); $q = new Doctrine_Query();
$q->delete()->from('User'); $q->delete()->from('User');
$this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (e.type = 0)'); $this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (type = 0)');
} }
public function testDeleteAll() { public function testDeleteAll() {
$q = new Doctrine_Query(); $q = new Doctrine_Query();
......
...@@ -5,26 +5,33 @@ class Doctrine_Query_Update_TestCase extends Doctrine_UnitTestCase { ...@@ -5,26 +5,33 @@ class Doctrine_Query_Update_TestCase extends Doctrine_UnitTestCase {
$q->parseQuery("UPDATE User u SET u.name = 'someone'"); $q->parseQuery("UPDATE User u SET u.name = 'someone'");
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone' WHERE (e.type = 0)"); $this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone' WHERE (type = 0)");
$q = new Doctrine_Query(); $q = new Doctrine_Query();
$q->update('User u')->set('u.name', "'someone'"); $q->update('User u')->set('u.name', "'someone'");
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone' WHERE (e.type = 0)"); $this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone' WHERE (type = 0)");
} }
public function testUpdateWorksWithMultipleColumns() { public function testUpdateWorksWithMultipleColumns() {
$q = new Doctrine_Query(); $q = new Doctrine_Query();
$q->parseQuery("UPDATE User u SET u.name = 'someone', u.email_id = 5"); $q->parseQuery("UPDATE User u SET u.name = 'someone', u.email_id = 5");
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone', e.email_id = 5 WHERE (e.type = 0)"); $this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone', email_id = 5 WHERE (type = 0)");
$q = new Doctrine_Query(); $q = new Doctrine_Query();
$q->update('User u')->set('u.name', "'someone'")->set('u.email_id', 5); $q->update('User u')->set('u.name', "'someone'")->set('u.email_id', 5);
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone', e.email_id = 5 WHERE (e.type = 0)"); $this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone', email_id = 5 WHERE (type = 0)");
}
public function testUpdateSupportsConditions() {
$q = new Doctrine_Query();
$q->parseQuery("UPDATE User u SET u.name = 'someone' WHERE u.id = 5");
$this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone' WHERE id = 5 AND (type = 0)");
} }
} }
?> ?>
...@@ -62,7 +62,7 @@ $test = new GroupTest('Doctrine Framework Unit Tests'); ...@@ -62,7 +62,7 @@ $test = new GroupTest('Doctrine Framework Unit Tests');
// DATABASE ABSTRACTION tests // DATABASE ABSTRACTION tests
/**
// Connection drivers (not yet fully tested) // Connection drivers (not yet fully tested)
$test->addTestCase(new Doctrine_Connection_Pgsql_TestCase()); $test->addTestCase(new Doctrine_Connection_Pgsql_TestCase());
$test->addTestCase(new Doctrine_Connection_Oracle_TestCase()); $test->addTestCase(new Doctrine_Connection_Oracle_TestCase());
...@@ -196,7 +196,7 @@ $test->addTestCase(new Doctrine_CustomResultSetOrderTestCase()); ...@@ -196,7 +196,7 @@ $test->addTestCase(new Doctrine_CustomResultSetOrderTestCase());
//$test->addTestCase(new Doctrine_Collection_Offset_TestCase()); //$test->addTestCase(new Doctrine_Collection_Offset_TestCase());
// Query tests // Query tests */
$test->addTestCase(new Doctrine_Query_MultiJoin_TestCase()); $test->addTestCase(new Doctrine_Query_MultiJoin_TestCase());
$test->addTestCase(new Doctrine_Query_ReferenceModel_TestCase()); $test->addTestCase(new Doctrine_Query_ReferenceModel_TestCase());
...@@ -205,7 +205,7 @@ $test->addTestCase(new Doctrine_Query_ComponentAlias_TestCase()); ...@@ -205,7 +205,7 @@ $test->addTestCase(new Doctrine_Query_ComponentAlias_TestCase());
$test->addTestCase(new Doctrine_Query_TestCase()); $test->addTestCase(new Doctrine_Query_TestCase());
$test->addTestCase(new Doctrine_Query_ShortAliases_TestCase()); $test->addTestCase(new Doctrine_Query_ShortAliases_TestCase());
$test->addTestCase(new Doctrine_Query_Delete_TestCase());
$test->addTestCase(new Doctrine_Query_Where_TestCase()); $test->addTestCase(new Doctrine_Query_Where_TestCase());
$test->addTestCase(new Doctrine_Query_Limit_TestCase()); $test->addTestCase(new Doctrine_Query_Limit_TestCase());
$test->addTestCase(new Doctrine_Query_IdentifierQuoting_TestCase()); $test->addTestCase(new Doctrine_Query_IdentifierQuoting_TestCase());
...@@ -229,6 +229,8 @@ $test->addTestCase(new Doctrine_Cache_Apc_TestCase()); ...@@ -229,6 +229,8 @@ $test->addTestCase(new Doctrine_Cache_Apc_TestCase());
$test->addTestCase(new Doctrine_Cache_Memcache_TestCase()); $test->addTestCase(new Doctrine_Cache_Memcache_TestCase());
$test->addTestCase(new Doctrine_Cache_Sqlite_TestCase()); $test->addTestCase(new Doctrine_Cache_Sqlite_TestCase());
$test->addTestCase(new Doctrine_Query_Delete_TestCase());
// Cache tests // Cache tests
//$test->addTestCase(new Doctrine_Cache_Query_SqliteTestCase()); //$test->addTestCase(new Doctrine_Cache_Query_SqliteTestCase());
//$test->addTestCase(new Doctrine_Cache_FileTestCase()); //$test->addTestCase(new Doctrine_Cache_FileTestCase());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment