From 782f073ebe0dd3c9c637ba5656a23863c98bd701 Mon Sep 17 00:00:00 2001 From: romanb Date: Mon, 28 May 2007 17:02:18 +0000 Subject: [PATCH] Added a failing test. --- tests/Query/MultiJoin2TestCase.php | 72 ++++++ tests/Query/MultiJoinTestCase.php | 360 ++++++++++++++--------------- tests/classes.php | 95 ++++++++ tests/run.php | 2 + 4 files changed, 349 insertions(+), 180 deletions(-) create mode 100644 tests/Query/MultiJoin2TestCase.php diff --git a/tests/Query/MultiJoin2TestCase.php b/tests/Query/MultiJoin2TestCase.php new file mode 100644 index 000000000..7df2e8f17 --- /dev/null +++ b/tests/Query/MultiJoin2TestCase.php @@ -0,0 +1,72 @@ +. + */ + +/** + * Doctrine_Query_MultiJoin2_TestCase + * + * @package Doctrine + * @author Konsta Vesterinen + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + */ +class Doctrine_Query_MultiJoin2_TestCase extends Doctrine_UnitTestCase { + public function testInitializeData() { + $query = new Doctrine_Query($this->connection); + + $cat = new QueryTest_Category(); + $cat->rootCategoryId = 0; + $cat->parentCategoryId = 0; + $cat->name = "Cat1"; + $cat->position = 0; + $cat->save(); + + $board = new QueryTest_Board(); + $board->name = "B1"; + $board->categoryId = $cat->id; + $board->position = 0; + $board->save(); + + $author = new QueryTest_User(); + $author->username = "romanb"; + $author->save(); + + $lastEntry = new QueryTest_Entry(); + $lastEntry->authorId = $author->id; + $lastEntry->date = 1234; + $lastEntry->save(); + + } + public function testMultipleJoinFetchingWithDeepJoins() { + $query = new Doctrine_Query($this->connection); + $categories = $query->select("c.*, subCats.*, b.*, le.*, a.*") + ->from("QueryTest_Category c") + ->leftJoin("c.subCategories subCats") + ->leftJoin("c.boards b") + ->leftJoin("b.lastEntry le") + ->leftJoin("le.author a") + ->where("c.parentCategoryId = 0") + ->orderBy("c.position ASC, subCats.position ASC, b.position ASC") + ->execute(); + } +} diff --git a/tests/Query/MultiJoinTestCase.php b/tests/Query/MultiJoinTestCase.php index 19065479c..16b0985f9 100644 --- a/tests/Query/MultiJoinTestCase.php +++ b/tests/Query/MultiJoinTestCase.php @@ -1,180 +1,180 @@ -. - */ - -/** - * Doctrine_Query_MultiJoin_TestCase - * - * @package Doctrine - * @author Konsta Vesterinen - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @category Object Relational Mapping - * @link www.phpdoctrine.com - * @since 1.0 - * @version $Revision$ - */ -class Doctrine_Query_MultiJoin_TestCase extends Doctrine_UnitTestCase { - public function testInitializeData() { - - $query = new Doctrine_Query($this->connection); - - $user = $this->connection->getTable('User')->find(4); - - - $album = $this->connection->create('Album'); - $album->Song[0]; - - $user->Album[0]->name = 'Damage Done'; - $user->Album[1]->name = 'Haven'; - - $user->Album[0]->Song[0]->title = 'Damage Done'; - $user->Album[0]->Song[1]->title = 'The Treason Wall'; - $user->Album[0]->Song[2]->title = 'Monochromatic Stains'; - - $this->assertEqual(count($user->Album[0]->Song), 3); - - - $user->Album[1]->Song[0]->title = 'Not Built To Last'; - $user->Album[1]->Song[1]->title = 'The Wonders At Your Feet'; - $user->Album[1]->Song[2]->title = 'Feast Of Burden'; - $user->Album[1]->Song[3]->title = 'Fabric'; - $this->assertEqual(count($user->Album[1]->Song), 4); - - $user->save(); - - $user = $this->objTable->find(4); - - $this->assertEqual(count($user->Album[0]->Song), 3); - $this->assertEqual(count($user->Album[1]->Song), 4); - - - $user = $this->connection->getTable('User')->find(5); - - $user->Album[0]->name = 'Clayman'; - $user->Album[1]->name = 'Colony'; - $user->Album[1]->Song[0]->title = 'Colony'; - $user->Album[1]->Song[1]->title = 'Ordinary Story'; - - $user->save(); - - $this->assertEqual(count($user->Album[0]->Song), 0); - $this->assertEqual(count($user->Album[1]->Song), 2); - } - public function testMultipleOneToManyFetching() { - $this->connection->clear(); - - $query = new Doctrine_Query(); - - $users = $query->query('FROM User.Album.Song, User.Phonenumber WHERE User.id IN (4,5)'); - - $this->assertEqual($users->count(), 2); - - $this->assertEqual($users[0]->id, 4); - - $this->assertEqual($users[0]->Album[0]->name, 'Damage Done'); - $this->assertEqual($users[0]->Album[0]->Song[0]->title, 'Damage Done'); - $this->assertEqual($users[0]->Album[0]->Song[1]->title, 'The Treason Wall'); - $this->assertEqual($users[0]->Album[0]->Song[2]->title, 'Monochromatic Stains'); - $this->assertEqual($users[0]->Album[1]->name, 'Haven'); - $this->assertEqual($users[0]->Album[1]->Song[0]->title, 'Not Built To Last'); - $this->assertEqual($users[0]->Album[1]->Song[1]->title, 'The Wonders At Your Feet'); - $this->assertEqual($users[0]->Album[1]->Song[2]->title, 'Feast Of Burden'); - $this->assertEqual($users[0]->Album[1]->Song[3]->title, 'Fabric'); - - $this->assertEqual($users[1]->id, 5); - $this->assertEqual($users[1]->Album[0]->name, 'Clayman'); - $this->assertEqual($users[1]->Album[1]->name, 'Colony'); - $this->assertEqual($users[1]->Album[1]->Song[0]->title, 'Colony'); - $this->assertEqual($users[1]->Album[1]->Song[1]->title, 'Ordinary Story'); - - $this->assertEqual($users[0]->Phonenumber[0]->phonenumber, '123 123'); - - $this->assertEqual($users[1]->Phonenumber[0]->phonenumber, '123 123'); - $this->assertEqual($users[1]->Phonenumber[1]->phonenumber, '456 456'); - $this->assertEqual($users[1]->Phonenumber[2]->phonenumber, '789 789'); - } - - public function testInitializeMoreData() { - $user = $this->connection->getTable('User')->find(4); - $user->Book[0]->name = 'The Prince'; - $user->Book[0]->Author[0]->name = 'Niccolo Machiavelli'; - $user->Book[0]->Author[1]->name = 'Someone'; - $user->Book[1]->name = 'The Art of War'; - $user->Book[1]->Author[0]->name = 'Someone'; - $user->Book[1]->Author[1]->name = 'Niccolo Machiavelli'; - - - $user->save(); - - $user = $this->connection->getTable('User')->find(5); - $user->Book[0]->name = 'Zadig'; - $user->Book[0]->Author[0]->name = 'Voltaire'; - $user->Book[0]->Author[1]->name = 'Someone'; - $user->Book[1]->name = 'Candide'; - $user->Book[1]->Author[0]->name = 'Someone'; - $user->Book[1]->Author[1]->name = 'Voltaire'; - $user->save(); - - $this->connection->clear(); - } - public function testMultipleOneToManyFetching2() { - $query = new Doctrine_Query(); - - $users = $query->query("FROM User.Album.Song, User.Book.Author WHERE User.id IN (4,5)"); - - $this->assertEqual($users->count(), 2); - - $this->assertEqual($users[0]->id, 4); - $this->assertEqual($users[0]->Album[0]->name, 'Damage Done'); - $this->assertEqual($users[0]->Album[0]->Song[0]->title, 'Damage Done'); - $this->assertEqual($users[0]->Album[0]->Song[1]->title, 'The Treason Wall'); - $this->assertEqual($users[0]->Album[0]->Song[2]->title, 'Monochromatic Stains'); - $this->assertEqual($users[0]->Album[1]->name, 'Haven'); - $this->assertEqual($users[0]->Album[1]->Song[0]->title, 'Not Built To Last'); - $this->assertEqual($users[0]->Album[1]->Song[1]->title, 'The Wonders At Your Feet'); - $this->assertEqual($users[0]->Album[1]->Song[2]->title, 'Feast Of Burden'); - $this->assertEqual($users[0]->Album[1]->Song[3]->title, 'Fabric'); - - $this->assertEqual($users[0]->Book[0]->Author[0]->name, 'Niccolo Machiavelli'); - $this->assertEqual($users[0]->Book[0]->Author[1]->name, 'Someone'); - $this->assertEqual($users[0]->Book[1]->name, 'The Art of War'); - $this->assertEqual($users[0]->Book[1]->Author[0]->name, 'Someone'); - $this->assertEqual($users[0]->Book[1]->Author[1]->name, 'Niccolo Machiavelli'); - - $this->assertEqual($users[1]->id, 5); - $this->assertEqual($users[1]->Album[0]->name, 'Clayman'); - $this->assertEqual($users[1]->Album[1]->name, 'Colony'); - $this->assertEqual($users[1]->Album[1]->Song[0]->title, 'Colony'); - $this->assertEqual($users[1]->Album[1]->Song[1]->title, 'Ordinary Story'); - - $this->assertEqual($users[1]->Book[0]->name, 'Zadig'); - $this->assertEqual($users[1]->Book[0]->Author[0]->name, 'Voltaire'); - $this->assertEqual($users[1]->Book[0]->Author[1]->name, 'Someone'); - $this->assertEqual($users[1]->Book[1]->name, 'Candide'); - $this->assertEqual($users[1]->Book[1]->Author[0]->name, 'Someone'); - $this->assertEqual($users[1]->Book[1]->Author[1]->name, 'Voltaire'); - } - - public function testMultipleOneToManyFetchingWithOrderBy() { - $query = new Doctrine_Query(); - - $users = $query->query("FROM User.Album.Song WHERE User.id IN (4,5) ORDER BY User.Album.Song.title DESC"); - } -} +. + */ + +/** + * Doctrine_Query_MultiJoin_TestCase + * + * @package Doctrine + * @author Konsta Vesterinen + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + */ +class Doctrine_Query_MultiJoin_TestCase extends Doctrine_UnitTestCase { + public function testInitializeData() { + + $query = new Doctrine_Query($this->connection); + + $user = $this->connection->getTable('User')->find(4); + + + $album = $this->connection->create('Album'); + $album->Song[0]; + + $user->Album[0]->name = 'Damage Done'; + $user->Album[1]->name = 'Haven'; + + $user->Album[0]->Song[0]->title = 'Damage Done'; + $user->Album[0]->Song[1]->title = 'The Treason Wall'; + $user->Album[0]->Song[2]->title = 'Monochromatic Stains'; + + $this->assertEqual(count($user->Album[0]->Song), 3); + + + $user->Album[1]->Song[0]->title = 'Not Built To Last'; + $user->Album[1]->Song[1]->title = 'The Wonders At Your Feet'; + $user->Album[1]->Song[2]->title = 'Feast Of Burden'; + $user->Album[1]->Song[3]->title = 'Fabric'; + $this->assertEqual(count($user->Album[1]->Song), 4); + + $user->save(); + + $user = $this->objTable->find(4); + + $this->assertEqual(count($user->Album[0]->Song), 3); + $this->assertEqual(count($user->Album[1]->Song), 4); + + + $user = $this->connection->getTable('User')->find(5); + + $user->Album[0]->name = 'Clayman'; + $user->Album[1]->name = 'Colony'; + $user->Album[1]->Song[0]->title = 'Colony'; + $user->Album[1]->Song[1]->title = 'Ordinary Story'; + + $user->save(); + + $this->assertEqual(count($user->Album[0]->Song), 0); + $this->assertEqual(count($user->Album[1]->Song), 2); + } + public function testMultipleOneToManyFetching() { + $this->connection->clear(); + + $query = new Doctrine_Query(); + + $users = $query->query('FROM User.Album.Song, User.Phonenumber WHERE User.id IN (4,5)'); + + $this->assertEqual($users->count(), 2); + + $this->assertEqual($users[0]->id, 4); + + $this->assertEqual($users[0]->Album[0]->name, 'Damage Done'); + $this->assertEqual($users[0]->Album[0]->Song[0]->title, 'Damage Done'); + $this->assertEqual($users[0]->Album[0]->Song[1]->title, 'The Treason Wall'); + $this->assertEqual($users[0]->Album[0]->Song[2]->title, 'Monochromatic Stains'); + $this->assertEqual($users[0]->Album[1]->name, 'Haven'); + $this->assertEqual($users[0]->Album[1]->Song[0]->title, 'Not Built To Last'); + $this->assertEqual($users[0]->Album[1]->Song[1]->title, 'The Wonders At Your Feet'); + $this->assertEqual($users[0]->Album[1]->Song[2]->title, 'Feast Of Burden'); + $this->assertEqual($users[0]->Album[1]->Song[3]->title, 'Fabric'); + + $this->assertEqual($users[1]->id, 5); + $this->assertEqual($users[1]->Album[0]->name, 'Clayman'); + $this->assertEqual($users[1]->Album[1]->name, 'Colony'); + $this->assertEqual($users[1]->Album[1]->Song[0]->title, 'Colony'); + $this->assertEqual($users[1]->Album[1]->Song[1]->title, 'Ordinary Story'); + + $this->assertEqual($users[0]->Phonenumber[0]->phonenumber, '123 123'); + + $this->assertEqual($users[1]->Phonenumber[0]->phonenumber, '123 123'); + $this->assertEqual($users[1]->Phonenumber[1]->phonenumber, '456 456'); + $this->assertEqual($users[1]->Phonenumber[2]->phonenumber, '789 789'); + } + + public function testInitializeMoreData() { + $user = $this->connection->getTable('User')->find(4); + $user->Book[0]->name = 'The Prince'; + $user->Book[0]->Author[0]->name = 'Niccolo Machiavelli'; + $user->Book[0]->Author[1]->name = 'Someone'; + $user->Book[1]->name = 'The Art of War'; + $user->Book[1]->Author[0]->name = 'Someone'; + $user->Book[1]->Author[1]->name = 'Niccolo Machiavelli'; + + + $user->save(); + + $user = $this->connection->getTable('User')->find(5); + $user->Book[0]->name = 'Zadig'; + $user->Book[0]->Author[0]->name = 'Voltaire'; + $user->Book[0]->Author[1]->name = 'Someone'; + $user->Book[1]->name = 'Candide'; + $user->Book[1]->Author[0]->name = 'Someone'; + $user->Book[1]->Author[1]->name = 'Voltaire'; + $user->save(); + + $this->connection->clear(); + } + public function testMultipleOneToManyFetching2() { + $query = new Doctrine_Query(); + + $users = $query->query("FROM User.Album.Song, User.Book.Author WHERE User.id IN (4,5)"); + + $this->assertEqual($users->count(), 2); + + $this->assertEqual($users[0]->id, 4); + $this->assertEqual($users[0]->Album[0]->name, 'Damage Done'); + $this->assertEqual($users[0]->Album[0]->Song[0]->title, 'Damage Done'); + $this->assertEqual($users[0]->Album[0]->Song[1]->title, 'The Treason Wall'); + $this->assertEqual($users[0]->Album[0]->Song[2]->title, 'Monochromatic Stains'); + $this->assertEqual($users[0]->Album[1]->name, 'Haven'); + $this->assertEqual($users[0]->Album[1]->Song[0]->title, 'Not Built To Last'); + $this->assertEqual($users[0]->Album[1]->Song[1]->title, 'The Wonders At Your Feet'); + $this->assertEqual($users[0]->Album[1]->Song[2]->title, 'Feast Of Burden'); + $this->assertEqual($users[0]->Album[1]->Song[3]->title, 'Fabric'); + + $this->assertEqual($users[0]->Book[0]->Author[0]->name, 'Niccolo Machiavelli'); + $this->assertEqual($users[0]->Book[0]->Author[1]->name, 'Someone'); + $this->assertEqual($users[0]->Book[1]->name, 'The Art of War'); + $this->assertEqual($users[0]->Book[1]->Author[0]->name, 'Someone'); + $this->assertEqual($users[0]->Book[1]->Author[1]->name, 'Niccolo Machiavelli'); + + $this->assertEqual($users[1]->id, 5); + $this->assertEqual($users[1]->Album[0]->name, 'Clayman'); + $this->assertEqual($users[1]->Album[1]->name, 'Colony'); + $this->assertEqual($users[1]->Album[1]->Song[0]->title, 'Colony'); + $this->assertEqual($users[1]->Album[1]->Song[1]->title, 'Ordinary Story'); + + $this->assertEqual($users[1]->Book[0]->name, 'Zadig'); + $this->assertEqual($users[1]->Book[0]->Author[0]->name, 'Voltaire'); + $this->assertEqual($users[1]->Book[0]->Author[1]->name, 'Someone'); + $this->assertEqual($users[1]->Book[1]->name, 'Candide'); + $this->assertEqual($users[1]->Book[1]->Author[0]->name, 'Someone'); + $this->assertEqual($users[1]->Book[1]->Author[1]->name, 'Voltaire'); + } + + public function testMultipleOneToManyFetchingWithOrderBy() { + $query = new Doctrine_Query(); + + $users = $query->query("FROM User.Album.Song WHERE User.id IN (4,5) ORDER BY User.Album.Song.title DESC"); + } +} diff --git a/tests/classes.php b/tests/classes.php index e2745f4b4..5246b1554 100644 --- a/tests/classes.php +++ b/tests/classes.php @@ -625,4 +625,99 @@ class ValidatorTest_FootballPlayer extends Doctrine_Record { } } +class QueryTest_Category extends Doctrine_Record +{ + /** + * The depth of the category inside the tree. + * Non-persistent field. + * + * @var integer + */ + public $depth; + + /** + * Table definition. + */ + public function setTableDefinition() + { + $this->hasColumn('rootCategoryId as rootCategoryId', 'integer', 4, + array('default' => 0)); + $this->hasColumn('parentCategoryId as parentCategoryId', 'integer', 4, + array('notnull', 'default' => 0)); + $this->hasColumn('name as name', 'string', 50, + array('notnull', 'unique')); + $this->hasColumn('position as position', 'integer', 4, + array('default' => 0, 'notnull')); + } + + /** + * Relations definition. + */ + public function setUp() + { + $this->ownsMany('QueryTest_Category as subCategories','subCategories.parentCategoryId'); + $this->hasOne('QueryTest_Category as rootCategory','QueryTest_Category.rootCategoryId'); + $this->ownsMany('QueryTest_Board as boards', 'QueryTest_Board.categoryId'); + } +} + +class QueryTest_Board extends Doctrine_Record +{ + /** + * Initializes the table definition. + */ + public function setTableDefinition() + { + $this->hasColumn('categoryId as categoryId', 'integer', 4, + array('notnull')); + $this->hasColumn('name as name', 'string', 100, + array('notnull', 'unique')); + $this->hasColumn('lastEntryId as lastEntryId', 'integer', 4, + array('default' => 0, 'notnull')); + $this->hasColumn('position as position', 'integer', 4, + array('default' => 0, 'notnull')); + } + + /** + * Initializes the relations. + */ + public function setUp() + { + $this->hasOne('QueryTest_Category as category', 'QueryTest_Board.categoryId'); + $this->ownsOne('QueryTest_Entry as lastEntry', 'QueryTest_Board.lastEntryId'); + } +} + +class QueryTest_Entry extends Doctrine_Record +{ + /** + * Table structure. + */ + public function setTableDefinition() + { + $this->hasColumn('authorId as authorId', 'integer', 4, + array('notnull')); + $this->hasColumn('date as date', 'integer', 4, + array('notnull')); + } + + /** + * Runtime definition of the relationships to other entities. + */ + public function setUp() + { + $this->hasOne('QueryTest_User as author', 'QueryTest_Entry.authorId'); + } +} + +class QueryTest_User extends Doctrine_Record +{ + + public function setTableDefinition() + { + $this->hasColumn('username as username', 'string', 50, + array('notnull', 'unique')); + } +} + ?> diff --git a/tests/run.php b/tests/run.php index 76d389b17..8729c8a84 100644 --- a/tests/run.php +++ b/tests/run.php @@ -202,6 +202,8 @@ $test->addTestCase(new Doctrine_CustomResultSetOrderTestCase()); $test->addTestCase(new Doctrine_Query_MultiJoin_TestCase()); +$test->addTestCase(new Doctrine_Query_MultiJoin2_TestCase()); + $test->addTestCase(new Doctrine_Query_ReferenceModel_TestCase()); $test->addTestCase(new Doctrine_Query_ComponentAlias_TestCase());