diff --git a/Doctrine/Form.class.php b/Doctrine/Form.class.php
index 4a4befdda..84a4d7018 100644
--- a/Doctrine/Form.class.php
+++ b/Doctrine/Form.class.php
@@ -45,8 +45,10 @@ class Doctrine_Form implements Iterator {
} else {
if($length <= 255) {
$elements[$column] = "\n";
- } else {
+ } elseif($length <= 4000) {
$elements[$column] = "\n";
+ } else {
+ $elements[$column] = "\n";
}
}
return $elements[$column];
diff --git a/Doctrine/Query.php b/Doctrine/Query.php
index b002006bd..5345e7f73 100644
--- a/Doctrine/Query.php
+++ b/Doctrine/Query.php
@@ -187,6 +187,7 @@ class Doctrine_Query extends Doctrine_Access {
break;
case "from":
$this->parts['columns'] = array();
+ $this->parts['join'] = array();
$this->joins = array();
$this->tables = array();
$this->fetchModes = array();
@@ -234,6 +235,7 @@ class Doctrine_Query extends Doctrine_Access {
break;
case "from":
$this->parts['columns'] = array();
+ $this->parts['join'] = array();
$this->joins = array();
$this->tables = array();
$this->fetchModes = array();
@@ -513,6 +515,8 @@ class Doctrine_Query extends Doctrine_Access {
switch($fk->getType()):
case Doctrine_Relation::ONE_COMPOSITE:
case Doctrine_Relation::ONE_AGGREGATE:
+ // one-to-one relation
+
$last->internalSet($this->connectors[$name]->getLocal(), $record->getID());
$last->initSingleReference($record);
@@ -895,42 +899,12 @@ class Doctrine_Query extends Doctrine_Access {
$operator = array_shift($e);
$value = implode(" ",$e);
$reference = implode(".",$a);
+ $count = count($a);
- if(count($a) > 1)
- $objTable = $this->tables[$a[0]]->getForeignKey(end($a))->getTable();
- else
- $objTable = $this->session->getTable(end($a));
+ $table = $this->load($reference, false);
- $where = $objTable->getTableName().".".$field." ".$operator." ".$value;
-
- if(count($a) > 1 && isset($a[1])) {
- $root = $a[0];
- $fk = $this->tables[$root]->getForeignKey($a[1]);
- if($fk instanceof Doctrine_Association) {
- $asf = $fk->getAssociationFactory();
-
- switch($fk->getType()):
- case Doctrine_Relation::ONE_AGGREGATE:
- case Doctrine_Relation::ONE_COMPOSITE:
-
- break;
- case Doctrine_Relation::MANY_AGGREGATE:
- case Doctrine_Relation::MANY_COMPOSITE:
-
- // subquery needed
- $where = $objTable->getComponentName().".".$field." ".$operator." ".$value;
- $b = $fk->getTable()->getComponentName();
-
- $graph = new Doctrine_Query($this->session);
- $graph->parseQuery("FROM $b-l WHERE $where");
- $where = $this->tables[$root]->getTableName().".".$this->tables[$root]->getIdentifier()." IN (SELECT ".$fk->getLocal()." FROM ".$asf->getTableName()." WHERE ".$fk->getForeign()." IN (".$graph->getQuery()."))";
- break;
- endswitch;
- } else
- $this->load($reference, false);
-
- } else
- $this->load($reference, false);
+ $component = $table->getComponentName();
+ $where = $this->tableAliases[$component].".".$field." ".$operator." ".$value;
}
return $where;
}
@@ -961,13 +935,18 @@ class Doctrine_Query extends Doctrine_Access {
$index += strlen($e[($key - 1)]) + 1;
// the mark here is either '.' or ':'
$mark = substr($path,($index - 1),1);
-
+
+
+ $parent = $table->getComponentName();
+
+ if(isset($this->tableAliases[$parent])) {
+ $tname = $this->tableAliases[$parent];
+ } else
+ $tname = $table->getTableName();
+
$fk = $table->getForeignKey($name);
- $name = $fk->getTable()->getComponentName();
-
- $tname = $table->getTableName();
-
+ $name = $fk->getTable()->getComponentName();
$tname2 = $fk->getTable()->getTableName();
$this->connectors[$name] = $fk;
@@ -1044,6 +1023,7 @@ class Doctrine_Query extends Doctrine_Access {
throw new DQLException($e->__toString());
}
}
+ return $table;
}
}
diff --git a/Doctrine/Record.php b/Doctrine/Record.php
index 40db6347a..b98e5c082 100644
--- a/Doctrine/Record.php
+++ b/Doctrine/Record.php
@@ -495,9 +495,10 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
// check if the property is null (= it is the Doctrine_Null object located in self::$null)
if($this->data[$name] === self::$null) {
- // no use trying to load the data from database if the Doctrine_Record is not a proxy
+ // only load the data from database if the Doctrine_Record is in proxy state
if($this->state == Doctrine_Record::STATE_PROXY) {
if( ! empty($this->collections)) {
+ // delegate the loading operation to collections in which this record resides
foreach($this->collections as $collection) {
$collection->load($this);
}
@@ -525,6 +526,9 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
}
/**
* internalSet
+ *
+ * @param mixed $name
+ * @param mixed $value
*/
final public function internalSet($name, $value) {
$this->data[$name] = $value;
diff --git a/Doctrine/Session.php b/Doctrine/Session.php
index 64c403e72..25f1a8827 100644
--- a/Doctrine/Session.php
+++ b/Doctrine/Session.php
@@ -454,8 +454,9 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
}
/**
* commits the current transaction
- * if lockmode is optimistic this method starts a transaction
+ * if lockmode is optimistic this method starts a transaction
* and commits it instantly
+ *
* @return void
*/
public function commit() {
@@ -489,12 +490,14 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
}
}
+ $this->dbh->commit();
+
} catch(PDOException $e) {
$this->rollback();
throw new Doctrine_Exception($e->getMessage());
}
- $this->dbh->commit();
+
$this->getAttribute(Doctrine::ATTR_LISTENER)->onTransactionCommit($this);
$this->delete = array();
diff --git a/tests/QueryTestCase.php b/tests/QueryTestCase.php
index 310c3c85d..e3bcd7cfe 100644
--- a/tests/QueryTestCase.php
+++ b/tests/QueryTestCase.php
@@ -17,6 +17,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
public function testManyToManyFetchingWithColumnAggregationInheritance() {
$query = new Doctrine_Query($this->session);
+
$query->from('User-l:Group-l');
$users = $query->execute();
@@ -24,6 +25,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[0]->Group->count(), 1);
$query->from('User-l.Group-l');
+
$users = $query->execute();
$this->assertEqual($users->count(), 8);
$this->assertEqual($users[0]->Group->count(), 0);
@@ -44,6 +46,32 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($users[2]->type, 0);
$this->session->flush();
+
+ $users = $query->query("FROM User-b WHERE User.Group.name = 'Action Actors'");
+ $this->assertEqual(trim($query->getQuery()),
+ "SELECT entity.id AS User__id FROM entity LEFT JOIN groupuser ON entity.id = groupuser.user_id LEFT JOIN entity AS entity2 ON entity2.id = groupuser.group_id WHERE (entity2.name = 'Action Actors') AND (entity.type = 0 || entity2.type = 1)");
+ $this->assertTrue($users instanceof Doctrine_Collection);
+ $this->assertEqual($users->count(),1);
+
+ $this->assertEqual(count($this->dbh->query($query->getQuery())->fetchAll()),1);
+
+ $users = $query->query("FROM User-b WHERE User.Group.Phonenumber.phonenumber LIKE '123 123'");
+
+ $this->assertEqual(trim($query->getQuery()),
+ "SELECT entity.id AS User__id FROM entity LEFT JOIN groupuser ON entity.id = groupuser.user_id LEFT JOIN entity AS entity2 ON entity2.id = groupuser.group_id LEFT JOIN phonenumber ON entity2.id = phonenumber.entity_id WHERE (phonenumber.phonenumber LIKE '123 123') AND (entity.type = 0 || entity2.type = 1)");
+ $this->assertTrue($users instanceof Doctrine_Collection);
+ $this->assertEqual($users->count(),1);
+
+ $users = $query->query("FROM User.Group WHERE User.Group.name = 'Action Actors'");
+ $this->assertEqual($users->count(), 1);
+ $count = $this->dbh->count();
+
+ $this->assertTrue($users instanceof Doctrine_Collection);
+ $this->assertEqual(get_class($users[0]), 'User');
+ $this->assertEqual($users[0]->Group->count(), 1);
+ $this->assertEqual($count, $this->dbh->count());
+ $this->assertEqual($users[0]->Group[0]->name, 'Action Actors');
+ $this->assertEqual($count, $this->dbh->count());
}
@@ -59,7 +87,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$task->name = "T2";
$task->ResourceAlias[0]->name = "R3";
$task->ResourceAlias[0]->Type[0]->type = 'TY2';
- $task->ResourceAlias[0]->Type[0]->type = 'TY3';
+ $task->ResourceAlias[0]->Type[1]->type = 'TY3';
$task->ResourceAlias[1]->name = "R4";
$task->ResourceAlias[2]->name = "R5";
$task->ResourceAlias[2]->Type[0]->type = 'TY4';
@@ -97,6 +125,16 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($tasks[0]->ResourceAlias[1]->Type->count(), 0);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
+
+ $this->session->clear();
+
+ $query->from("Task")->where("Task.ResourceAlias.Type.type = 'TY2' || Task.ResourceAlias.Type.type = 'TY1'");
+ $tasks = $query->execute();
+
+ $this->assertEqual($tasks->count(),2);
+ $this->assertEqual(count($this->dbh->query($query->getQuery())->fetchAll(PDO::FETCH_ASSOC)),2);
+ $this->assertEqual($tasks[0]->name, 'T1');
+ $this->assertEqual($tasks[1]->name, 'T2');
}
@@ -889,18 +927,6 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
"SELECT entity.id AS User__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (phonenumber.phonenumber REGEXP '[123]') AND (entity.type = 0)");
$this->assertEqual($users->count(),8);
- $users = $query->query("FROM User-b WHERE User.Group.name = 'Action Actors'");
- $this->assertEqual(trim($query->getQuery()),
- "SELECT entity.id AS User__id FROM entity WHERE (entity.id IN (SELECT user_id FROM groupuser WHERE group_id IN (SELECT entity.id AS Group__id FROM entity WHERE (entity.name = 'Action Actors') AND (entity.type = 1)))) AND (entity.type = 0)");
- $this->assertTrue($users instanceof Doctrine_Collection);
- $this->assertEqual($users->count(),1);
-
-
- $users = $query->query("FROM User-b WHERE User.Group.Phonenumber.phonenumber LIKE '123 123'");
- $this->assertEqual(trim($query->getQuery()),
- "SELECT entity.id AS User__id FROM entity WHERE (entity.id IN (SELECT user_id FROM groupuser WHERE group_id IN (SELECT entity.id AS Group__id FROM entity, phonenumber WHERE (phonenumber.phonenumber LIKE '123 123') AND (entity.type = 1)))) AND (entity.type = 0)");
- $this->assertTrue($users instanceof Doctrine_Collection);
- $this->assertEqual($users->count(),1);
//$values = $query->query("SELECT COUNT(User.name) AS users, MAX(User.name) AS max FROM User");
//$this->assertEqual(trim($query->getQuery()),"SELECT COUNT(entity.name) AS users, MAX(entity.name) AS max FROM entity WHERE (entity.type = 0)");