Commit dfbc7c1c authored by guilhermeblanco's avatar guilhermeblanco

Changed Doctrine_Query to accept a Doctrine_EntityManager instead of a...

Changed Doctrine_Query to accept a Doctrine_EntityManager instead of a Doctrine_Connection. Updated Doctrine_EntityManager. Updated test cases and included one new passing test case for SELECT generation. Fixed whitespace bug in DELETE and UPDATE statements.
parent bc236c59
......@@ -246,7 +246,7 @@ class Doctrine_EntityManager
{
$query = new Doctrine_Query($this);
if ( ! empty($dql)) {
$query->parseQuery($dql);
$query->setDql($dql);
}
return $query;
......
......@@ -37,9 +37,9 @@
class Doctrine_Query extends Doctrine_Query_Abstract
{
/**
* @var Doctrine_Connection The connection used by this query object.
* @var Doctrine_EntityManager The entity manager used by this query object.
*/
protected $_connection;
protected $_entityManager;
/**
* @var Doctrine_Hydrator The hydrator object used to hydrate query results.
......@@ -93,15 +93,10 @@ class Doctrine_Query extends Doctrine_Query_Abstract
// End of Caching Stuff
public function __construct(Doctrine_Connection $conn = null, Doctrine_Hydrator_Abstract $hydrator = null)
public function __construct(Doctrine_EntityManager $entityManager)
{
$this->setConnection($conn);
if ($hydrator === null) {
$hydrator = new Doctrine_Hydrator(Doctrine_EntityManager::getManager());
}
$this->_hydrator = $hydrator;
$this->_entityManager = $entityManager;
$this->_hydrator = new Doctrine_Hydrator($entityManager);
$this->free();
}
......@@ -120,29 +115,13 @@ class Doctrine_Query extends Doctrine_Query_Abstract
/**
* Retrieves the assocated Doctrine_Connection to this Doctrine_Query
* Retrieves the assocated Doctrine_EntityManager to this Doctrine_Query
*
* @return Doctrine_Connection
* @return Doctrine_EntityManager
*/
public function getConnection()
public function getEntityManager()
{
return $this->_connection;
}
/**
* Defines an assocated Doctrine_Connection to this Doctrine_Query
*
* @param Doctrine_Connection $conn A valid Doctrine_Connection
* @return void
*/
public function setConnection(Doctrine_Connection $conn = null)
{
if ($conn === null) {
$conn = Doctrine_EntityManager::getManager()->getConnection();
}
$this->_connection = $conn;
return $this->_entityManager;
}
......@@ -230,7 +209,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract
public function parse()
{
if ($this->_state === self::STATE_DIRTY) {
$parser = new Doctrine_Query_Parser($this->getDql());
$parser = new Doctrine_Query_Parser($this);
$this->_parserResult = $parser->parse();
$this->_state = self::STATE_CLEAN;
}
......@@ -313,7 +292,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract
protected function _execute2($params)
{
// If there is a CacheDriver associated to cache queries...
if ($this->_queryCache || $this->_connection->getAttribute(Doctrine::ATTR_QUERY_CACHE)) {
if ($this->_queryCache || $this->_entityManager->getConnection()->getAttribute(Doctrine::ATTR_QUERY_CACHE)) {
$queryCacheDriver = $this->getQueryCacheDriver();
// Calculate hash for dql query.
......@@ -347,7 +326,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract
// Double the params if we are using limit-subquery algorithm
// We always have an instance of Doctrine_Query_ParserResult on hands...
if ($this->_parserResult->isLimitSubqueryUsed() &&
$this->_connection->getAttribute(Doctrine::ATTR_DRIVER_NAME) !== 'mysql') {
$this->_entityManager->getConnection()->getAttribute(Doctrine::ATTR_DRIVER_NAME) !== 'mysql') {
$params = array_merge($params, $params);
}
......@@ -362,7 +341,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract
protected function _prepareParams(array $params)
{
// Convert boolean params
$params = $this->_connection->convertBooleans($params);
$params = $this->_entityManager->getConnection()->convertBooleans($params);
// Convert enum params
return $this->convertEnums($params);
......@@ -399,7 +378,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract
if ($this->_resultCache instanceof Doctrine_Cache_Interface) {
return $this->_resultCache;
} else {
return $this->_connection->getResultCacheDriver();
return $this->_entityManager->getConnection()->getResultCacheDriver();
}
}
......@@ -488,7 +467,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract
if ($this->_queryCache instanceof Doctrine_Cache_Interface) {
return $this->_queryCache;
} else {
return $this->_connection->getQueryCacheDriver();
return $this->_entityManager->getConnection()->getQueryCacheDriver();
}
}
......
......@@ -111,10 +111,10 @@ class Doctrine_Query_Parser
* @param string $dql DQL to be parsed.
* @param Doctrine_Connection $connection The connection to use
*/
public function __construct($dql, Doctrine_Connection $connection = null)
public function __construct(Doctrine_Query $query)
{
$this->_scanner = new Doctrine_Query_Scanner($dql);
$this->_sqlBuilder = Doctrine_Query_SqlBuilder::fromConnection($connection);
$this->_scanner = new Doctrine_Query_Scanner($query->getDql());
$this->_sqlBuilder = Doctrine_Query_SqlBuilder::fromConnection($query->getEntityManager());
$this->_keywordTable = new Doctrine_Query_Token();
$this->_parserResult = new Doctrine_Query_ParserResult(
......
......@@ -74,7 +74,7 @@ class Doctrine_Query_ParserResult extends Doctrine_Query_AbstractResult
*
* @param array $queryFields Query fields.
*/
public function setQueryComponents(array $queryFields)
public function setQueryFields(array $queryFields)
{
$this->_queryFields = $queryFields;
}
......
......@@ -54,6 +54,6 @@ class Doctrine_Query_Production_DeleteStatement extends Doctrine_Query_Productio
// The 1=1 is needed to workaround the affected_rows in MySQL.
// Simple "DELETE FROM table_name" gives 0 affected rows.
return $this->_deleteClause->buildSql() . (($this->_whereClause !== null)
? $this->_whereClause->buildSql() : ' WHERE 1 = 1');
? ' ' . $this->_whereClause->buildSql() : ' WHERE 1 = 1');
}
}
......@@ -54,6 +54,6 @@ class Doctrine_Query_Production_UpdateStatement extends Doctrine_Query_Productio
// The 1=1 is needed to workaround the affected_rows in MySQL.
// Simple "UPDATE table_name SET column_name = value" gives 0 affected rows.
return $this->_updateClause->buildSql() . (($this->_whereClause !== null)
? $this->_whereClause->buildSql() : ' WHERE 1 = 1');
? ' ' . $this->_whereClause->buildSql() : ' WHERE 1 = 1');
}
}
......@@ -47,6 +47,6 @@ class Doctrine_Query_Production_WhereClause extends Doctrine_Query_Production
public function buildSql()
{
return ' WHERE ' . $this->_conditionalExpression->buildSql();
return 'WHERE ' . $this->_conditionalExpression->buildSql();
}
}
......@@ -42,11 +42,9 @@ abstract class Doctrine_Query_SqlBuilder
protected $_connection;
public static function fromConnection(Doctrine_Connection $connection = null)
public static function fromConnection(Doctrine_EntityManager $entityManager)
{
if ($connection === null) {
$connection = Doctrine_EntityManager::getManager()->getConnection();
}
$connection = $entityManager->getConnection();
$className = "Doctrine_Query_SqlBuilder_" . $connection->getDriverName();
$sqlBuilder = new $className();
......
This diff is collapsed.
This diff is collapsed.
......@@ -39,8 +39,8 @@ class Orm_Query_IdentifierRecognitionTest extends Doctrine_OrmTestCase
public function testSingleAliasDeclarationIsSupported()
{
$query = new Doctrine_Query;
$query->setDql('SELECT u.* FROM CmsUser u');
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery('SELECT u.* FROM CmsUser u');
$parserResult = $query->parse();
$decl = $parserResult->getQueryComponent('u');
......@@ -54,8 +54,8 @@ class Orm_Query_IdentifierRecognitionTest extends Doctrine_OrmTestCase
public function testSingleAliasDeclarationWithIndexByIsSupported()
{
$query = new Doctrine_Query;
$query->setDql('SELECT u.* FROM CmsUser u INDEX BY id');
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery('SELECT u.* FROM CmsUser u INDEX BY id');
$parserResult = $query->parse();
$decl = $parserResult->getQueryComponent('u');
......@@ -69,8 +69,8 @@ class Orm_Query_IdentifierRecognitionTest extends Doctrine_OrmTestCase
public function testQueryParserSupportsMultipleAliasDeclarations()
{
$query = new Doctrine_Query;
$query->setDql('SELECT u.* FROM CmsUser u INDEX BY id LEFT JOIN u.phonenumbers p');
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery('SELECT u.* FROM CmsUser u INDEX BY id LEFT JOIN u.phonenumbers p');
$parserResult = $query->parse();
$decl = $parserResult->getQueryComponent('u');
......@@ -93,8 +93,8 @@ class Orm_Query_IdentifierRecognitionTest extends Doctrine_OrmTestCase
public function testQueryParserSupportsMultipleAliasDeclarationsWithIndexBy()
{
$query = new Doctrine_Query;
$query->setDql('SELECT u.* FROM CmsUser u INDEX BY id LEFT JOIN u.articles a INNER JOIN u.phonenumbers pn INDEX BY phonenumber');
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery('SELECT u.* FROM CmsUser u INDEX BY id LEFT JOIN u.articles a INNER JOIN u.phonenumbers pn INDEX BY phonenumber');
$parserResult = $query->parse();
$decl = $parserResult->getQueryComponent('u');
......
......@@ -38,11 +38,11 @@ require_once 'lib/DoctrineTestInit.php';
*/
class Orm_Query_LanguageRecognitionTest extends Doctrine_OrmTestCase
{
public function assertValidDql($dql, $method = '')
public function assertValidDql($dql)
{
try {
$query = new Doctrine_Query;
$query->setDql($dql);
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery($dql);
$parserResult = $query->parse();
} catch (Doctrine_Exception $e) {
$this->fail($e->getMessage());
......@@ -52,7 +52,8 @@ class Orm_Query_LanguageRecognitionTest extends Doctrine_OrmTestCase
public function assertInvalidDql($dql)
{
try {
$query = new Doctrine_Query;
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery($dql);
$query->setDql($dql);
$parserResult = $query->parse();
......@@ -382,4 +383,14 @@ class Orm_Query_LanguageRecognitionTest extends Doctrine_OrmTestCase
$this->assertValidDql("SELECT u.id FROM CmsUser u WHERE u.name LIKE 'z|%' ESCAPE '|'");
}
public function testInvalidSyntaxIsRejected()
{
$this->assertInvalidDql("FOOBAR CmsUser");
$this->assertInvalidDql("DELETE FROM CmsUser.articles");
$this->assertInvalidDql("DELETE FROM CmsUser cu WHERE cu.articles.id > ?");
}
}
......@@ -37,25 +37,38 @@ require_once 'lib/DoctrineTestInit.php';
*/
class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase
{
public function testWithoutWhere()
public function assertSqlGeneration($dqlToBeTested, $sqlToBeConfirmed)
{
$q = new Doctrine_Query();
try {
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery($dqlToBeTested);
parent::assertEquals($sqlToBeConfirmed, $query->getSql());
$query->free();
} catch (Doctrine_Exception $e) {
$this->fail($e->getMessage());
}
}
public function testWithoutWhere()
{
// NO WhereClause
$q->setDql('SELECT u.id FROM CmsUser u');
$this->assertEquals('SELECT cu.id AS cu__id FROM cms_user cu WHERE 1 = 1', $q->getSql());
$q->free();
$this->assertSqlGeneration(
'SELECT u.id FROM CmsUser u',
'SELECT cu.id AS cu__id FROM cms_user cu WHERE 1 = 1'
);
$q->setDql('SELECT u.* FROM CmsUser u');
$this->assertEquals('SELECT cu.id AS cu__id, cu.status AS cu__status, cu.username AS cu__username, cu.name AS cu__name FROM cms_user cu WHERE 1 = 1', $q->getSql());
$q->free();
$this->assertSqlGeneration(
'SELECT u.* FROM CmsUser u',
'SELECT cu.id AS cu__id, cu.status AS cu__status, cu.username AS cu__username, cu.name AS cu__name FROM cms_user cu WHERE 1 = 1'
);
}
/*
public function testWithWhere()
{
$q = new Doctrine_Query();
// "WHERE" ConditionalExpression
// ConditionalExpression = ConditionalTerm {"OR" ConditionalTerm}
// ConditionalTerm = ConditionalFactor {"AND" ConditionalFactor}
......@@ -66,9 +79,10 @@ class Orm_Query_SelectSqlGenerationTest extends Doctrine_OrmTestCase
// | InExpression | NullComparisonExpression) | ExistsExpression
// If this one test fail, all others will fail too. That's the simplest case possible
$q->setDql('SELECT u.* FROM CmsUser u WHERE id = ?');
$this->assertEquals('DELETE FROM cms_user cu WHERE cu.id = ?', $q->getSql());
$q->free();
$this->assertSqlGeneration(
'SELECT u.* FROM CmsUser u WHERE id = ?',
'SELECT cu.id AS cu__id, cu.status AS cu__status, cu.username AS cu__username, cu.name AS cu__name FROM cms_user cu WHERE cu.id = ?'
);
}
*/
}
\ No newline at end of file
......@@ -37,17 +37,32 @@
*/
class Orm_Query_UpdateSqlGenerationTest extends Doctrine_OrmTestCase
{
public function testWithoutWhere()
public function assertSqlGeneration($dqlToBeTested, $sqlToBeConfirmed)
{
$q = new Doctrine_Query();
try {
$entityManager = Doctrine_EntityManager::getManager();
$query = $entityManager->createQuery($dqlToBeTested);
parent::assertEquals($sqlToBeConfirmed, $query->getSql());
$query->free();
} catch (Doctrine_Exception $e) {
$this->fail($e->getMessage());
}
}
public function testWithoutWhere()
{
// NO WhereClause
$q->setDql('UPDATE CmsUser u SET name = ?');
$this->assertEquals('UPDATE cms_user cu SET cu.name = ? WHERE 1 = 1', $q->getSql());
$q->free();
$this->assertSqlGeneration(
'UPDATE CmsUser u SET name = ?',
'UPDATE cms_user cu SET cu.name = ? WHERE 1 = 1'
);
$q->setDql('UPDATE CmsUser u SET name = ?, username = ?');
$this->assertEquals('UPDATE cms_user cu SET cu.name = ?, cu.username = ? WHERE 1 = 1', $q->getSql());
$q->free();
$this->assertSqlGeneration(
'UPDATE CmsUser u SET name = ?, username = ?',
'UPDATE cms_user cu SET cu.name = ?, cu.username = ? WHERE 1 = 1'
);
}
}
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