diff --git a/Doctrine/Collection.php b/Doctrine/Collection.php index 49a113af0..6accf1def 100644 --- a/Doctrine/Collection.php +++ b/Doctrine/Collection.php @@ -422,7 +422,35 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator $this->data[$key] = $record; } + /** + * adds a record to collection + * @param Doctrine_Record $record record to be added + * @param string $key optional key for the record + * @return boolean + */ + public function internalAdd(Doctrine_Record $record,$key = null) { + if(in_array($record,$this->data)) + return false; + + if(isset($this->reference_field)) + $record->internalSet($this->reference_field,$this->reference); + if(isset($key)) { + if(isset($this->data[$key])) + return false; + + $this->data[$key] = $record; + return true; + } + + if(isset($this->generator)) { + $key = $this->generator->getIndex($record); + $this->data[$key] = $record; + } else + $this->data[] = $record; + + return true; + } /** * adds a record to collection * @param Doctrine_Record $record record to be added diff --git a/Doctrine/Query.php b/Doctrine/Query.php index 29b3d940e..096f8f57e 100644 --- a/Doctrine/Query.php +++ b/Doctrine/Query.php @@ -626,9 +626,10 @@ class Doctrine_Query extends Doctrine_Hydrate { if($fk->getType() == Doctrine_Relation::MANY_AGGREGATE || $fk->getType() == Doctrine_Relation::MANY_COMPOSITE) { - if( ! $loadFields) + if( ! $loadFields) { $this->subqueryAliases[] = $tname2; - + } + $this->needsSubquery = true; } diff --git a/Doctrine/Record.php b/Doctrine/Record.php index 3e2559b6e..ba3516138 100644 --- a/Doctrine/Record.php +++ b/Doctrine/Record.php @@ -1035,8 +1035,8 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite public function addReference(Doctrine_Record $record, Doctrine_Relation $connector, $key = null) { $alias = $connector->getAlias(); - $this->references[$alias]->add($record, $key); - $this->originals[$alias]->add($record, $key); + $this->references[$alias]->internalAdd($record, $key); + $this->originals[$alias]->internalAdd($record, $key); } /** * getReferences diff --git a/tests/QueryLimitTestCase.php b/tests/QueryLimitTestCase.php index df412714a..19518d960 100644 --- a/tests/QueryLimitTestCase.php +++ b/tests/QueryLimitTestCase.php @@ -29,6 +29,8 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase { $this->assertEqual($users->count(), 5); $users[0]->Phonenumber[0]; $this->assertEqual($count, $this->dbh->count()); + + $this->assertEqual($this->query->getQuery(), 'SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id, phonenumber.phonenumber AS phonenumber__phonenumber, phonenumber.entity_id AS phonenumber__entity_id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity WHERE (entity.type = 0) LIMIT 5) AND (entity.type = 0)'); @@ -41,6 +43,7 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase { $users[3]->Phonenumber[0]; $this->assertEqual($count, $this->dbh->count()); } + public function testLimitWithOneToManyLeftJoinAndCondition() { $q = new Doctrine_Query($this->session); $q->from("User(name)")->where("User.Phonenumber.phonenumber LIKE '%123%'")->limit(5); @@ -53,10 +56,11 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase { $this->assertEqual($users[4]->name, 'Jean Reno'); $this->assertEqual($users->count(), 5); + $this->assertEqual($q->getQuery(), "SELECT entity.id AS entity__id, entity.name AS entity__name FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE phonenumber.phonenumber LIKE '%123%' AND (entity.type = 0) LIMIT 5) AND phonenumber.phonenumber LIKE '%123%' AND (entity.type = 0)"); - } - + } + public function testLimitWithOneToManyLeftJoinAndOrderBy() { $q = new Doctrine_Query($this->session); $q->from("User(name)")->where("User.Phonenumber.phonenumber LIKE '%123%'")->orderby("User.Email.address")->limit(5); @@ -108,7 +112,7 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase { $count = $this->dbh->count(); $users[0]->Phonenumber[0]; $this->assertEqual($count, $this->dbh->count()); - + $this->assertEqual($q->getQuery(), 'SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity WHERE entity.name = ? AND (entity.type = 0) LIMIT 5) AND entity.name = ? AND (entity.type = 0)'); @@ -116,23 +120,70 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase { $q->from("User(id).Phonenumber(id)"); $q->where("User.name LIKE ? || User.name LIKE ?"); $q->limit(5); - $users = $q->execute(array('%zYne%', '%Arnold%')); $this->assertEqual($users->count(), 2); + + $count = $this->dbh->count(); $users[0]->Phonenumber[0]; $this->assertEqual($count, $this->dbh->count()); $this->assertEqual($q->getQuery(), "SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity WHERE (entity.name LIKE ? OR entity.name LIKE ?) AND (entity.type = 0) LIMIT 5) AND (entity.name LIKE ? OR entity.name LIKE ?) AND (entity.type = 0)"); + + } + + public function testConnectionFlushing() { + $q = new Doctrine_Query(); + $q->from("User(id).Phonenumber(id)"); + $q->where("User.name = ?"); + $q->limit(5); + $users = $q->execute(array('zYne')); + + $this->assertEqual($users->count(), 1); + $this->session->flush(); } + public function testLimitWithManyToManyLeftJoin() { $q = new Doctrine_Query($this->session); $q->from("User.Group")->limit(5); $users = $q->execute(); $this->assertEqual($users->count(), 5); + + $user = $this->objTable->find(5); + $user->Group[1]->name = "Tough guys inc."; + $user->Group[2]->name = "Terminators"; + + $user2 = $this->objTable->find(4); + $user2->Group = $user->Group; + + $user3 = $this->objTable->find(6); + $user3->Group = $user->Group; + + $this->assertEqual($user->Group[0]->name, "Action Actors"); + + $this->session->flush(); + + $this->assertEqual($user->Group[0]->name, "Action Actors"); + $this->assertEqual(count($user->Group), 3); + + + + $q = new Doctrine_Query(); + $q->from("User")->where("User.Group.id = ?")->orderby("User.id DESC")->limit(5); + $users = $q->execute(array($user->Group[1]->id)); + + $this->assertEqual($users->count(), 3); + + $this->session->clear(); + $q = new Doctrine_Query(); + $q->from("User")->where("User.Group.id = ?")->orderby("User.id DESC"); + $users = $q->execute(array($user->Group[1]->id)); + + $this->assertEqual($users->count(), 3); } + } ?> diff --git a/tests/run.php b/tests/run.php index 509e4bb02..99a324864 100644 --- a/tests/run.php +++ b/tests/run.php @@ -63,11 +63,12 @@ $test->addTestCase(new Doctrine_ValidatorTestCase()); $test->addTestCase(new Doctrine_CollectionTestCase()); -$test->addTestCase(new Doctrine_QueryTestCase()); +$test->addTestCase(new Doctrine_QueryTestCase()); + +$test->addTestCase(new Doctrine_RawSql_TestCase()); $test->addTestCase(new Doctrine_Query_Limit_TestCase()); -$test->addTestCase(new Doctrine_RawSql_TestCase()); //$test->addTestCase(new Doctrine_Cache_FileTestCase()); //$test->addTestCase(new Doctrine_Cache_SqliteTestCase());