From 8abb979578790e2cf244d2fe73a740a5f03fff09 Mon Sep 17 00:00:00 2001 From: zYne Date: Sun, 1 Oct 2006 16:14:26 +0000 Subject: [PATCH] Fixes #85 --- lib/Doctrine/Hydrate.php | 4 ++ lib/Doctrine/Query.php | 9 ++- tests/QueryTestCase.php | 139 ++++++++++----------------------------- tests/run.php | 15 ++++- 4 files changed, 57 insertions(+), 110 deletions(-) diff --git a/lib/Doctrine/Hydrate.php b/lib/Doctrine/Hydrate.php index 87c2005b0..fc9a81826 100644 --- a/lib/Doctrine/Hydrate.php +++ b/lib/Doctrine/Hydrate.php @@ -50,6 +50,8 @@ abstract class Doctrine_Hydrate extends Doctrine_Access { * @var array $data fetched data */ protected $data = array(); + + protected $params = array(); /** * @var Doctrine_Connection $connection Doctrine_Connection object */ @@ -245,6 +247,8 @@ abstract class Doctrine_Hydrate extends Doctrine_Access { public function execute($params = array(), $return = Doctrine::FETCH_RECORD) { $this->collections = array(); + $params = array_merge($this->params, $params); + array_walk($params, array(__CLASS__, 'convertBoolean')); if( ! $this->view) diff --git a/lib/Doctrine/Query.php b/lib/Doctrine/Query.php index 3151380ba..c54a8810f 100644 --- a/lib/Doctrine/Query.php +++ b/lib/Doctrine/Query.php @@ -165,11 +165,18 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable { * addWhere * * @param string $where + * @param mixed $params */ - public function addWhere($where) { + public function addWhere($where, $params = array()) { $class = "Doctrine_Query_Where"; $parser = new $class($this); $this->parts['where'][] = $parser->parse($where); + + if(is_array($params)) { + $this->params = array_merge($this->params, $params); + } else { + $this->params[] = $params; + } } /** * sets a query part diff --git a/tests/QueryTestCase.php b/tests/QueryTestCase.php index 7c5dd3cc9..94077f1c8 100644 --- a/tests/QueryTestCase.php +++ b/tests/QueryTestCase.php @@ -29,88 +29,45 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase { parent::prepareTables(); $this->connection->clear(); } + public function testValidLazyPropertyFetching() { + $q = new Doctrine_Query($this->connection); + $q->from("User(id, name)"); + $users = $q->execute(); + $this->assertEqual($users->count(), 8); + $this->assertTrue($users instanceof Doctrine_Collection); + $count = count($this->dbh); + $this->assertTrue(is_string($users[0]->name)); + $this->assertEqual($count, count($this->dbh)); + $count = count($this->dbh); + $this->assertTrue(is_numeric($users[0]->email_id)); + $this->assertEqual($count + 1, count($this->dbh)); + + $this->connection->clear(); + $q->from("User(name)"); + $users = $q->execute(); + $this->assertEqual($users->count(), 8); + $count = count($this->dbh); + $this->assertTrue(is_string($users[0]->name)); + $this->assertEqual($count, count($this->dbh)); + $count = count($this->dbh); + $this->assertTrue($users[0]->getState(), Doctrine_Record::STATE_PROXY); + $this->assertTrue(is_numeric($users[0]->email_id)); + $this->assertTrue($users[0]->getState(), Doctrine_Record::STATE_CLEAN); - public function testBracktExplode() { - $str = "item OR item || item"; - $parts = Doctrine_Query::bracketExplode($str, array(' \|\| ', ' OR '), "(", ")"); - - $this->assertEqual($parts, array('item','item','item')); + $this->assertEqual($count + 1, count($this->dbh)); + $this->assertTrue($users[1]->getState(), Doctrine_Record::STATE_PROXY); + $this->assertTrue(is_numeric($users[1]->email_id)); + $this->assertTrue($users[1]->getState(), Doctrine_Record::STATE_CLEAN); + $this->assertEqual($count + 2, count($this->dbh)); + $this->assertTrue($users[2]->getState(), Doctrine_Record::STATE_PROXY); + $this->assertTrue(is_numeric($users[2]->email_id)); + $this->assertTrue($users[2]->getState(), Doctrine_Record::STATE_CLEAN); + $this->assertEqual($count + 3, count($this->dbh)); } - public function testConditionParser() { - $query = new Doctrine_Query($this->connection); - $query->from("User(id)")->where("User.name LIKE 'z%' || User.name LIKE 's%'"); - - $sql = "SELECT entity.id AS entity__id FROM entity WHERE (entity.name LIKE 'z%' OR entity.name LIKE 's%') AND (entity.type = 0)"; - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(User.name LIKE 'z%') || (User.name LIKE 's%')"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("((User.name LIKE 'z%') || (User.name LIKE 's%'))"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((User.name LIKE 'z%') || (User.name LIKE 's%')))"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((User.name LIKE 'z%') || User.name LIKE 's%'))"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(User.name LIKE 'z%') || User.name LIKE 's%' && User.name LIKE 'a%'"); - - $sql = "SELECT entity.id AS entity__id FROM entity WHERE ((entity.name LIKE 'z%' OR entity.name LIKE 's%') AND entity.name LIKE 'a%') AND (entity.type = 0)"; - - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((User.name LIKE 'z%') || User.name LIKE 's%')) && User.name LIKE 'a%'"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("((((User.name LIKE 'z%') || User.name LIKE 's%')) && User.name LIKE 'a%')"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((((User.name LIKE 'z%') || User.name LIKE 's%')) && User.name LIKE 'a%'))"); - $this->assertEqual($query->getQuery(), $sql); - - } - - public function testConditionParser2() { - $query = new Doctrine_Query($this->connection); - - $query->from("User(id)")->where("User.name LIKE 'z%' || User.name LIKE 's%'"); - - $sql = "SELECT entity.id AS entity__id FROM entity WHERE (entity.name LIKE 'z%' OR entity.name LIKE 's%') AND (entity.type = 0)"; - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(User.name LIKE 'z%') OR (User.name LIKE 's%')"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("((User.name LIKE 'z%') OR (User.name LIKE 's%'))"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((User.name LIKE 'z%') OR (User.name LIKE 's%')))"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((User.name LIKE 'z%') OR User.name LIKE 's%'))"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(User.name LIKE 'z%') OR User.name LIKE 's%' AND User.name LIKE 'a%'"); - - $sql = "SELECT entity.id AS entity__id FROM entity WHERE ((entity.name LIKE 'z%' OR entity.name LIKE 's%') AND entity.name LIKE 'a%') AND (entity.type = 0)"; - - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((User.name LIKE 'z%') OR User.name LIKE 's%')) AND User.name LIKE 'a%'"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("((((User.name LIKE 'z%') OR User.name LIKE 's%')) AND User.name LIKE 'a%')"); - $this->assertEqual($query->getQuery(), $sql); - - $query->where("(((((User.name LIKE 'z%') OR User.name LIKE 's%')) AND User.name LIKE 'a%'))"); - $this->assertEqual($query->getQuery(), $sql); - } public function testUnknownFunction() { $q = new Doctrine_Query(); @@ -888,36 +845,6 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase { $this->assertEqual($users[0]->Account->amount,3000); } - public function testValidLazyPropertyFetching() { - $q = new Doctrine_Query($this->connection); - $q->from("User-l(name)"); - $users = $q->execute(); - $this->assertEqual($users->count(), 8); - $this->assertTrue($users instanceof Doctrine_Collection_Lazy); - $count = count($this->dbh); - $this->assertTrue(is_string($users[0]->name)); - $this->assertEqual($count, count($this->dbh)); - $count = count($this->dbh); - $this->assertTrue(is_numeric($users[0]->email_id)); - $this->assertEqual($count + 1, count($this->dbh)); - - $users[0]->getTable()->clear(); - - $q->from("User-b(name)"); - $users = $q->execute(); - $this->assertEqual($users->count(), 8); - $this->assertTrue($users instanceof Doctrine_Collection_Batch); - $count = count($this->dbh); - $this->assertTrue(is_string($users[0]->name)); - $this->assertEqual($count, count($this->dbh)); - $count = count($this->dbh); - $this->assertTrue(is_numeric($users[0]->email_id)); - $this->assertEqual($count + 1, count($this->dbh)); - $this->assertTrue(is_numeric($users[1]->email_id)); - $this->assertEqual($count + 1, count($this->dbh)); - $this->assertTrue(is_numeric($users[2]->email_id)); - $this->assertEqual($count + 1, count($this->dbh)); - } public function testQueryWithComplexAliases() { $q = new Doctrine_Query($this->connection); diff --git a/tests/run.php b/tests/run.php index 83b657d66..56f174894 100644 --- a/tests/run.php +++ b/tests/run.php @@ -18,15 +18,20 @@ require_once("PessimisticLockingTestCase.php"); require_once("EventListenerChainTestCase.php"); require_once("CacheSqliteTestCase.php"); require_once("CollectionOffsetTestCase.php"); -require_once("QueryTestCase.php"); + require_once("CacheQuerySqliteTestCase.php"); require_once("ViewTestCase.php"); require_once("RawSqlTestCase.php"); require_once("CustomPrimaryKeyTestCase.php"); require_once("FilterTestCase.php"); + +require_once("QueryTestCase.php"); require_once("QueryLimitTestCase.php"); require_once("QueryMultiJoinTestCase.php"); require_once("QueryReferenceModelTestCase.php"); +require_once("QueryWhereTestCase.php"); +require_once("QueryConditionTestCase.php"); + require_once("DBTestCase.php"); require_once("SchemaTestCase.php"); require_once("ImportTestCase.php"); @@ -97,14 +102,18 @@ $test->addTestCase(new Doctrine_DataDict_Sqlite_TestCase()); $test->addTestCase(new Doctrine_BooleanTestCase()); -$test->addTestCase(new Doctrine_QueryTestCase()); - $test->addTestCase(new Doctrine_EventListener_Chain_TestCase()); $test->addTestCase(new Doctrine_RelationAccessTestCase()); $test->addTestCase(new Doctrine_CustomResultSetOrderTestCase()); +$test->addTestCase(new Doctrine_QueryTestCase()); + +$test->addTestCase(new Doctrine_Query_Where_TestCase()); + +$test->addTestCase(new Doctrine_Query_Condition_TestCase()); + //$test->addTestCase(new Doctrine_Cache_FileTestCase()); //$test->addTestCase(new Doctrine_Cache_SqliteTestCase());