Session flushing bug with proxy objects fixed
This commit is contained in:
parent
bdce1d8d62
commit
7ca5397054
@ -422,7 +422,35 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
|
|||||||
|
|
||||||
$this->data[$key] = $record;
|
$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
|
* adds a record to collection
|
||||||
* @param Doctrine_Record $record record to be added
|
* @param Doctrine_Record $record record to be added
|
||||||
|
@ -626,8 +626,9 @@ class Doctrine_Query extends Doctrine_Hydrate {
|
|||||||
|
|
||||||
if($fk->getType() == Doctrine_Relation::MANY_AGGREGATE ||
|
if($fk->getType() == Doctrine_Relation::MANY_AGGREGATE ||
|
||||||
$fk->getType() == Doctrine_Relation::MANY_COMPOSITE) {
|
$fk->getType() == Doctrine_Relation::MANY_COMPOSITE) {
|
||||||
if( ! $loadFields)
|
if( ! $loadFields) {
|
||||||
$this->subqueryAliases[] = $tname2;
|
$this->subqueryAliases[] = $tname2;
|
||||||
|
}
|
||||||
|
|
||||||
$this->needsSubquery = true;
|
$this->needsSubquery = true;
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
public function addReference(Doctrine_Record $record, Doctrine_Relation $connector, $key = null) {
|
||||||
$alias = $connector->getAlias();
|
$alias = $connector->getAlias();
|
||||||
|
|
||||||
$this->references[$alias]->add($record, $key);
|
$this->references[$alias]->internalAdd($record, $key);
|
||||||
$this->originals[$alias]->add($record, $key);
|
$this->originals[$alias]->internalAdd($record, $key);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* getReferences
|
* getReferences
|
||||||
|
@ -29,6 +29,8 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase {
|
|||||||
$this->assertEqual($users->count(), 5);
|
$this->assertEqual($users->count(), 5);
|
||||||
$users[0]->Phonenumber[0];
|
$users[0]->Phonenumber[0];
|
||||||
$this->assertEqual($count, $this->dbh->count());
|
$this->assertEqual($count, $this->dbh->count());
|
||||||
|
|
||||||
|
|
||||||
$this->assertEqual($this->query->getQuery(),
|
$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)');
|
'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];
|
$users[3]->Phonenumber[0];
|
||||||
$this->assertEqual($count, $this->dbh->count());
|
$this->assertEqual($count, $this->dbh->count());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testLimitWithOneToManyLeftJoinAndCondition() {
|
public function testLimitWithOneToManyLeftJoinAndCondition() {
|
||||||
$q = new Doctrine_Query($this->session);
|
$q = new Doctrine_Query($this->session);
|
||||||
$q->from("User(name)")->where("User.Phonenumber.phonenumber LIKE '%123%'")->limit(5);
|
$q->from("User(name)")->where("User.Phonenumber.phonenumber LIKE '%123%'")->limit(5);
|
||||||
@ -53,6 +56,7 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase {
|
|||||||
$this->assertEqual($users[4]->name, 'Jean Reno');
|
$this->assertEqual($users[4]->name, 'Jean Reno');
|
||||||
|
|
||||||
$this->assertEqual($users->count(), 5);
|
$this->assertEqual($users->count(), 5);
|
||||||
|
|
||||||
$this->assertEqual($q->getQuery(),
|
$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)");
|
"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)");
|
||||||
}
|
}
|
||||||
@ -116,23 +120,70 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase {
|
|||||||
$q->from("User(id).Phonenumber(id)");
|
$q->from("User(id).Phonenumber(id)");
|
||||||
$q->where("User.name LIKE ? || User.name LIKE ?");
|
$q->where("User.name LIKE ? || User.name LIKE ?");
|
||||||
$q->limit(5);
|
$q->limit(5);
|
||||||
|
|
||||||
$users = $q->execute(array('%zYne%', '%Arnold%'));
|
$users = $q->execute(array('%zYne%', '%Arnold%'));
|
||||||
$this->assertEqual($users->count(), 2);
|
$this->assertEqual($users->count(), 2);
|
||||||
|
|
||||||
|
|
||||||
$count = $this->dbh->count();
|
$count = $this->dbh->count();
|
||||||
$users[0]->Phonenumber[0];
|
$users[0]->Phonenumber[0];
|
||||||
$this->assertEqual($count, $this->dbh->count());
|
$this->assertEqual($count, $this->dbh->count());
|
||||||
|
|
||||||
$this->assertEqual($q->getQuery(),
|
$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)");
|
"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() {
|
public function testLimitWithManyToManyLeftJoin() {
|
||||||
$q = new Doctrine_Query($this->session);
|
$q = new Doctrine_Query($this->session);
|
||||||
$q->from("User.Group")->limit(5);
|
$q->from("User.Group")->limit(5);
|
||||||
$users = $q->execute();
|
$users = $q->execute();
|
||||||
|
|
||||||
$this->assertEqual($users->count(), 5);
|
$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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -65,9 +65,10 @@ $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_Query_Limit_TestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_RawSql_TestCase());
|
|
||||||
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
||||||
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user