1
0
mirror of synced 2024-12-13 14:56:01 +03:00
doctrine2/tests/QueryTestCase.php

1280 lines
56 KiB
PHP
Raw Normal View History

2006-05-10 01:39:07 +04:00
<?php
class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
public function prepareTables() {
$this->tables[] = "Forum_Category";
$this->tables[] = "Forum_Entry";
$this->tables[] = "Forum_Board";
$this->tables[] = "Forum_Thread";
2006-06-26 22:55:42 +04:00
2006-06-03 13:10:43 +04:00
$this->tables[] = "ORM_TestEntry";
$this->tables[] = "ORM_TestItem";
$this->tables[] = "Log_Status";
$this->tables[] = "Log_Entry";
$this->tables[] = "EnumTest";
$this->tables[] = "Task";
$this->tables[] = "Resource";
$this->tables[] = "ResourceType";
2006-06-03 13:10:43 +04:00
2006-06-25 22:34:53 +04:00
try {
$this->dbh->query("DROP TABLE test_items");
} catch(PDOException $e) {
2006-06-26 22:55:42 +04:00
2006-06-25 22:34:53 +04:00
}
try {
$this->dbh->query("DROP TABLE test_entries");
} catch(PDOException $e) {
2006-06-26 22:55:42 +04:00
}
parent::prepareTables();
$this->connection->clear();
}
2006-09-18 21:32:12 +04:00
public function testBracktExplode() {
$str = "item OR item || item";
$parts = Doctrine_Query::bracketExplode($str, array(' \|\| ', ' OR '), "(", ")");
$this->assertEqual($parts, array('item','item','item'));
}
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);
}
2006-09-15 01:10:02 +04:00
public function testUnknownFunction() {
$q = new Doctrine_Query();
$f = false;
try {
$q->from('User')->where('User.name.someunknownfunc()');
} catch(Doctrine_Query_Exception $e) {
$f = true;
}
$this->assertTrue($f);
}
public function testBadFunctionLogic() {
$q = new Doctrine_Query();
$f = false;
try {
$q->from('User')->where('User.name.contains(?)');
} catch(Doctrine_Query_Exception $e) {
$f = true;
}
$this->assertTrue($f);
}
2006-09-15 01:10:02 +04:00
public function testDqlContainsFunction() {
$q = new Doctrine_Query();
$this->connection->clear();
$q->from('User')->where('User.Phonenumber.phonenumber.contains(?)');
$this->assertEqual(count($q->getTableStack()), 2);
$this->assertEqual(count($q->getRelationStack()), 1);
$coll = $q->execute(array('123 123'));
$this->assertEqual($q->getQuery(), 'SELECT entity.id AS entity__id, entity.name AS entity__name, entity.loginname AS entity__loginname, entity.password AS entity__password, entity.type AS entity__type, entity.created AS entity__created, entity.updated AS entity__updated, entity.email_id AS entity__email_id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber = ?) AND (entity.type = 0)');
2006-09-15 01:10:02 +04:00
$this->assertEqual($coll->count(), 3);
$this->assertEqual($coll[0]->name, 'zYne');
$this->assertEqual($coll[0]->Phonenumber->count(), 1);
$this->assertEqual($coll[1]->Phonenumber->count(), 3);
$this->assertEqual($coll[2]->Phonenumber->count(), 1);
}
public function testDqlFunctionWithMultipleParams() {
$q = new Doctrine_Query();
$this->connection->clear();
$q->from('User')->where('User.Phonenumber.phonenumber.like(?,?)');
$this->assertEqual(count($q->getTableStack()), 2);
$this->assertEqual(count($q->getRelationStack()), 1);
2006-09-15 01:10:02 +04:00
$coll = $q->execute(array('%123%', '%5%'));
2006-09-15 01:10:02 +04:00
$this->assertEqual($q->getQuery(), 'SELECT entity.id AS entity__id, entity.name AS entity__name, entity.loginname AS entity__loginname, entity.password AS entity__password, entity.type AS entity__type, entity.created AS entity__created, entity.updated AS entity__updated, entity.email_id AS entity__email_id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber LIKE ?) AND entity.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber LIKE ?) AND (entity.type = 0)');
$this->assertEqual($coll->count(), 3);
$this->assertEqual($coll[0]->name, 'Arnold Schwarzenegger');
$this->assertEqual($coll[0]->Phonenumber->count(), 3);
$this->assertEqual($coll[1]->Phonenumber->count(), 3);
$this->assertEqual($coll[2]->Phonenumber->count(), 3);
2006-09-15 01:10:02 +04:00
}
public function testDqlLikeFunction() {
$q = new Doctrine_Query();
$this->connection->clear();
$q->from('User')->where('User.Phonenumber.phonenumber.like(?)');
$this->assertEqual(count($q->getTableStack()), 2);
$this->assertEqual(count($q->getRelationStack()), 1);
$coll = $q->execute(array('123%'));
$this->assertEqual($q->getQuery(), 'SELECT entity.id AS entity__id, entity.name AS entity__name, entity.loginname AS entity__loginname, entity.password AS entity__password, entity.type AS entity__type, entity.created AS entity__created, entity.updated AS entity__updated, entity.email_id AS entity__email_id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber LIKE ?) AND (entity.type = 0)');
$this->assertEqual($coll->count(), 5);
$this->assertEqual($coll[0]->name, 'zYne');
$this->assertEqual($coll[0]->Phonenumber->count(), 1);
$this->assertEqual($coll[1]->Phonenumber->count(), 3);
$this->assertEqual($coll[2]->Phonenumber->count(), 1);
$this->assertEqual($coll[3]->Phonenumber->count(), 3);
$this->assertEqual($coll[4]->Phonenumber->count(), 3);
}
public function testEnumConversion() {
$e[0] = new EnumTest();
$e[0]->status = 'open';
$e[1] = new EnumTest();
$e[1]->status = 'verified';
2006-06-26 22:55:42 +04:00
$this->connection->flush();
$this->assertEqual($e[0]->id, 1);
$this->assertEqual($e[1]->id, 2);
$q = new Doctrine_Query;
$coll = $q->from('EnumTest')
->where("EnumTest.status = 'open'")
->execute();
$this->assertEqual($q->getQuery(), 'SELECT enum_test.id AS enum_test__id, enum_test.status AS enum_test__status FROM enum_test WHERE enum_test.status = 0');
$this->assertEqual($coll->count(), 1);
$q = new Doctrine_Query;
$coll = $q->from('EnumTest')
->where("EnumTest.status = 'verified'")
->execute();
$this->assertEqual($q->getQuery(), 'SELECT enum_test.id AS enum_test__id, enum_test.status AS enum_test__status FROM enum_test WHERE enum_test.status = 1');
$this->assertEqual($coll->count(), 1);
2006-06-26 22:55:42 +04:00
}
2006-09-13 01:36:36 +04:00
public function testManyToManyFetchingWithColumnAggregationInheritance() {
$query = new Doctrine_Query($this->connection);
$query->from('User-l:Group-l');
$users = $query->execute();
$this->assertEqual($users->count(), 1);
$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);
$this->assertEqual($users[1]->Group->count(), 1);
$this->assertEqual($users[2]->Group->count(), 0);
$this->assertEqual($users[0]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($users[1]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($users[2]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($users[0]->getModified(), array());
$this->assertEqual($users[1]->getModified(), array());
$this->assertEqual($users[2]->getModified(), array());
$this->assertEqual($users[6]->getModified(), array());
$this->assertEqual($users[0]->type, 0);
$this->assertEqual($users[1]->type, 0);
$this->assertEqual($users[2]->type, 0);
$this->connection->flush();
$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))");
$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 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);
$query = new Doctrine_Query();
$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());
}
public function testSelectingAggregateValues() {
2006-08-26 03:50:55 +04:00
$q = new Doctrine_Query();
$q->from("User(COUNT(1), MAX(name))");
$array = $q->execute();
$this->assertTrue(is_array($array));
$this->assertEqual($array, array(array('COUNT(1)' => '8', 'MAX(entity.name)' => 'zYne')));
$this->assertEqual($q->getQuery(), "SELECT COUNT(1), MAX(entity.name) FROM entity WHERE (entity.type = 0)");
$q = new Doctrine_Query();
$q->from("Phonenumber(COUNT(1))");
2006-08-26 03:50:55 +04:00
$array = $q->execute();
$this->assertTrue(is_array($array));
$this->assertEqual($array, array(array('COUNT(1)' => '15')));
$this->assertEqual($q->getQuery(), "SELECT COUNT(1) FROM phonenumber");
$q = new Doctrine_Query();
$q->from("User.Phonenumber(COUNT(id))");
$array = $q->execute();
$this->assertTrue(is_array($array));
$this->assertEqual($array[0]['COUNT(phonenumber.id)'], 14);
$this->assertEqual($q->getQuery(), "SELECT entity.id AS entity__id, entity.name AS entity__name, entity.loginname AS entity__loginname, entity.password AS entity__password, entity.type AS entity__type, entity.created AS entity__created, entity.updated AS entity__updated, entity.email_id AS entity__email_id, COUNT(phonenumber.id) FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (entity.type = 0)");
$q = new Doctrine_Query();
$q->from("User(MAX(id)).Email(MIN(address))");
$array = $q->execute();
$this->assertTrue(is_array($array));
2006-08-26 03:50:55 +04:00
$this->assertEqual($array[0]['MAX(entity.id)'], 11);
$this->assertEqual($array[0]['MIN(email.address)'], 'arnold@example.com');
2006-06-30 03:04:39 +04:00
2006-08-26 03:50:55 +04:00
$q = new Doctrine_Query();
$q->from("User(MAX(id)).Email(MIN(address)), User.Phonenumber(COUNT(1))");
$array = $q->execute();
$this->assertTrue(is_array($array));
2006-06-30 03:04:39 +04:00
2006-08-26 03:50:55 +04:00
$this->assertEqual($array[0]['MAX(entity.id)'], 11);
$this->assertEqual($array[0]['MIN(email.address)'], 'arnold@example.com');
$this->assertEqual($array[0]['COUNT(1)'], 14);
2006-09-13 01:36:36 +04:00
//$q = new Doctrine_Query();
//$q->from("User.Phonenumber(COUNT(id))")->groupby("User.id");
//$coll = $q->execute();
//print Doctrine_Lib::formatSql($q->getQuery());
//print_r($coll);
//$this->assertEqual(count($coll), 8);
2006-06-30 03:04:39 +04:00
}
2006-08-16 03:25:53 +04:00
2006-08-26 03:50:55 +04:00
public function testMultipleFetching() {
$count = $this->dbh->count();
2006-08-22 03:20:33 +04:00
$this->connection->getTable('User')->clear();
$this->connection->getTable('Email')->clear();
$this->connection->getTable('Phonenumber')->clear();
$users = $this->query->from("User-l.Phonenumber-i, User-l:Email-i")->execute();
$this->assertEqual(($count + 1),$this->dbh->count());
$this->assertEqual(count($users), 8);
$this->assertEqual($users[0]->Phonenumber->count(), 1);
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[0]->Phonenumber[0]->phonenumber, "123 123");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[1]->Phonenumber->count(), 3);
$this->assertEqual(($count + 1), $this->dbh->count());
$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");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[7]->Phonenumber->count(), 1);
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[7]->Phonenumber[0]->phonenumber, "111 567 333");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertTrue($users[0]->Email instanceof Email);
$this->assertEqual($users[0]->Email->address, "zYne@example.com");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[0]->email_id, $users[0]->Email->id);
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertTrue($users[1]->Email instanceof Email);
$this->assertEqual($users[1]->Email->address, "arnold@example.com");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[1]->email_id, $users[1]->Email->id);
$this->assertEqual(($count + 1), $this->dbh->count());
}
public function testGetPath() {
$this->query->from("User.Group.Email");
$this->assertEqual($this->query->getTableAlias("User"), "entity");
$this->assertEqual($this->query->getTableAlias("User.Group"), "entity2");
$this->query->from("Task.Subtask.Subtask");
$this->assertEqual($this->query->getTableAlias("Task"), "task");
$this->assertEqual($this->query->getTableAlias("Task.Subtask"), "task2");
$this->assertEqual($this->query->getTableAlias("Task.Subtask.Subtask"), "task3");
2006-06-26 22:55:42 +04:00
$this->assertEqual($this->query->getQuery(),
"SELECT task.id AS task__id, task.name AS task__name, task.parent_id AS task__parent_id, task2.id AS task2__id, task2.name AS task2__name, task2.parent_id AS task2__parent_id, task3.id AS task3__id, task3.name AS task3__name, task3.parent_id AS task3__parent_id FROM task LEFT JOIN task AS task2 ON task.id = task2.parent_id LEFT JOIN task AS task3 ON task2.id = task3.parent_id");
}
2006-06-22 00:02:40 +04:00
public function testMultiComponentFetching2() {
2006-08-22 03:20:33 +04:00
$this->connection->clear();
2006-06-22 00:02:40 +04:00
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-06-22 00:02:40 +04:00
$query->from("User.Email, User.Phonenumber");
2006-06-22 00:02:40 +04:00
$users = $query->execute();
$count = count($this->dbh);
$this->assertEqual($users->count(), 8);
$this->assertTrue($users[0]->Email instanceof Email);
$this->assertEqual($users[0]->Phonenumber->count(), 1);
$this->assertEqual($count, count($this->dbh));
}
public function testHaving() {
2006-08-22 03:20:33 +04:00
$this->connection->clear();
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
$query->from('User-l.Phonenumber-l');
$query->having("COUNT(User.Phonenumber.phonenumber) > 2");
$query->groupby('User.id');
$users = $query->execute();
$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);
// test expanding
$count = $this->dbh->count();
$this->assertEqual($users[0]->Phonenumber->count(), 1);
$this->assertEqual($users[1]->Phonenumber->count(), 1);
$this->assertEqual($users[2]->Phonenumber->count(), 1);
$users[0]->Phonenumber[1];
$this->assertEqual(++$count, $this->dbh->count());
$this->assertEqual($users[0]->Phonenumber->count(), 3);
$users[1]->Phonenumber[1];
$this->assertEqual(++$count, $this->dbh->count());
$this->assertEqual($users[1]->Phonenumber->count(), 3);
$users[2]->Phonenumber[1];
$this->assertEqual(++$count, $this->dbh->count());
$this->assertEqual($users[2]->Phonenumber->count(), 3);
2006-06-30 03:04:39 +04:00
2006-08-22 03:20:33 +04:00
$this->connection->clear();
2006-06-30 03:04:39 +04:00
$query->from('User-l.Phonenumber-l');
$query->having("COUNT(User.Phonenumber.phonenumber) > 2");
$query->groupby('User.id');
2006-08-22 03:20:33 +04:00
$users = $this->connection->query("FROM User-l.Phonenumber-l GROUP BY User.id HAVING COUNT(User.Phonenumber.phonenumber) > 2");
2006-06-30 03:04:39 +04:00
$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);
}
2006-06-09 02:11:36 +04:00
public function testNestedManyToManyRelations() {
$task = new Task();
$task->name = "T1";
$task->ResourceAlias[0]->name = "R1";
$task->ResourceAlias[1]->name = "R2";
2006-06-09 02:11:36 +04:00
$task->ResourceAlias[0]->Type[0]->type = 'TY1';
//$task->ResourceAlias[1]->Type[0]->type = 'TY2';
$task = new Task();
$task->name = "T2";
$task->ResourceAlias[0]->name = "R3";
2006-06-09 02:11:36 +04:00
$task->ResourceAlias[0]->Type[0]->type = 'TY2';
$task->ResourceAlias[0]->Type[1]->type = 'TY3';
$task->ResourceAlias[1]->name = "R4";
$task->ResourceAlias[2]->name = "R5";
2006-06-09 02:11:36 +04:00
$task->ResourceAlias[2]->Type[0]->type = 'TY4';
$task->ResourceAlias[2]->Type[1]->type = 'TY5';
$task->ResourceAlias[3]->name = "R6";
$this->assertEqual($task->ResourceAlias[0]->name, "R3");
$this->assertEqual($task->ResourceAlias[1]->name, "R4");
$this->assertEqual($task->ResourceAlias[2]->name, "R5");
$this->assertEqual($task->ResourceAlias[3]->name, "R6");
$task = new Task();
$task->name = "T3";
$task->ResourceAlias[0]->name = "R7";
2006-06-09 02:11:36 +04:00
$task = new Task();
$task->name = "T4";
2006-08-22 03:20:33 +04:00
$this->connection->flush();
2006-06-09 02:11:36 +04:00
2006-08-22 03:20:33 +04:00
$this->connection->clear();
2006-06-09 02:11:36 +04:00
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-06-09 02:11:36 +04:00
$query->from("Task.ResourceAlias.Type");
$tasks = $query->execute();
$this->assertEqual($tasks->count(), 4);
$this->assertEqual($tasks[0]->ResourceAlias->count(), 2);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
$this->assertEqual($tasks[2]->ResourceAlias->count(), 1);
$this->assertEqual($tasks[3]->ResourceAlias->count(), 0);
$this->assertEqual($tasks[0]->ResourceAlias[0]->Type->count(), 1);
$this->assertEqual($tasks[0]->ResourceAlias[1]->Type->count(), 0);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
2006-08-22 03:20:33 +04:00
$this->connection->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');
2006-06-09 02:11:36 +04:00
}
public function testManyToManyFetchingWithColonOperator() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-06-09 02:11:36 +04:00
$task = new Task();
// clear identity maps
2006-08-22 03:20:33 +04:00
$this->connection->getTable('Task')->clear();
$this->connection->getTable('Assignment')->clear();
$this->connection->getTable('Resource')->clear();
$tasks[1] = $task->getTable()->find(2);
$this->assertEqual($tasks[1]->ResourceAlias[0]->name, "R3");
$this->assertEqual($tasks[1]->ResourceAlias[1]->name, "R4");
$this->assertEqual($tasks[1]->ResourceAlias[2]->name, "R5");
$this->assertEqual($tasks[1]->ResourceAlias[3]->name, "R6");
// clear identity maps
$task->getTable()->clear();
2006-08-22 03:20:33 +04:00
$this->connection->getTable('Assignment')->clear();
$this->connection->getTable('Resource')->clear();
$query->from("Task-l:ResourceAlias-l");
$tasks = $query->execute();
$this->assertEqual($tasks->count(), 3);
$this->assertTrue($tasks instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[0]->ResourceAlias->count(), 2);
$this->assertTrue($tasks[0]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
$this->assertTrue($tasks[1]->ResourceAlias instanceof Doctrine_Collection_Lazy);
// sanity checking
$this->assertEqual($tasks[1]->ResourceAlias[0]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($tasks[1]->ResourceAlias[1]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($tasks[1]->ResourceAlias[2]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($tasks[1]->ResourceAlias[3]->getState(), Doctrine_Record::STATE_PROXY);
$count = count($this->dbh);
$this->assertEqual($tasks[1]->ResourceAlias[0]->name, "R3");
$this->assertEqual($tasks[1]->ResourceAlias[1]->name, "R4");
$this->assertEqual($tasks[1]->ResourceAlias[2]->name, "R5");
$this->assertEqual($tasks[1]->ResourceAlias[3]->name, "R6");
$this->assertEqual(count($this->dbh), ($count + 4));
$this->assertEqual($tasks[2]->ResourceAlias->count(), 1);
$this->assertTrue($tasks[2]->ResourceAlias instanceof Doctrine_Collection_Lazy);
}
public function testManyToManyFetchingWithDotOperator() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-08-22 03:20:33 +04:00
$this->connection->getTable('Task')->clear();
$this->connection->getTable('Assignment')->clear();
$this->connection->getTable('Resource')->clear();
$tasks = $query->query("FROM Task-l.ResourceAlias-l");
$this->assertEqual($tasks->count(), 4);
$this->assertTrue($tasks instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[0]->ResourceAlias->count(), 2);
$this->assertTrue($tasks[0]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
$this->assertTrue($tasks[1]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
$this->assertTrue($tasks[1]->ResourceAlias instanceof Doctrine_Collection_Lazy);
// sanity checking
$this->assertEqual($tasks[1]->ResourceAlias[0]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($tasks[1]->ResourceAlias[1]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($tasks[1]->ResourceAlias[2]->getState(), Doctrine_Record::STATE_PROXY);
$this->assertEqual($tasks[1]->ResourceAlias[3]->getState(), Doctrine_Record::STATE_PROXY);
$count = count($this->dbh);
$this->assertEqual($tasks[1]->ResourceAlias[0]->name, "R3");
$this->assertEqual($tasks[1]->ResourceAlias[1]->name, "R4");
$this->assertEqual($tasks[1]->ResourceAlias[2]->name, "R5");
$this->assertEqual($tasks[1]->ResourceAlias[3]->name, "R6");
$this->assertEqual(count($this->dbh), ($count + 4));
$this->assertEqual($tasks[2]->ResourceAlias->count(), 1);
$this->assertTrue($tasks[2]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[3]->ResourceAlias->count(), 0);
$this->assertTrue($tasks[3]->ResourceAlias instanceof Doctrine_Collection);
}
2006-06-09 02:11:36 +04:00
public function testManyToManyFetchingWithDotOperatorAndLoadedIdentityMaps() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
$tasks = $query->query("FROM Task-l.ResourceAlias-l");
$this->assertEqual($tasks->count(), 4);
$this->assertTrue($tasks instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[0]->ResourceAlias->count(), 2);
$this->assertTrue($tasks[0]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
$this->assertTrue($tasks[1]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[1]->ResourceAlias->count(), 4);
$this->assertTrue($tasks[1]->ResourceAlias instanceof Doctrine_Collection_Lazy);
// sanity checking
$this->assertEqual($tasks[1]->ResourceAlias[0]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($tasks[1]->ResourceAlias[1]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($tasks[1]->ResourceAlias[2]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($tasks[1]->ResourceAlias[3]->getState(), Doctrine_Record::STATE_CLEAN);
$count = count($this->dbh);
$this->assertEqual($tasks[1]->ResourceAlias[0]->name, "R3");
$this->assertEqual($tasks[1]->ResourceAlias[1]->name, "R4");
$this->assertEqual($tasks[1]->ResourceAlias[2]->name, "R5");
$this->assertEqual($tasks[1]->ResourceAlias[3]->name, "R6");
$this->assertEqual(count($this->dbh), $count);
$this->assertEqual($tasks[2]->ResourceAlias->count(), 1);
$this->assertTrue($tasks[2]->ResourceAlias instanceof Doctrine_Collection_Lazy);
$this->assertEqual($tasks[3]->ResourceAlias->count(), 0);
$this->assertTrue($tasks[3]->ResourceAlias instanceof Doctrine_Collection);
}
2006-06-09 02:11:36 +04:00
2006-06-05 13:57:53 +04:00
public function testOneToOneSharedRelations() {
2006-06-03 13:10:43 +04:00
$status = new Log_Status();
$status->name = 'success';
$entries[0] = new Log_Entry();
$entries[0]->stamp = '2006-06-06';
$entries[0]->Log_Status = $status;
$this->assertTrue($entries[0]->Log_Status instanceof Log_Status);
$entries[1] = new Log_Entry();
$entries[1]->stamp = '2006-06-06';
$entries[1]->Log_Status = $status;
2006-08-22 03:20:33 +04:00
$this->connection->flush();
2006-06-03 13:10:43 +04:00
// clear the identity maps
$entries[0]->Log_Status->getTable()->clear();
$entries[0]->getTable()->clear();
2006-08-22 03:20:33 +04:00
$entries = $this->connection->query("FROM Log_Entry-I.Log_Status-i");
2006-06-03 13:10:43 +04:00
$this->assertEqual($entries->count(), 2);
$this->assertTrue($entries[0]->Log_Status instanceof Log_Status);
$this->assertEqual($entries[0]->Log_Status->name, 'success');
// the second Log_Status is fetched from identityMap
2006-06-05 13:57:53 +04:00
2006-06-03 13:10:43 +04:00
$this->assertTrue($entries[1]->Log_Status instanceof Log_Status);
$this->assertEqual($entries[1]->Log_Status->name, 'success');
// the following line is possible since doctrine uses identityMap
$this->assertEqual($entries[0]->Log_Status, $entries[1]->Log_Status);
$entries[0]->Log_Status->delete();
$this->assertEqual($entries[0]->Log_Status, $entries[1]->Log_Status);
$this->assertEqual($entries[0]->Log_Status->getState(), Doctrine_Record::STATE_TCLEAN);
2006-06-03 13:10:43 +04:00
// clear the identity maps
$entries[0]->Log_Status->getTable()->clear();
$entries[0]->getTable()->clear();
2006-08-22 03:20:33 +04:00
$entries = $this->connection->query("FROM Log_Entry-I.Log_Status-i");
2006-06-03 13:10:43 +04:00
$this->assertEqual($entries->count(), 2);
$this->assertTrue($entries[0]->Log_Status instanceof Log_Status);
2006-06-03 13:10:43 +04:00
$this->assertEqual($entries[0]->Log_Status->name, null);
$this->assertEqual($entries[1]->Log_Status->name, null);
2006-06-03 13:10:43 +04:00
}
2006-06-03 13:10:43 +04:00
public function testOneToOneRelationFetchingWithCustomTableNames() {
$entry = new ORM_TestEntry();
$entry->name = 'entry 1';
$entry->amount = '123.123';
$entry->ORM_TestItem->name = 'item 1';
$entry = new ORM_TestEntry();
$entry->name = 'entry 2';
$entry->amount = '123.123';
$entry->ORM_TestItem->name = 'item 2';
2006-08-22 03:20:33 +04:00
$this->connection->flush();
2006-06-03 13:10:43 +04:00
$count = $this->dbh->count();
2006-08-22 03:20:33 +04:00
$entries = $this->connection->query("FROM ORM_TestEntry-i.ORM_TestItem-i");
2006-06-03 13:10:43 +04:00
$this->assertEqual($entries->count(), 2);
$this->assertTrue($entries[0] instanceof ORM_TestEntry);
$this->assertTrue($entries[0]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($entries[0]->name, 'entry 1');
$this->assertTrue($entries[1] instanceof ORM_TestEntry);
$this->assertTrue($entries[1]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($entries[1]->name, 'entry 2');
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertTrue($entries[0]->ORM_TestItem instanceof ORM_TestItem);
$this->assertEqual($entries[0]->ORM_TestItem->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($entries[0]->ORM_TestItem->name, 'item 1');
$this->assertTrue($entries[1]->ORM_TestItem instanceof ORM_TestItem);
$this->assertEqual($entries[1]->ORM_TestItem->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($entries[1]->ORM_TestItem->name, 'item 2');
$this->assertEqual(($count + 1), $this->dbh->count());
}
2006-05-31 12:46:44 +04:00
public function testImmediateFetching() {
$count = $this->dbh->count();
2006-08-22 03:20:33 +04:00
$this->connection->getTable('User')->clear();
$this->connection->getTable('Email')->clear();
$this->connection->getTable('Phonenumber')->clear();
2006-05-31 12:46:44 +04:00
$users = $this->query->from("User-i.Email-i")->execute();
$this->assertEqual(($count + 1),$this->dbh->count());
$this->assertEqual(count($users), 8);
$this->assertEqual(get_class($users[0]->Email), 'Email');
$this->assertEqual(($count + 1),$this->dbh->count());
$this->assertEqual($users[0]->Email->address, 'zYne@example.com');
$this->assertEqual(($count + 1),$this->dbh->count());
2006-06-01 15:58:05 +04:00
$this->assertEqual(get_class($users[1]->Email), 'Email');
$this->assertEqual(($count + 1),$this->dbh->count());
$this->assertEqual($users[1]->Email->address, 'arnold@example.com');
$this->assertEqual(($count + 1),$this->dbh->count());
2006-05-31 12:46:44 +04:00
}
public function testLazyPropertyFetchingWithMultipleColumns() {
2006-08-22 03:20:33 +04:00
$q = new Doctrine_Query($this->connection);
$q->from("User-l(name, email_id)");
$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, count($this->dbh));
$users[0]->getTable()->clear();
$q->from("User-b(name, email_id)");
$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, count($this->dbh));
$this->assertTrue(is_numeric($users[1]->email_id));
$this->assertEqual($count, count($this->dbh));
$this->assertTrue(is_numeric($users[2]->email_id));
$this->assertEqual($count, count($this->dbh));
$q->from("User-b(name, email_id):Email, User-b(name, email_id).Phonenumber");
$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, count($this->dbh));
$this->assertTrue(is_numeric($users[1]->email_id));
$this->assertEqual($count, count($this->dbh));
$this->assertTrue(is_numeric($users[2]->email_id));
$this->assertEqual($count, count($this->dbh));
}
2006-05-31 02:35:00 +04:00
public function testForeignKeyRelationFetching() {
$count = $this->dbh->count();
$users = $this->query->from("User-l.Phonenumber-i")->execute();
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual(count($users), 8);
$this->assertEqual($users[0]->Phonenumber->count(), 1);
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[0]->Phonenumber[0]->phonenumber, "123 123");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[1]->Phonenumber->count(), 3);
$this->assertEqual(($count + 1), $this->dbh->count());
$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");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[7]->Phonenumber->count(), 1);
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[7]->Phonenumber[0]->phonenumber, "111 567 333");
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertEqual($users[0]->name, "zYne");
$this->assertEqual(($count + 2), $this->dbh->count());
}
public function testOneToOneRelationFetching() {
$count = $this->dbh->count();
$users = $this->query->from("User-l:Email-i")->execute();
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertTrue($users instanceof Doctrine_Collection_Lazy);
$count = $this->dbh->count();
foreach($users as $user) {
// iterate through users and test that no additional queries are needed
$user->Email->address;
$this->assertEqual($count, $this->dbh->count());
}
$users[0]->Account->amount = 3000;
$this->assertEqual($users[0]->Account->amount, 3000);
$this->assertTrue($users[0]->Account instanceof Account);
$this->assertEqual($users[0]->id, $users[0]->Account->entity_id);
$users[0]->Account->save();
$users[0]->refresh();
$this->assertEqual($users[0]->Account->amount, 3000);
$this->assertTrue($users[0]->Account instanceof Account);
$this->assertEqual($users[0]->id, $users[0]->Account->entity_id);
$this->assertEqual($users[0]->Account->getState(), Doctrine_Record::STATE_CLEAN);
$users[0]->getTable()->clear();
$users[0]->Account->getTable()->clear();
$count = $this->dbh->count();
$users = $this->query->from("User-l:Account-i")->execute();
$this->assertEqual(($count + 1), $this->dbh->count());
$this->assertTrue($users instanceof Doctrine_Collection_Lazy);
$this->assertEqual($users->count(), 1);
$this->assertEqual($users[0]->Account->amount,3000);
}
2006-05-27 00:15:27 +04:00
public function testValidLazyPropertyFetching() {
2006-08-22 03:20:33 +04:00
$q = new Doctrine_Query($this->connection);
2006-05-27 00:15:27 +04:00
$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() {
2006-08-22 03:20:33 +04:00
$q = new Doctrine_Query($this->connection);
2006-05-19 14:22:15 +04:00
$board = new Forum_Board();
$table = $board->getTable();
$fk = $table->getRelation("Threads");
2006-05-19 14:22:15 +04:00
$this->assertEqual($table->getComponentName(), "Forum_Board");
$this->assertTrue($fk instanceof Doctrine_ForeignKey);
$this->assertEqual($fk->getTable()->getComponentName(), "Forum_Thread");
$entry = new Forum_Entry();
$this->assertTrue($entry->getTable()->getRelation("Thread") instanceof Doctrine_LocalKey);
$board->name = "Doctrine Forum";
$board->Threads[0];
$board->Category->name = "General discussion";
$this->assertEqual($board->name, "Doctrine Forum");
$this->assertEqual($board->Category->name, "General discussion");
$this->assertEqual($board->Category->getState(), Doctrine_Record::STATE_TDIRTY);
2006-05-19 14:22:15 +04:00
$this->assertEqual($board->Threads[0]->getState(), Doctrine_Record::STATE_TDIRTY);
$this->assertTrue($board->Threads[0] instanceof Forum_Thread);
2006-05-19 14:22:15 +04:00
$thread = $board->Threads[0];
$thread->Entries[0]->topic = "My first topic";
$thread->Entries[1]->topic = "My second topic";
2006-05-19 14:22:15 +04:00
$this->assertEqual($thread->Entries[0]->topic, "My first topic");
$this->assertEqual($thread->Entries[0]->getState(), Doctrine_Record::STATE_TDIRTY);
$this->assertTrue($thread->Entries[0] instanceof Forum_Entry);
2006-08-22 03:20:33 +04:00
$this->connection->flush();
2006-05-25 16:25:26 +04:00
$board->getTable()->clear();
$board = $board->getTable()->find($board->id);
$this->assertEqual($board->Threads->count(), 1);
$this->assertEqual($board->name, "Doctrine Forum");
$this->assertEqual($board->Category->name, "General discussion");
2006-05-19 14:22:15 +04:00
$this->assertEqual($board->Category->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertEqual($board->Threads[0]->getState(), Doctrine_Record::STATE_CLEAN);
$this->assertTrue($board->Threads[0] instanceof Forum_Thread);
$this->assertEqual($board->Threads[0]->Entries->count(), 2);
2006-05-19 14:22:15 +04:00
2006-05-19 14:22:15 +04:00
$q->from("Forum_Board");
$coll = $q->execute();
$this->assertEqual($coll->count(), 1);
2006-08-22 03:20:33 +04:00
$table = $this->connection->getTable("Forum_Board")->setAttribute(Doctrine::ATTR_FETCHMODE, Doctrine::FETCH_LAZY);
$table = $this->connection->getTable("Forum_Thread")->setAttribute(Doctrine::ATTR_FETCHMODE, Doctrine::FETCH_LAZY);
2006-05-25 16:25:26 +04:00
$q->from("Forum_Board.Threads");
2006-08-22 23:34:40 +04:00
$this->assertEqual($q->getQuery(), "SELECT forum__board.id AS forum__board__id, forum__thread.id AS forum__thread__id FROM forum__board LEFT JOIN forum__thread ON forum__board.id = forum__thread.board_id");
2006-05-19 14:22:15 +04:00
$coll = $q->execute();
$this->assertEqual($coll->count(), 1);
2006-05-25 16:25:26 +04:00
$q->from("Forum_Board-l.Threads-l");
2006-08-22 23:34:40 +04:00
$this->assertEqual($q->getQuery(), "SELECT forum__board.id AS forum__board__id, forum__thread.id AS forum__thread__id FROM forum__board LEFT JOIN forum__thread ON forum__board.id = forum__thread.board_id");
2006-08-22 03:20:33 +04:00
//$this->connection->clear();
$q->from("Forum_Board-l.Threads-l.Entries-l");
2006-08-22 23:34:40 +04:00
$this->assertEqual($q->getQuery(), "SELECT forum__board.id AS forum__board__id, forum__thread.id AS forum__thread__id, forum__entry.id AS forum__entry__id FROM forum__board LEFT JOIN forum__thread ON forum__board.id = forum__thread.board_id LEFT JOIN forum__entry ON forum__thread.id = forum__entry.thread_id");
$boards = $q->execute();
$this->assertEqual($boards->count(), 1);
$count = count($this->dbh);
$this->assertEqual($boards[0]->Threads->count(), 1);
$this->assertEqual(count($this->dbh), $count);
$this->assertEqual($boards[0]->Threads[0]->Entries->count(), 2);
2006-05-25 16:32:57 +04:00
$q->from("Forum_Board-l.Threads-l.Entries-i");
$this->assertEqual($boards->count(), 1);
$count = count($this->dbh);
$this->assertEqual($boards[0]->Threads->count(), 1);
$this->assertEqual(count($this->dbh), $count);
$this->assertEqual($boards[0]->Threads[0]->Entries->count(), 2);
}
2006-05-17 21:58:40 +04:00
public function testQueryWithAliases() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-05-25 16:25:26 +04:00
2006-05-17 21:58:40 +04:00
$task = new Task();
$task->name = "Task 1";
$task->ResourceAlias[0]->name = "Resource 1";
$task->ResourceAlias[1]->name = "Resource 2";
$task->save();
2006-05-25 16:25:26 +04:00
2006-05-17 21:58:40 +04:00
$coll = $query->query("FROM Task WHERE Task.ResourceAlias.name = 'Resource 1'");
$this->assertEqual($coll->count(), 1);
$this->assertTrue($coll[0] instanceof Task);
}
2006-05-10 01:39:07 +04:00
public function testQueryArgs() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-05-10 01:39:07 +04:00
$query = $query->from("User-l");
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("from"), array("entity" => true));
$query = $query->orderby("User.name");
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("orderby"), array("entity.name"));
$query = $query->orderby("User.created");
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("orderby"), array("entity.created"));
$query = $query->where("User.name LIKE 'zYne%'");
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("where"), array("entity.name LIKE 'zYne%'"));
$query = $query->where("User.name LIKE 'Arnold%'");
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("where"), array("entity.name LIKE 'Arnold%'"));
$query = $query->limit(5);
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("limit"), 5);
$query = $query->offset(5);
$this->assertTrue($query instanceof Doctrine_Query);
$this->assertEqual($query->get("offset"), 5);
$query->offset = 7;
$this->assertEqual($query->get("offset"), 7);
$query->limit = 10;
$this->assertEqual($query->limit, 10);
$this->assertTrue(strpos($query->getQuery(),"LIMIT"));
2006-08-16 13:21:47 +04:00
$query->remove('limit')->remove('offset');
2006-05-10 01:39:07 +04:00
$this->assertFalse(strpos($query->getQuery(),"LIMIT"));
$coll = $query->execute();
$this->assertTrue($coll instanceof Doctrine_Collection_Lazy);
$this->assertEqual($coll->count(), 1);
$query->where("User.name LIKE ?")->limit(3);
$this->assertEqual($query->limit, 3);
$this->assertTrue(strpos($query->getQuery(),"LIMIT"));
}
public function testLimit() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-08-16 03:25:53 +04:00
$coll = $query->query("FROM User(id) LIMIT 3");
2006-05-10 01:39:07 +04:00
$this->assertEqual($query->limit, 3);
$this->assertEqual($coll->count(), 3);
}
public function testOffset() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-05-10 01:39:07 +04:00
$coll = $query->query("FROM User LIMIT 3 OFFSET 3");
$this->assertEqual($query->offset, 3);
$this->assertEqual($coll->count(), 3);
}
public function testPreparedQuery() {
2006-08-22 03:20:33 +04:00
$coll = $this->connection->query("FROM User WHERE User.name = :name", array(":name" => "zYne"));
2006-05-10 01:39:07 +04:00
$this->assertEqual($coll->count(), 1);
}
public function testOrderBy() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
$query->from("User-b")->orderby("User.name ASC, User.Email.address");
$users = $query->execute();
2006-05-25 16:25:26 +04:00
2006-05-10 01:39:07 +04:00
$this->assertEqual(trim($query->getQuery()),
"SELECT entity.id AS entity__id FROM entity LEFT JOIN email ON entity.email_id = email.id WHERE (entity.type = 0) ORDER BY entity.name ASC, email.address");
2006-05-10 01:39:07 +04:00
$this->assertEqual($users->count(),8);
$this->assertTrue($users[0]->name == "Arnold Schwarzenegger");
}
public function testBatchFetching() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
$users = $query->query("FROM User-b");
$this->assertEqual(trim($query->getQuery()),
"SELECT entity.id AS entity__id FROM entity WHERE (entity.type = 0)");
$this->assertEqual($users[0]->name, "zYne");
$this->assertTrue($users instanceof Doctrine_Collection_Batch);
}
public function testLazyFetching() {
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
$users = $query->query("FROM User-l");
$this->assertEqual(trim($query->getQuery()),
"SELECT entity.id AS entity__id FROM entity WHERE (entity.type = 0)");
$this->assertEqual($users[0]->name, "zYne");
$this->assertTrue($users instanceof Doctrine_Collection_Lazy);
}
2006-05-17 21:58:40 +04:00
2006-06-30 03:04:39 +04:00
public function testAlbumManager() {
2006-05-17 21:58:40 +04:00
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-05-10 01:39:07 +04:00
$this->graph = $query;
$user = $this->objTable->find(5);
2006-08-22 03:20:33 +04:00
$album = $this->connection->create("Album");
2006-05-10 01:39:07 +04:00
$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(5);
$this->assertEqual(count($user->Album[0]->Song), 3);
$this->assertEqual(count($user->Album[1]->Song), 4);
$users = $query->query("FROM User WHERE User.Album.name like '%Damage%'");
2006-06-30 03:04:39 +04:00
}
2006-05-10 01:39:07 +04:00
2006-06-30 03:04:39 +04:00
function testQuery() {
2006-05-10 01:39:07 +04:00
// DYNAMIC COLLECTION EXPANDING
2006-08-22 03:20:33 +04:00
$query = new Doctrine_Query($this->connection);
2006-05-10 01:39:07 +04:00
$user = $this->objTable->find(5);
$user->Group[1]->name = "Tough guys inc.";
$user->Group[2]->name = "Terminators";
$this->assertEqual($user->Group[0]->name, "Action Actors");
$user->save();
$this->assertEqual($user->Group[0]->name, "Action Actors");
$this->assertEqual(count($user->Group), 3);
$user = $this->objTable->find(5);
$this->assertEqual(count($user->Group), 3);
//$users = $query->query("FROM User, User.Group WHERE User.Group.name LIKE 'Action Actors'");
//$this->assertEqual(count($users),1);
//$this->assertEqual($users[0]->Group[0]->name, "Action Actors");
//$this->assertEqual(count($users[0]->Group), 1);
//$this->assertEqual($users[0]->Group[1]->name, "Tough guys inc.");
//$this->assertEqual($users[0]->Group[2]->name, "Terminators");
//$this->assertEqual(count($users[0]->Group), 3);
2006-08-22 03:20:33 +04:00
$this->connection->getTable("User")->clear();
$this->connection->getTable("Phonenumber")->clear();
2006-05-10 01:39:07 +04:00
2006-05-25 16:25:26 +04:00
$users = $query->query("FROM User-b.Phonenumber-l WHERE User.Phonenumber.phonenumber LIKE '%123%'");
2006-05-10 01:39:07 +04:00
$this->assertEqual(trim($query->getQuery()),
2006-06-30 03:04:39 +04:00
"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)");
2006-05-10 01:39:07 +04:00
2006-08-22 03:20:33 +04:00
$count = $this->connection->getDBH()->count();
2006-05-10 01:39:07 +04:00
$users[1]->Phonenumber[0]->phonenumber;
$users[1]->Phonenumber[1]->phonenumber;
$this->assertEqual($users[1]->Phonenumber[1]->getState(),Doctrine_Record::STATE_CLEAN);
$users[1]->Phonenumber[2]->phonenumber;
$this->assertEqual($users[1]->Phonenumber[1]->getState(),Doctrine_Record::STATE_CLEAN);
2006-08-22 03:20:33 +04:00
$count2 = $this->connection->getDBH()->count();
2006-05-10 01:39:07 +04:00
$this->assertEqual($count + 4,$count2);
// DYNAMIC FETCHMODES
$e = false;
try {
$users = $query->query("FROM User-unknown");
} catch(Exception $e) {
}
$this->assertTrue($e instanceof Doctrine_Query_Exception);
2006-05-10 01:39:07 +04:00
$users = $query->query("FROM User-i");
$this->assertEqual(trim($query->getQuery()),
"SELECT entity.id AS entity__id, entity.name AS entity__name, entity.loginname AS entity__loginname, entity.password AS entity__password, entity.type AS entity__type, entity.created AS entity__created, entity.updated AS entity__updated, entity.email_id AS entity__email_id FROM entity WHERE (entity.type = 0)");
2006-05-10 01:39:07 +04:00
2006-08-22 03:20:33 +04:00
$count = $this->connection->getDBH()->count();
2006-05-10 01:39:07 +04:00
$this->assertEqual($users[0]->name, "zYne");
$this->assertTrue($users instanceof Doctrine_Collection_Immediate);
2006-08-22 03:20:33 +04:00
$count2 = $this->connection->getDBH()->count();
2006-05-10 01:39:07 +04:00
//$this->clearCache();
2006-05-25 16:25:26 +04:00
$users = $query->query("FROM User-b.Phonenumber-b");
2006-05-10 01:39:07 +04:00
$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 (entity.type = 0)");
2006-05-10 01:39:07 +04:00
$this->assertEqual($users->count(),8);
// EXPECTED THAT ONE NEW QUERY IS NEEDED TO GET THE FIRST USER's PHONENUMBER
2006-08-22 03:20:33 +04:00
$count = $this->connection->getDBH()->count();
2006-05-10 01:39:07 +04:00
$users[0]->Phonenumber[0]->phonenumber;
2006-08-22 03:20:33 +04:00
$count2 = $this->connection->getDBH()->count();
2006-05-10 01:39:07 +04:00
$this->assertEqual($count + 1,$count2);
2006-05-25 16:25:26 +04:00
$users = $query->query("FROM User-l:Email-b");
2006-05-10 01:39:07 +04:00
$this->assertEqual(trim($query->getQuery()),
"SELECT entity.id AS entity__id, email.id AS email__id FROM entity INNER JOIN email ON entity.email_id = email.id WHERE (entity.type = 0)");
2006-05-10 01:39:07 +04:00
$this->assertEqual($users->count(),8);
$users = $query->query("FROM Email-b WHERE Email.address LIKE '%@example%'");
2006-05-10 01:39:07 +04:00
$this->assertEqual($query->getQuery(),
2006-06-30 03:04:39 +04:00
"SELECT email.id AS email__id FROM email WHERE email.address LIKE '%@example%'");
2006-05-10 01:39:07 +04:00
$this->assertEqual($users->count(),8);
$users = $query->query("FROM User-b WHERE User.name LIKE '%Jack%'");
2006-06-30 03:04:39 +04:00
$this->assertEqual($query->getQuery(), "SELECT entity.id AS entity__id FROM entity WHERE entity.name LIKE '%Jack%' AND (entity.type = 0)");
2006-05-10 01:39:07 +04:00
$this->assertEqual($users->count(),0);
2006-06-25 22:34:53 +04:00
$users = $query->query("FROM User-b WHERE User.Phonenumber.phonenumber LIKE '%123%'");
2006-05-10 01:39:07 +04:00
$this->assertEqual(trim($query->getQuery()),
2006-06-30 03:04:39 +04:00
"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)");
2006-06-25 22:34:53 +04:00
$this->assertEqual($users->count(),5);
2006-05-10 01:39:07 +04:00
2006-05-27 00:15:27 +04:00
//$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)");
//$this->assertTrue(is_array($values));
//$this->assertTrue(isset($values['users']));
//$this->assertTrue(isset($values['max']));
2006-05-25 16:25:26 +04:00
}
2006-05-10 01:39:07 +04:00
}
?>