diff --git a/Doctrine.php b/Doctrine.php
index 8d305d4e0..0997ff058 100644
--- a/Doctrine.php
+++ b/Doctrine.php
@@ -246,6 +246,7 @@ final class Doctrine {
case "Sensei":
case "Iterator":
case "View":
+ case "Query":
$a[] = $path.DIRECTORY_SEPARATOR.$entry;
break;
default:
diff --git a/Doctrine/Cache/Query/Sqlite.php b/Doctrine/Cache/Query/Sqlite.php
index 9d5b52118..8571cb074 100644
--- a/Doctrine/Cache/Query/Sqlite.php
+++ b/Doctrine/Cache/Query/Sqlite.php
@@ -5,7 +5,7 @@ class Doctrine_Cache_Query_Sqlite implements Countable {
*/
const CACHE_TABLE = 'doctrine_query_cache';
/**
- * @var Doctrine_Table $table the table object this cache container belongs to
+ * @var Doctrine_Session $session the table object this cache container belongs to
*/
private $table;
/**
@@ -21,19 +21,19 @@ class Doctrine_Cache_Query_Sqlite implements Countable {
*
* Doctrine_Table $table
*/
- public function __construct(Doctrine_Table $table) {
- $this->table = $table;
- $dir = $this->table->getSession()->getAttribute(Doctrine::ATTR_CACHE_DIR);
+ public function __construct(Doctrine_Session $session) {
+ $this->session = $session;
+ $dir = $session->getAttribute(Doctrine::ATTR_CACHE_DIR);
if( ! is_dir($dir))
mkdir($dir, 0777);
$this->path = $dir.DIRECTORY_SEPARATOR;
- $this->dbh = $this->table->getSession()->getCacheHandler();
$this->dbh = new PDO("sqlite::memory:");
+
try {
- if($this->table->getAttribute(Doctrine::ATTR_CREATE_TABLES) === true)
+ if($this->session->getAttribute(Doctrine::ATTR_CREATE_TABLES) === true)
{
$columns = array();
$columns['query_md5'] = array('string', 32, 'notnull');
diff --git a/Doctrine/Lib.php b/Doctrine/Lib.php
index 505774b6c..d58b65a9f 100644
--- a/Doctrine/Lib.php
+++ b/Doctrine/Lib.php
@@ -131,7 +131,9 @@ class Doctrine_Lib {
$l = str_replace("SELECT","SELECT
",$l);
$l = str_replace("FROM","FROM
",$l);
$l = str_replace("LEFT JOIN","
LEFT JOIN",$l);
- $l = str_replace("WHERE","WHERE",$l);
+ $l = str_replace("WHERE","
WHERE",$l);
+ $l = str_replace("GROUP BY","
GROUP BY",$l);
+ $l = str_replace("HAVING","
HAVING",$l);
$l = str_replace("AS","AS
",$l);
$l = str_replace("ON","ON",$l);
$l = str_replace("ORDER BY","ORDER BY
",$l);
diff --git a/Doctrine/Query.php b/Doctrine/Query.php
index e83edd4c4..188678b43 100644
--- a/Doctrine/Query.php
+++ b/Doctrine/Query.php
@@ -126,9 +126,10 @@ class Doctrine_Query extends Doctrine_Access {
$this->inheritanceApplied = false;
$this->aggregate = false;
$this->data = array();
- $this->collections = array();
- $this->joined = array();
- $this->joins = array();
+ $this->collections = array();
+ $this->joins = array();
+ $this->tableIndexes = array();
+ $this->tableAliases = array();
}
/**
* loadFields
@@ -192,9 +193,29 @@ class Doctrine_Query extends Doctrine_Access {
if(isset($this->parts[$name])) {
$method = "parse".ucwords($name);
switch($name):
+ case "from":
+ $this->parts['from'] = array();
+ $this->parts['columns'] = array();
+ $this->parts['join'] = array();
+ $this->joins = array();
+ $this->tables = array();
+ $this->fetchModes = array();
+ $this->tableIndexes = array();
+ $this->tableAliases = array();
+
+ $class = "Doctrine_Query_".ucwords($name);
+ $parser = new $class($this);
+
+ $parser->parse($args[0]);
+ break;
case "where":
- case "having":
- $this->parts[$name] = array($this->$method($args[0]));
+ case "having":
+ case "orderby":
+ case "groupby":
+ $class = "Doctrine_Query_".ucwords($name);
+ $parser = new $class($this);
+
+ $this->parts[$name] = array($parser->parse($args[0]));
break;
case "limit":
case "offset":
@@ -203,14 +224,6 @@ class Doctrine_Query extends Doctrine_Access {
$this->parts[$name] = $args[0];
break;
- case "from":
- $this->parts['columns'] = array();
- $this->parts['join'] = array();
- $this->joins = array();
- $this->tables = array();
- $this->fetchModes = array();
- $this->tableIndexes = array();
- $this->tableAliases = array();
default:
$this->parts[$name] = array();
$this->$method($args[0]);
@@ -308,14 +321,9 @@ class Doctrine_Query extends Doctrine_Access {
}
- if( ! empty($this->parts["groupby"]))
- $q .= " GROUP BY ".implode(", ",$this->parts["groupby"]);
-
- if( ! empty($this->parts["having"]))
- $q .= " HAVING ".implode(" ",$this->parts["having"]);
-
- if( ! empty($this->parts["orderby"]))
- $q .= " ORDER BY ".implode(", ",$this->parts["orderby"]);
+ $q .= ( ! empty($this->parts['groupby']))?" GROUP BY ".implode(", ",$this->parts["groupby"]):'';
+ $q .= ( ! empty($this->parts['having']))?" HAVING ".implode(" ",$this->parts["having"]):'';
+ $q .= ( ! empty($this->parts['orderby']))?" ORDER BY ".implode(" ",$this->parts["orderby"]):'';
if( ! empty($this->parts["limit"]) || ! empty($this->offset))
$q = $this->session->modifyLimitQuery($q,$this->parts["limit"],$this->offset);
@@ -362,36 +370,6 @@ class Doctrine_Query extends Doctrine_Access {
return $str;
}
- /**
- * @param string $where
- * @return boolean
- */
- final public function addWhere($where) {
- if(empty($where))
- return false;
-
- if($this->parts["where"]) {
- $this->parts["where"][] = "AND (".$where.")";
- } else {
- $this->parts["where"][] = "(".$where.")";
- }
- return true;
- }
- /**
- * @param string $having
- * @return boolean
- */
- final public function addHaving($having) {
- if(empty($having))
- return false;
-
- if($this->parts["having"]) {
- $this->parts["having"][] = "AND (".$having.")";
- } else {
- $this->parts["having"][] = "(".$having.")";
- }
- return true;
- }
/**
* getData
* @param $key the component name
@@ -695,15 +673,18 @@ class Doctrine_Query extends Doctrine_Access {
case "where":
case "limit":
case "offset":
+ case "having":
$p = $part;
$parts[$part] = array();
break;
case "order":
- $p = $part;
- $i = $k+1;
- if(isset($e[$i]) && strtolower($e[$i]) == "by") {
+ case "group":
+ $i = ($k + 1);
+ if(isset($e[$i]) && strtolower($e[$i]) === "by") {
+ $p = $part;
$parts[$part] = array();
- }
+ } else
+ $parts[$p][] = $part;
break;
case "by":
continue;
@@ -719,14 +700,22 @@ class Doctrine_Query extends Doctrine_Access {
$this->parseSelect($part);
break;
case "FROM":
- $this->parseFrom($part);
- break;
- case "WHERE":
- $this->addWhere($this->parseWhere($part));
+
+ $class = "Doctrine_Query_".ucwords(strtolower($k));
+ $parser = new $class($this);
+ $parser->parse($part);
break;
+ case "GROUP":
case "ORDER":
- $this->parseOrderBy($part);
- break;
+ $k .= "by";
+ case "WHERE":
+ case "HAVING":
+ $class = "Doctrine_Query_".ucwords(strtolower($k));
+ $parser = new $class($this);
+
+ $name = strtolower($k);
+ $this->parts[$name][] = $parser->parse($part);
+ break;
case "LIMIT":
$this->parts["limit"] = trim($part);
break;
@@ -743,86 +732,9 @@ class Doctrine_Query extends Doctrine_Access {
* @param string $str
* @return void
*/
- private function parseOrderBy($str) {
- foreach(explode(",",trim($str)) as $r) {
- $r = trim($r);
- $e = explode(" ",$r);
- $a = explode(".",$e[0]);
-
- if(count($a) > 1) {
- $field = array_pop($a);
- $reference = implode(".",$a);
- $name = end($a);
-
- $this->load($reference, false);
- $alias = $this->tableAliases[$reference];
- $tname = $this->tables[$alias]->getTableName();
-
- $r = $tname.".".$field;
- if(isset($e[1]))
- $r .= " ".$e[1];
- }
- $this->parts["orderby"][] = $r;
- }
- }
- /**
- * DQL SELECT PARSER
- * parses the select part of the query string
- *
- * @param string $str
- * @return void
- */
- private function parseSelect($str) {
- $this->aggregate = true;
- foreach(explode(",",trim($str)) as $reference) {
-
- $e = explode(" AS ",trim($reference));
-
- $f = explode("(",$e[0]);
- $a = explode(".",$f[1]);
- $field = substr(array_pop($a),0,-1);
-
- $reference = trim(implode(".",$a));
-
- $objTable = $this->load($reference);
- if(isset($e[1]))
- $s = " AS $e[1]";
-
- $this->parts["columns"][] = $f[0]."(".$objTable->getTableName().".$field)$s";
-
- }
- }
- /**
- * DQL GROUP BY PARSER
- * parses the group by part of the query string
-
- * @param string $str
- * @return void
- */
- private function parseGroupBy($str) {
- foreach(explode(",", $str) as $reference) {
- $reference = trim($reference);
- $e = explode(".",$reference);
- $field = array_pop($e);
- $table = $this->load(implode(".",$e));
- $component = $table->getComponentName();
- $this->parts["groupby"][] = $this->tableAliases[$component].".".$field;
- }
- }
- /**
- * DQL FROM PARSER
- * parses the from part of the query string
-
- * @param string $str
- * @return void
- */
- private function parseFrom($str) {
- foreach(self::bracketExplode(trim($str),",", "(",")") as $reference) {
- $reference = trim($reference);
- $a = explode(".",$reference);
- $field = array_pop($a);
- $table = $this->load($reference);
- }
+ final public function parseOrderBy($str) {
+ $parser = new Doctrine_Query_Part_Orderby($this);
+ return $parser->parse($str);
}
/**
* returns Doctrine::FETCH_* constant
@@ -830,7 +742,7 @@ class Doctrine_Query extends Doctrine_Access {
* @param string $mode
* @return integer
*/
- private function parseFetchMode($mode) {
+ final public function parseFetchMode($mode) {
switch(strtolower($mode)):
case "i":
case "immediate":
@@ -856,74 +768,6 @@ class Doctrine_Query extends Doctrine_Access {
endswitch;
return $fetchmode;
}
- /**
- * DQL CONDITION PARSER
- * parses the where/having part of the query string
- *
- *
- * @param string $str
- * @return string
- */
- private function parseCondition($str, $type = 'Where') {
-
- $tmp = trim($str);
- $str = self::bracketTrim($tmp,"(",")");
-
- $brackets = false;
- $loadMethod = "load".$type;
-
- while($tmp != $str) {
- $brackets = true;
- $tmp = $str;
- $str = self::bracketTrim($str,"(",")");
- }
-
- $parts = self::bracketExplode($str," && ","(",")");
- if(count($parts) > 1) {
- $ret = array();
- foreach($parts as $part) {
- $ret[] = $this->parseCondition($part, $type);
- }
- $r = implode(" AND ",$ret);
- } else {
- $parts = self::bracketExplode($str," || ","(",")");
- if(count($parts) > 1) {
- $ret = array();
- foreach($parts as $part) {
- $ret[] = $this->parseCondition($part, $type);
- }
- $r = implode(" OR ",$ret);
- } else {
- return $this->$loadMethod($parts[0]);
- }
- }
- if($brackets)
- return "(".$r.")";
- else
- return $r;
- }
- /**
- * DQL WHERE PARSER
- * parses the where part of the query string
- *
- *
- * @param string $str
- * @return string
- */
- private function parseWhere($str) {
- return $this->parseCondition($str,'Where');
- }
- /**
- * DQL HAVING PARSER
- * parses the having part of the query string
- *
- *
- * @param string $str
- * @return string
- */
- private function parseHaving($str) {
- return $this->parseCondition($str,'Having');
- }
/**
* trims brackets
*
@@ -970,91 +814,7 @@ class Doctrine_Query extends Doctrine_Access {
}
return $term;
}
- /**
- * DQL Aggregate Function parser
- *
- * @param string $func
- * @return mixed
- */
- private function parseAggregateFunction($func) {
- $pos = strpos($func,"(");
- if($pos !== false) {
-
- $funcs = array();
-
- $name = substr($func, 0, $pos);
- $func = substr($func, ($pos + 1), -1);
- $params = self::bracketExplode($func, ",", "(", ")");
-
- foreach($params as $k => $param) {
- $params[$k] = $this->parseAggregateFunction($param);
- }
-
- $funcs = $name."(".implode(", ", $params).")";
-
- return $funcs;
-
- } else {
- if( ! is_numeric($func)) {
- $a = explode(".",$func);
- $field = array_pop($a);
- $reference = implode(".",$a);
- $table = $this->load($reference, false);
- $func = $this->tableAliases[$reference].".".$field;
-
- return $func;
- } else {
- return $func;
- }
- }
- }
- /**
- * loadHaving
- * returns the parsed query part
- *
- * @param string $having
- * @return string
- */
- private function loadHaving($having) {
- $e = self::bracketExplode($having," ","(",")");
-
- $r = array_shift($e);
- $t = explode("(",$r);
-
- $count = count($t);
- $r = $this->parseAggregateFunction($r);
- $operator = array_shift($e);
- $value = implode(" ",$e);
- $r .= " ".$operator." ".$value;
-
- return $r;
- }
- /**
- * loadWhere
- * returns the parsed query part
- *
- * @param string $where
- * @return string
- */
- private function loadWhere($where) {
- $e = explode(" ",$where);
- $r = array_shift($e);
- $a = explode(".",$r);
-
-
- if(count($a) > 1) {
- $field = array_pop($a);
- $operator = array_shift($e);
- $value = implode(" ",$e);
- $reference = implode(".",$a);
- $count = count($a);
-
- $table = $this->load($reference, false);
- $where = $this->tableAliases[$reference].".".$field." ".$operator." ".$value;
- }
- return $where;
- }
/**
* generateAlias
*
diff --git a/Doctrine/Query/Condition.php b/Doctrine/Query/Condition.php
new file mode 100644
index 000000000..a3ca4c633
--- /dev/null
+++ b/Doctrine/Query/Condition.php
@@ -0,0 +1,51 @@
+ 1) {
+ $ret = array();
+ foreach($parts as $part) {
+ $ret[] = $this->parse($part, $type);
+ }
+ $r = implode(" AND ",$ret);
+ } else {
+ $parts = Doctrine_Query::bracketExplode($str," || ","(",")");
+ if(count($parts) > 1) {
+ $ret = array();
+ foreach($parts as $part) {
+ $ret[] = $this->parse($part);
+ }
+ $r = implode(" OR ",$ret);
+ } else {
+ return $this->load($parts[0]);
+ }
+ }
+ if($brackets)
+ return "(".$r.")";
+ else
+ return $r;
+ }
+}
+?>
diff --git a/Doctrine/Query/From.php b/Doctrine/Query/From.php
new file mode 100644
index 000000000..325eab5f4
--- /dev/null
+++ b/Doctrine/Query/From.php
@@ -0,0 +1,26 @@
+query->load($reference);
+ }
+ }
+
+ public function __toString() {
+ return ( ! empty($this->parts))?implode(", ", $this->parts):'';
+ }
+}
+?>
diff --git a/Doctrine/Query/Groupby.php b/Doctrine/Query/Groupby.php
new file mode 100644
index 000000000..5d8b35137
--- /dev/null
+++ b/Doctrine/Query/Groupby.php
@@ -0,0 +1,30 @@
+query->load($ref);
+ $component = $table->getComponentName();
+ $r[] = $this->query->getTableAlias($ref).".".$field;
+ }
+ return implode(", ", $r);
+ }
+
+ public function __toString() {
+ return ( ! empty($this->parts))?implode(", ", $this->parts):'';
+ }
+}
+?>
diff --git a/Doctrine/Query/Having.php b/Doctrine/Query/Having.php
new file mode 100644
index 000000000..c962baded
--- /dev/null
+++ b/Doctrine/Query/Having.php
@@ -0,0 +1,74 @@
+ $param) {
+ $params[$k] = $this->parseAggregateFunction($param);
+ }
+
+ $funcs = $name."(".implode(", ", $params).")";
+
+ return $funcs;
+
+ } else {
+ if( ! is_numeric($func)) {
+ $a = explode(".",$func);
+ $field = array_pop($a);
+ $reference = implode(".",$a);
+ $table = $this->query->load($reference, false);
+ $func = $this->query->getTableAlias($reference).".".$field;
+
+ return $func;
+ } else {
+ return $func;
+ }
+ }
+ }
+ /**
+ * load
+ * returns the parsed query part
+ *
+ * @param string $having
+ * @return string
+ */
+ final public function load($having) {
+ $e = Doctrine_Query::bracketExplode($having," ","(",")");
+
+ $r = array_shift($e);
+ $t = explode("(",$r);
+
+ $count = count($t);
+ $r = $this->parseAggregateFunction($r);
+ $operator = array_shift($e);
+ $value = implode(" ",$e);
+ $r .= " ".$operator." ".$value;
+
+ return $r;
+ }
+ /**
+ * __toString
+ *
+ * @return string
+ */
+ public function __toString() {
+ return ( ! empty($this->parts))?implode(" AND ", $this->parts):'';
+ }
+}
+?>
diff --git a/Doctrine/Query/Orderby.php b/Doctrine/Query/Orderby.php
new file mode 100644
index 000000000..33ec8bac7
--- /dev/null
+++ b/Doctrine/Query/Orderby.php
@@ -0,0 +1,41 @@
+ 1) {
+ $field = array_pop($a);
+ $reference = implode(".",$a);
+ $name = end($a);
+
+ $this->query->load($reference, false);
+ $alias = $this->query->getTableAlias($reference);
+ $tname = $this->query->getTable($alias)->getTableName();
+
+ $r = $tname.".".$field;
+ if(isset($e[1]))
+ $r .= " ".$e[1];
+ }
+ $ret[] = $r;
+ }
+ return implode(", ", $ret);
+ }
+ public function __toString() {
+ return ( ! empty($this->parts))?implode(", ", $this->parts):'';
+ }
+}
+?>
diff --git a/Doctrine/Query/Part.php b/Doctrine/Query/Part.php
new file mode 100644
index 000000000..e6b4d0532
--- /dev/null
+++ b/Doctrine/Query/Part.php
@@ -0,0 +1,40 @@
+query = $query;
+
+ }
+
+ public function getName() {
+ return $this->name;
+ }
+
+ public function getQuery() {
+ return $this->query;
+ }
+ /**
+ * add
+ *
+ * @param string $value
+ * @return void
+ */
+ public function add($value) {
+ $method = "parse".$this->name;
+ $this->query->$method($value);
+ }
+
+ public function get($name) { }
+ public function set($name, $value) { }
+}
+
+
+?>
diff --git a/Doctrine/Query/Where.php b/Doctrine/Query/Where.php
new file mode 100644
index 000000000..edec0d3eb
--- /dev/null
+++ b/Doctrine/Query/Where.php
@@ -0,0 +1,35 @@
+ 1) {
+ $field = array_pop($a);
+ $operator = array_shift($e);
+ $value = implode(" ",$e);
+ $reference = implode(".",$a);
+ $count = count($a);
+
+ $table = $this->query->load($reference, false);
+ $where = $this->query->getTableAlias($reference).".".$field." ".$operator." ".$value;
+ }
+ return $where;
+ }
+
+ public function __toString() {
+ return ( ! empty($this->parts))?implode(" AND ", $this->parts):'';
+ }
+}
+?>
diff --git a/Doctrine/Record.php b/Doctrine/Record.php
index 256a6e282..69b8db9b4 100644
--- a/Doctrine/Record.php
+++ b/Doctrine/Record.php
@@ -173,7 +173,8 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
$this->table->getAttribute(Doctrine::ATTR_LISTENER)->onLoad($this);
}
- $this->table->getRepository()->add($this);
+ $repository = $this->table->getRepository();
+ $repository->add($this);
}
}
/**
diff --git a/Doctrine/Session.php b/Doctrine/Session.php
index 70017cb9e..97d47419d 100644
--- a/Doctrine/Session.php
+++ b/Doctrine/Session.php
@@ -39,11 +39,6 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
* @var integer $transaction_level the nesting level of transactions, used by transaction methods
*/
private $transaction_level = 0;
-
- /**
- * @var PDO $cacheHandler cache handler
- */
- private $cacheHandler;
/**
* @var array $tables an array containing all the initialized Doctrine_Table objects
* keys representing Doctrine_Table component names and values as Doctrine_Table objects
@@ -87,23 +82,8 @@ abstract class Doctrine_Session extends Doctrine_Configurable implements Countab
$this->dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- switch($this->getAttribute(Doctrine::ATTR_CACHE)):
- case Doctrine::CACHE_SQLITE:
- $dir = $this->getAttribute(Doctrine::ATTR_CACHE_DIR).DIRECTORY_SEPARATOR;
- $dsn = "sqlite:".$dir."data.cache";
-
- $this->cacheHandler = Doctrine_DB::getConn($dsn);
- $this->cacheHandler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- $this->cacheHandler->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
- break;
- endswitch;
-
$this->getAttribute(Doctrine::ATTR_LISTENER)->onOpen($this);
}
-
- public function getCacheHandler() {
- return $this->cacheHandler;
- }
/**
* returns the state of this session
*
diff --git a/tests/CacheQuerySqliteTestCase.php b/tests/CacheQuerySqliteTestCase.php
index 2b2e9a74b..db94fcad2 100644
--- a/tests/CacheQuerySqliteTestCase.php
+++ b/tests/CacheQuerySqliteTestCase.php
@@ -10,7 +10,7 @@ class Doctrine_Cache_Query_SqliteTestCase extends Doctrine_UnitTestCase {
if(file_exists($dir.DIRECTORY_SEPARATOR."stats.cache"))
unlink($dir.DIRECTORY_SEPARATOR."stats.cache");
- $this->cache = new Doctrine_Cache_Query_Sqlite($this->objTable);
+ $this->cache = new Doctrine_Cache_Query_Sqlite($this->session);
$this->cache->deleteAll();
}
public function testStore() {
diff --git a/tests/QueryTestCase.php b/tests/QueryTestCase.php
index 0769a7a84..129fad6c7 100644
--- a/tests/QueryTestCase.php
+++ b/tests/QueryTestCase.php
@@ -24,6 +24,16 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
parent::prepareTables();
}
+ /**
+ public function testQueryPart() {
+ $this->query->from[] = "User.Phonenumber";
+ $this->query->from[] = "User.Email";
+
+ $users = $this->query->execute();
+
+ $this->assertEqual($users->count(), 8);
+ }
+ */
public function testSelfReferencing() {
$query = new Doctrine_Query($this->session);
@@ -191,8 +201,6 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$query->having("COUNT(User.Phonenumber.phonenumber) > 2");
$query->groupby('User.id');
- //print Doctrine_Lib::formatSql($query->getQuery());
-
$users = $query->execute();
$this->assertEqual($users->count(), 3);
@@ -220,6 +228,20 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$users[2]->Phonenumber[1];
$this->assertEqual(++$count, $this->dbh->count());
$this->assertEqual($users[2]->Phonenumber->count(), 3);
+
+ $this->session->clear();
+ $query->from('User-l.Phonenumber-l');
+ $query->having("COUNT(User.Phonenumber.phonenumber) > 2");
+ $query->groupby('User.id');
+
+ $users = $this->session->query("FROM User-l.Phonenumber-l GROUP BY User.id HAVING COUNT(User.Phonenumber.phonenumber) > 2");
+
+ $this->assertEqual($users->count(), 3);
+
+ // test that users are in right order
+ $this->assertEqual($users[0]->id, 5);
+ $this->assertEqual($users[1]->id, 8);
+ $this->assertEqual($users[2]->id, 10);
}
public function testManyToManyFetchingWithColumnAggregationInheritance() {
@@ -257,7 +279,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$users = $query->query("FROM User-b WHERE User.Group.name = 'Action Actors'");
$this->assertEqual(trim($query->getQuery()),
- "SELECT entity.id AS entity__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 AND (entity2.type = 1 OR entity2.type IS NULL))");
+ "SELECT entity.id AS entity__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 AND (entity2.type = 1 OR entity2.type IS NULL))");
$this->assertTrue($users instanceof Doctrine_Collection);
$this->assertEqual($users->count(),1);
@@ -266,7 +288,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$users = $query->query("FROM User-b WHERE User.Group.Phonenumber.phonenumber LIKE '123 123'");
$this->assertEqual(trim($query->getQuery()),
- "SELECT entity.id AS entity__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 AND (entity2.type = 1 OR entity2.type IS NULL))");
+ "SELECT entity.id AS entity__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 AND (entity2.type = 1 OR entity2.type IS NULL))");
$this->assertTrue($users instanceof Doctrine_Collection);
$this->assertEqual($users->count(),1);
@@ -975,7 +997,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
}
- public function testQuery() {
+ public function testAlbumManager() {
$query = new Doctrine_Query($this->session);
@@ -1012,10 +1034,11 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$this->assertEqual(count($user->Album[1]->Song), 4);
$users = $query->query("FROM User WHERE User.Album.name like '%Damage%'");
+ }
-
-
+ function testQuery() {
// DYNAMIC COLLECTION EXPANDING
+ $query = new Doctrine_Query($this->session);
$user = $this->objTable->find(5);
$user->Group[1]->name = "Tough guys inc.";
@@ -1043,7 +1066,7 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$users = $query->query("FROM User-b.Phonenumber-l WHERE User.Phonenumber.phonenumber LIKE '%123%'");
$this->assertEqual(trim($query->getQuery()),
- "SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (phonenumber.phonenumber LIKE '%123%') 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 phonenumber.phonenumber LIKE '%123%' AND (entity.type = 0)");
$count = $this->session->getDBH()->count();
@@ -1110,17 +1133,17 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
$users = $query->query("FROM Email-b WHERE Email.address LIKE '%@example%'");
$this->assertEqual($query->getQuery(),
- "SELECT email.id AS email__id FROM email WHERE (email.address LIKE '%@example%')");
+ "SELECT email.id AS email__id FROM email WHERE email.address LIKE '%@example%'");
$this->assertEqual($users->count(),8);
$users = $query->query("FROM User-b WHERE User.name LIKE '%Jack%'");
- $this->assertEqual($query->getQuery(), "SELECT entity.id AS entity__id FROM entity WHERE (entity.name LIKE '%Jack%') AND (entity.type = 0)");
+ $this->assertEqual($query->getQuery(), "SELECT entity.id AS entity__id FROM entity WHERE entity.name LIKE '%Jack%' AND (entity.type = 0)");
$this->assertEqual($users->count(),0);
$users = $query->query("FROM User-b WHERE User.Phonenumber.phonenumber LIKE '%123%'");
$this->assertEqual(trim($query->getQuery()),
- "SELECT entity.id AS entity__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (phonenumber.phonenumber LIKE '%123%') AND (entity.type = 0)");
+ "SELECT entity.id AS entity__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE phonenumber.phonenumber LIKE '%123%' AND (entity.type = 0)");
$this->assertEqual($users->count(),5);
@@ -1131,6 +1154,5 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
//$this->assertTrue(isset($values['max']));
}
-
}
?>
diff --git a/tests/RecordTestCase.php b/tests/RecordTestCase.php
index c4a650af0..d3193a794 100644
--- a/tests/RecordTestCase.php
+++ b/tests/RecordTestCase.php
@@ -6,6 +6,87 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->tables[] = "enumTest";
parent::prepareTables();
}
+
+ public function testJoinTableSelfReferencing() {
+ $e = new Entity();
+ $e->name = "Entity test";
+ $this->assertTrue($e->Entity[0] instanceof Entity);
+ $this->assertTrue($e->Entity[1] instanceof Entity);
+
+ $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_TCLEAN);
+ $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_TCLEAN);
+
+ $e->Entity[0]->name = "Friend 1";
+ $e->Entity[1]->name = "Friend 2";
+
+ $e->Entity[0]->Entity[0]->name = "Friend 1 1";
+ $e->Entity[0]->Entity[1]->name = "Friend 1 2";
+
+ $e->Entity[1]->Entity[0]->name = "Friend 2 1";
+ $e->Entity[1]->Entity[1]->name = "Friend 2 2";
+
+ $this->assertEqual($e->Entity[0]->name, "Friend 1");
+ $this->assertEqual($e->Entity[1]->name, "Friend 2");
+
+ $this->assertEqual($e->Entity[0]->Entity[0]->name, "Friend 1 1");
+ $this->assertEqual($e->Entity[0]->Entity[1]->name, "Friend 1 2");
+
+ $this->assertEqual($e->Entity[1]->Entity[0]->name, "Friend 2 1");
+ $this->assertEqual($e->Entity[1]->Entity[1]->name, "Friend 2 2");
+
+
+ $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_TDIRTY);
+ $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_TDIRTY);
+
+ $e->save();
+
+ $this->assertTrue($e->Entity[0] instanceof Entity);
+ $this->assertTrue($e->Entity[1] instanceof Entity);
+
+ $this->assertEqual($e->Entity[0]->name, "Friend 1");
+ $this->assertEqual($e->Entity[1]->name, "Friend 2");
+
+ $this->assertEqual($e->Entity[0]->Entity[0]->name, "Friend 1 1");
+ $this->assertEqual($e->Entity[0]->Entity[1]->name, "Friend 1 2");
+
+ $this->assertEqual($e->Entity[1]->Entity[0]->name, "Friend 2 1");
+ $this->assertEqual($e->Entity[1]->Entity[1]->name, "Friend 2 2");
+
+ $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_CLEAN);
+ $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_CLEAN);
+
+ $e = $e->getTable()->find($e->getID());
+
+ $this->assertTrue($e->Entity[0] instanceof Entity);
+ $this->assertTrue($e->Entity[1] instanceof Entity);
+
+ $this->assertEqual($e->Entity[0]->name, "Friend 1");
+ $this->assertEqual($e->Entity[1]->name, "Friend 2");
+
+ $this->assertEqual($e->Entity[0]->Entity[0]->name, "Friend 1 1");
+ $this->assertEqual($e->Entity[0]->Entity[1]->name, "Friend 1 2");
+
+ $this->assertEqual($e->Entity[1]->Entity[0]->name, "Friend 2 1");
+ $this->assertEqual($e->Entity[1]->Entity[1]->name, "Friend 2 2");
+
+ $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_CLEAN);
+ $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_CLEAN);
+
+ $coll = $this->session->query("FROM Entity WHERE Entity.name = 'Friend 1'");
+ $this->assertEqual($coll->count(), 1);
+ $this->assertEqual($coll[0]->getState(), Doctrine_Record::STATE_CLEAN);
+
+ $this->assertEqual($coll[0]->name, "Friend 1");
+
+ $query = new Doctrine_Query($this->session);
+
+ $query->from("Entity.Entity")->where("Entity.Entity.name = 'Friend 1 1'");
+
+ $coll = $query->execute();
+
+ $this->assertEqual($coll->count(), 1);
+ }
+
public function testEnumType() {
$enum = new EnumTest();
$enum->status = "open";
@@ -44,52 +125,7 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
$this->assertEqual($user->name, 'z');
}
- public function testJoinTableSelfReferencing() {
- $e = new Entity();
- $e->name = "Entity test";
- $this->assertTrue($e->Entity[0] instanceof Entity);
- $this->assertTrue($e->Entity[1] instanceof Entity);
- $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_TCLEAN);
- $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_TCLEAN);
-
- $e->Entity[0]->name = "Subentity 1";
- $e->Entity[1]->name = "Subentity 2";
-
- $this->assertEqual($e->Entity[0]->name, "Subentity 1");
- $this->assertEqual($e->Entity[1]->name, "Subentity 2");
-
- $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_TDIRTY);
- $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_TDIRTY);
-
- $e->save();
-
- $this->assertTrue($e->Entity[0] instanceof Entity);
- $this->assertTrue($e->Entity[1] instanceof Entity);
-
- $this->assertEqual($e->Entity[0]->name, "Subentity 1");
- $this->assertEqual($e->Entity[1]->name, "Subentity 2");
-
- $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_CLEAN);
- $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_CLEAN);
-
- $e = $e->getTable()->find($e->getID());
-
- $this->assertTrue($e->Entity[0] instanceof Entity);
- $this->assertTrue($e->Entity[1] instanceof Entity);
-
- $this->assertEqual($e->Entity[0]->name, "Subentity 1");
- $this->assertEqual($e->Entity[1]->name, "Subentity 2");
-
- $this->assertEqual($e->Entity[0]->getState(), Doctrine_Record::STATE_CLEAN);
- $this->assertEqual($e->Entity[1]->getState(), Doctrine_Record::STATE_CLEAN);
-
- $coll = $this->session->query("FROM Entity WHERE Entity.name = 'Subentity 1'");
- $this->assertEqual($coll->count(), 1);
- $this->assertEqual($coll[0]->getState(), Doctrine_Record::STATE_CLEAN);
-
- $this->assertEqual($coll[0]->name, "Subentity 1");
- }
public function testCompositePK() {
$record = new EntityReference();
diff --git a/tests/run.php b/tests/run.php
index 5e8540738..db87128e5 100644
--- a/tests/run.php
+++ b/tests/run.php
@@ -61,16 +61,18 @@ $test->addTestCase(new Doctrine_QueryTestCase());
print "
"; $test->run(new HtmlReporter()); +/** $cache = Doctrine_Manager::getInstance()->getCurrentSession()->getCacheHandler(); if(isset($cache)) { $a = $cache->getQueries(); print "Executed cache queries: ".count($a)."\n"; - /** + foreach($a as $query) { print $query."\n"; } - */ + } +*/ $dbh = Doctrine_Manager::getInstance()->getCurrentSession()->getDBH(); $a = $dbh->getQueries();