QueryTestCase.php 51.1 KB
Newer Older
doctrine's avatar
doctrine committed
1
<?php
zYne's avatar
zYne committed
2
class Doctrine_Query_TestCase extends Doctrine_UnitTestCase {
doctrine's avatar
doctrine committed
3 4 5 6 7
    public function prepareTables() {
        $this->tables[] = "Forum_Category";
        $this->tables[] = "Forum_Entry";
        $this->tables[] = "Forum_Board";
        $this->tables[] = "Forum_Thread";
doctrine's avatar
doctrine committed
8

doctrine's avatar
doctrine committed
9 10 11 12
        $this->tables[] = "ORM_TestEntry";
        $this->tables[] = "ORM_TestItem";
        $this->tables[] = "Log_Status";
        $this->tables[] = "Log_Entry";
13 14 15 16 17
        $this->tables[] = "EnumTest";
        
        $this->tables[] = "Task";
        $this->tables[] = "Resource";
        $this->tables[] = "ResourceType";
doctrine's avatar
doctrine committed
18

19 20 21
        try {
            $this->dbh->query("DROP TABLE test_items");
        } catch(PDOException $e) {
doctrine's avatar
doctrine committed
22

23 24 25 26
        }
        try {
            $this->dbh->query("DROP TABLE test_entries");
        } catch(PDOException $e) {
doctrine's avatar
doctrine committed
27 28

        }
doctrine's avatar
doctrine committed
29
        parent::prepareTables();
30 31
        $this->connection->clear();
    }
32
    /**
zYne's avatar
zYne committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46
    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();
zYne's avatar
zYne committed
47

zYne's avatar
zYne committed
48 49 50 51 52 53 54 55 56 57
        $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);
58

zYne's avatar
zYne committed
59 60 61 62
        $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);
63

zYne's avatar
zYne committed
64 65 66 67 68
        $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));
69
    }
zYne's avatar
zYne committed
70 71 72 73 74
    public function testMultilineParsing() {
        $dql = "
           FROM User u
           WHERE User.id = ?
        ";
75

zYne's avatar
zYne committed
76 77 78
        $q     = new Doctrine_Query();
        
        $q->parseQuery($dql);
79

80
        $this->assertEqual($q->getQuery(), "SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id FROM entity e e WHERE e.id = ? AND (e.type = 0)");
zYne's avatar
zYne committed
81
    }
zYne's avatar
zYne committed
82 83 84 85 86 87 88 89 90 91
    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);
    }
92 93 94 95 96 97 98 99 100 101
    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);
    }
zYne's avatar
zYne committed
102 103 104 105 106 107 108 109 110 111
    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'));

112
        $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id FROM entity e e LEFT JOIN phonenumber ON e.id = p.entity_id WHERE e.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber = ?) AND (e.type = 0)');
113

zYne's avatar
zYne committed
114 115 116 117 118
        $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);
119 120 121 122 123 124 125 126
    }
    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);
zYne's avatar
zYne committed
127

128
        $coll = $q->execute(array('%123%', '%5%'));
zYne's avatar
zYne committed
129

130
        $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id FROM entity e e LEFT JOIN phonenumber ON e.id = p.entity_id WHERE e.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber LIKE ?) AND e.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber LIKE ?) AND (e.type = 0)');
131 132 133 134 135 136

        $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);
zYne's avatar
zYne committed
137
    }
138 139 140 141 142 143 144
    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);
145

146 147
        $coll = $q->execute(array('123%'));

148
        $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id FROM entity e e LEFT JOIN phonenumber ON e.id = p.entity_id WHERE e.id IN (SELECT entity_id FROM phonenumber WHERE phonenumber LIKE ?) AND (e.type = 0)');
149 150 151 152 153 154 155 156 157

        $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);
    }
158 159 160 161 162 163
    public function testEnumConversion() {
        $e[0] = new EnumTest();
        $e[0]->status = 'open';

        $e[1] = new EnumTest();
        $e[1]->status = 'verified';
doctrine's avatar
doctrine committed
164

165 166 167 168 169 170 171 172 173 174
        $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();
        
175
        $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, e.status AS e__status FROM enum_test e WHERE e.status = 0');
176 177 178 179 180 181 182 183
        $this->assertEqual($coll->count(), 1);
        
        $q = new Doctrine_Query;
        
        $coll = $q->from('EnumTest')
                ->where("EnumTest.status = 'verified'")
                ->execute();
        
184
        $this->assertEqual($q->getQuery(), 'SELECT e.id AS e__id, e.status AS e__status FROM enum_test e WHERE e.status = 1');
185
        $this->assertEqual($coll->count(), 1);
doctrine's avatar
doctrine committed
186
    }
187

188 189 190 191
    public function testManyToManyFetchingWithColumnAggregationInheritance() {

        $query = new Doctrine_Query($this->connection);

192
        $query->from('User u INNER JOIN u.Group g');
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219

        $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();
220 221 222
    }
    public function testManyToManyFetchingWithColumnAggregationInheritance2() {
        $query = new Doctrine_Query();
223 224 225
        $users = $query->query("FROM User-b WHERE User.Group.name = 'Action Actors'");

        $this->assertEqual(trim($query->getQuery()),
226
        "SELECT e.id AS e__id FROM entity e e LEFT JOIN groupuser ON e.id = groupuser.user_id LEFT JOIN entity e2 ON e2.id = groupuser.group_id WHERE e2.name = 'Action Actors' AND (e.type = 0 AND (e2.type = 1 OR e2.type IS NULL))");
227 228 229
        $this->assertTrue($users instanceof Doctrine_Collection);
        $this->assertEqual($users->count(),1);

230 231 232 233
        $this->assertEqual(count($this->dbh->query($query->getQuery())->fetchAll()), 1);
    }
    public function testManyToManyFetchingWithColumnAggregationInheritance3() {
        $query = new Doctrine_Query();
234 235 236
        $users = $query->query("FROM User-b WHERE User.Group.Phonenumber.phonenumber LIKE '123 123'");

        $this->assertEqual(trim($query->getQuery()),
237
        "SELECT e.id AS e__id FROM entity e e LEFT JOIN groupuser ON e.id = groupuser.user_id LEFT JOIN entity e2 ON e2.id = groupuser.group_id LEFT JOIN phonenumber ON e2.id = p.entity_id WHERE p.phonenumber LIKE '123 123' AND (e.type = 0 AND (e2.type = 1 OR e2.type IS NULL))");
238 239
        $this->assertTrue($users instanceof Doctrine_Collection);
        $this->assertEqual($users->count(),1);
240 241 242
    }
    */
    public function testManyToManyFetchingWithColumnAggregationInheritance4() {
243
        $query = new Doctrine_Query();
244 245 246 247
        $query->parseQuery("FROM User.Group WHERE User.Group.name = 'Action Actors'");

        $users = $query->execute();

248 249 250 251 252 253 254 255 256 257
        $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());
    }
258
    /**
259
    public function testSelectingAggregateValues() {
260

261 262 263 264
        $q = new Doctrine_Query();
        $q->from("User(COUNT(1), MAX(name))");
        $array = $q->execute();
        $this->assertTrue(is_array($array));
265 266
        $this->assertEqual($array, array(array('COUNT(1)' => '8', 'MAX(e.name)' => 'zYne')));
        $this->assertEqual($q->getQuery(), "SELECT COUNT(1), MAX(e.name) FROM entity e e WHERE (e.type = 0)");
267 268 269

        $q = new Doctrine_Query();
        $q->from("Phonenumber(COUNT(1))");
270

271 272 273
        $array = $q->execute();
        $this->assertTrue(is_array($array));
        $this->assertEqual($array, array(array('COUNT(1)' => '15')));
274
        $this->assertEqual($q->getQuery(), "SELECT COUNT(1) FROM phonenumber p");
275 276 277 278 279 280

        $q = new Doctrine_Query();
        $q->from("User.Phonenumber(COUNT(id))");
        $array = $q->execute();
        $this->assertTrue(is_array($array));

281 282
        $this->assertEqual($array[0]['COUNT(p.id)'], 14);
        $this->assertEqual($q->getQuery(), "SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id, COUNT(p.id) FROM entity e e LEFT JOIN phonenumber p ON e.id = p.entity_id WHERE (e.type = 0)");
283 284

        $q = new Doctrine_Query();
285 286 287 288
        $q->select('MAX(u.id), MIN(e.address)')->from("User u INNER JOIN u.Email e");
        $coll = $q->execute();
        $this->assertEqual($coll->getAggregateValue('MAX(e.id)'), 11);
        $this->assertEqual($coll['MIN(email.address)'], 'arnold@example.com');
doctrine's avatar
doctrine committed
289

290 291 292 293
        $q = new Doctrine_Query();
        $q->from("User(MAX(id)).Email(MIN(address)), User.Phonenumber(COUNT(1))");
        $array = $q->execute();
        $this->assertTrue(is_array($array));
doctrine's avatar
doctrine committed
294

295
        $this->assertEqual($array[0]['MAX(e.id)'], 11);
296 297
        $this->assertEqual($array[0]['MIN(email.address)'], 'arnold@example.com');
        $this->assertEqual($array[0]['COUNT(1)'], 14);
298 299 300 301 302 303 304 305

        //$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);

doctrine's avatar
doctrine committed
306
    }
307
    */
zYne's avatar
zYne committed
308

309

310 311
    public function testMultipleFetching() {
        $count = $this->dbh->count();
zYne's avatar
zYne committed
312 313 314
        $this->connection->getTable('User')->clear();
        $this->connection->getTable('Email')->clear();
        $this->connection->getTable('Phonenumber')->clear();
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349

        $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());
    }

350 351 352 353

    public function testGetPath() {
        $this->query->from("User.Group.Email");
        
354 355
        $this->assertEqual($this->query->getTableAlias("User"),  "e");
        $this->assertEqual($this->query->getTableAlias("User.Group"), "e2");
356 357 358


        $this->query->from("Task.Subtask.Subtask");
359 360 361
        $this->assertEqual($this->query->getTableAlias("Task"), "t");
        $this->assertEqual($this->query->getTableAlias("Task.Subtask"), "t2");
        $this->assertEqual($this->query->getTableAlias("Task.Subtask.Subtask"), "t3");
doctrine's avatar
doctrine committed
362 363 364
        

        $this->assertEqual($this->query->getQuery(), 
365
        "SELECT t.id AS t__id, t.name AS t__name, t.parent_id AS t__parent_id, t2.id AS t2__id, t2.name AS t2__name, t2.parent_id AS t2__parent_id, t3.id AS t3__id, t3.name AS t3__name, t3.parent_id AS t3__parent_id FROM task t LEFT JOIN task t2 ON t.id = t2.parent_id LEFT JOIN task t3 ON t2.id = t3.parent_id");
366 367
    }

doctrine's avatar
doctrine committed
368
    public function testMultiComponentFetching2() {
zYne's avatar
zYne committed
369
        $this->connection->clear();
doctrine's avatar
doctrine committed
370

zYne's avatar
zYne committed
371
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
372 373

        $query->from("User.Email, User.Phonenumber");
374 375
        

doctrine's avatar
doctrine committed
376 377 378 379 380 381 382 383 384 385
        $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));
    }

386
    public function testHaving() {
zYne's avatar
zYne committed
387
        $this->connection->clear();
388 389


zYne's avatar
zYne committed
390
        $query = new Doctrine_Query($this->connection);
391
        $query->from('User-l.Phonenumber-l');
392
        $query->having("COUNT(User.Phonenumber.phonenumber) > 2");
393
        $query->groupby('User.id');
394
        
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
        $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);
doctrine's avatar
doctrine committed
422

zYne's avatar
zYne committed
423
        $this->connection->clear();
doctrine's avatar
doctrine committed
424 425 426 427
        $query->from('User-l.Phonenumber-l');
        $query->having("COUNT(User.Phonenumber.phonenumber) > 2");
        $query->groupby('User.id');

zYne's avatar
zYne committed
428
        $users = $this->connection->query("FROM User-l.Phonenumber-l GROUP BY User.id HAVING COUNT(User.Phonenumber.phonenumber) > 2");
doctrine's avatar
doctrine committed
429 430 431 432 433 434 435

        $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);
436 437
    }

438

439

doctrine's avatar
doctrine committed
440
    public function testNestedManyToManyRelations() {
441 442 443 444
        $task = new Task();
        $task->name = "T1";
        $task->ResourceAlias[0]->name = "R1";
        $task->ResourceAlias[1]->name = "R2";
doctrine's avatar
doctrine committed
445 446 447
        $task->ResourceAlias[0]->Type[0]->type = 'TY1';
        //$task->ResourceAlias[1]->Type[0]->type = 'TY2';

448 449 450
        $task = new Task();
        $task->name = "T2";
        $task->ResourceAlias[0]->name = "R3";
doctrine's avatar
doctrine committed
451
        $task->ResourceAlias[0]->Type[0]->type = 'TY2';
452
        $task->ResourceAlias[0]->Type[1]->type = 'TY3';
453 454
        $task->ResourceAlias[1]->name = "R4";
        $task->ResourceAlias[2]->name = "R5";
doctrine's avatar
doctrine committed
455 456
        $task->ResourceAlias[2]->Type[0]->type = 'TY4';
        $task->ResourceAlias[2]->Type[1]->type = 'TY5';
457 458 459 460 461 462 463 464 465 466
        $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";
doctrine's avatar
doctrine committed
467

468 469 470
        $task = new Task();
        $task->name = "T4";

zYne's avatar
zYne committed
471
        $this->connection->flush();
doctrine's avatar
doctrine committed
472

zYne's avatar
zYne committed
473
        $this->connection->clear();
doctrine's avatar
doctrine committed
474

zYne's avatar
zYne committed
475
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
476 477 478 479 480 481 482 483 484 485 486 487 488 489
        $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);
490

zYne's avatar
zYne committed
491
        $this->connection->clear();
492 493 494 495 496 497 498 499
        
        $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');
doctrine's avatar
doctrine committed
500 501 502 503
    }


    public function testManyToManyFetchingWithColonOperator() {
zYne's avatar
zYne committed
504
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
505 506 507

        $task = new Task();

508
        // clear identity maps
zYne's avatar
zYne committed
509 510 511
        $this->connection->getTable('Task')->clear();
        $this->connection->getTable('Assignment')->clear();
        $this->connection->getTable('Resource')->clear();
512 513 514 515 516 517 518 519 520

        $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();
zYne's avatar
zYne committed
521 522
        $this->connection->getTable('Assignment')->clear();
        $this->connection->getTable('Resource')->clear();
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539

        $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);
540

541 542 543 544 545 546 547 548 549 550 551 552
        $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);
    }
553

554
    public function testManyToManyFetchingWithDotOperator() {
zYne's avatar
zYne committed
555
        $query = new Doctrine_Query($this->connection);
556

zYne's avatar
zYne committed
557 558 559
        $this->connection->getTable('Task')->clear();
        $this->connection->getTable('Assignment')->clear();
        $this->connection->getTable('Resource')->clear();
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593

        $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);
    }
doctrine's avatar
doctrine committed
594

595
    public function testManyToManyFetchingWithDotOperatorAndLoadedIdentityMaps() {
zYne's avatar
zYne committed
596
        $query = new Doctrine_Query($this->connection);
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630

        $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);
    }
doctrine's avatar
doctrine committed
631

doctrine's avatar
doctrine committed
632
    public function testOneToOneSharedRelations() {
doctrine's avatar
doctrine committed
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
        $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;



zYne's avatar
zYne committed
648
        $this->connection->flush();
doctrine's avatar
doctrine committed
649 650 651 652 653 654
        
        // clear the identity maps

        $entries[0]->Log_Status->getTable()->clear();
        $entries[0]->getTable()->clear();

zYne's avatar
zYne committed
655
        $entries = $this->connection->query("FROM Log_Entry-I.Log_Status-i");
doctrine's avatar
doctrine committed
656 657 658 659 660 661 662

        $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
doctrine's avatar
doctrine committed
663

doctrine's avatar
doctrine committed
664 665 666 667 668 669 670 671 672 673
        $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);
674

doctrine's avatar
doctrine committed
675 676 677 678
        // clear the identity maps

        $entries[0]->Log_Status->getTable()->clear();
        $entries[0]->getTable()->clear();
679

zYne's avatar
zYne committed
680
        $entries = $this->connection->query("FROM Log_Entry-I.Log_Status-i");
doctrine's avatar
doctrine committed
681
        $this->assertEqual($entries->count(), 2);
682 683 684

        $this->assertTrue($entries[0]->Log_Status instanceof Log_Status);

doctrine's avatar
doctrine committed
685 686
        $this->assertEqual($entries[0]->Log_Status->name, null);
        $this->assertEqual($entries[1]->Log_Status->name, null);
687

doctrine's avatar
doctrine committed
688
    }
689

doctrine's avatar
doctrine committed
690 691 692 693 694 695 696 697 698 699 700
    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';
        
zYne's avatar
zYne committed
701
        $this->connection->flush();
doctrine's avatar
doctrine committed
702 703 704
        
        $count = $this->dbh->count();

zYne's avatar
zYne committed
705
        $entries = $this->connection->query("FROM ORM_TestEntry-i.ORM_TestItem-i");
doctrine's avatar
doctrine committed
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728

        $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());
    }

doctrine's avatar
doctrine committed
729 730
    public function testImmediateFetching() {
        $count = $this->dbh->count();
zYne's avatar
zYne committed
731 732 733
        $this->connection->getTable('User')->clear();
        $this->connection->getTable('Email')->clear();
        $this->connection->getTable('Phonenumber')->clear();
doctrine's avatar
doctrine committed
734 735 736 737 738 739 740 741 742 743

        $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());
744 745 746 747 748 749
        
        $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());
doctrine's avatar
doctrine committed
750 751
    }

752
    public function testLazyPropertyFetchingWithMultipleColumns() {
753

zYne's avatar
zYne committed
754
        $q = new Doctrine_Query($this->connection);
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
        $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));
    }
doctrine's avatar
doctrine committed
798

799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827


    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());
    }

828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
    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);
    }

867

doctrine's avatar
doctrine committed
868
    public function testQueryWithComplexAliases() {
zYne's avatar
zYne committed
869
        $q = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
870

doctrine's avatar
doctrine committed
871 872
        $board = new Forum_Board();
        $table = $board->getTable();
873
        $fk    = $table->getRelation("Threads");
doctrine's avatar
doctrine committed
874 875

        $this->assertEqual($table->getComponentName(), "Forum_Board");
876
        $this->assertTrue($fk instanceof Doctrine_Relation_ForeignKey);
doctrine's avatar
doctrine committed
877 878
        $this->assertEqual($fk->getTable()->getComponentName(), "Forum_Thread");

doctrine's avatar
doctrine committed
879
        $entry = new Forum_Entry();
880
        $this->assertTrue($entry->getTable()->getRelation("Thread") instanceof Doctrine_Relation_LocalKey);
doctrine's avatar
doctrine committed
881 882 883 884 885 886 887 888

        $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);
doctrine's avatar
doctrine committed
889
        $this->assertEqual($board->Threads[0]->getState(), Doctrine_Record::STATE_TDIRTY);
doctrine's avatar
doctrine committed
890
        $this->assertTrue($board->Threads[0] instanceof Forum_Thread);
doctrine's avatar
doctrine committed
891 892 893

        $thread = $board->Threads[0];
        $thread->Entries[0]->topic = "My first topic";
doctrine's avatar
doctrine committed
894
        $thread->Entries[1]->topic = "My second topic";
doctrine's avatar
doctrine committed
895 896 897
        $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);
doctrine's avatar
doctrine committed
898

zYne's avatar
zYne committed
899
        $this->connection->flush();
doctrine's avatar
doctrine committed
900

doctrine's avatar
doctrine committed
901
        $board->getTable()->clear();
doctrine's avatar
doctrine committed
902

903
        $board = $board->getTable()->find($board->id);
doctrine's avatar
doctrine committed
904 905 906
        $this->assertEqual($board->Threads->count(), 1);
        $this->assertEqual($board->name, "Doctrine Forum");
        $this->assertEqual($board->Category->name, "General discussion");
doctrine's avatar
doctrine committed
907
        $this->assertEqual($board->Category->getState(), Doctrine_Record::STATE_CLEAN);
doctrine's avatar
doctrine committed
908 909
        $this->assertEqual($board->Threads[0]->getState(), Doctrine_Record::STATE_CLEAN);
        $this->assertTrue($board->Threads[0] instanceof Forum_Thread);
910
        $this->assertEqual($board->Threads[0]->Entries->count(), 2);
doctrine's avatar
doctrine committed
911

doctrine's avatar
doctrine committed
912

doctrine's avatar
doctrine committed
913 914 915 916
        $q->from("Forum_Board");
        $coll = $q->execute();
        $this->assertEqual($coll->count(), 1);

zYne's avatar
zYne committed
917 918
        $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);
doctrine's avatar
doctrine committed
919 920
        $q->from("Forum_Board.Threads");

921
        $this->assertEqual($q->getQuery(), "SELECT f.id AS f__id, f2.id AS f2__id FROM forum__board f LEFT JOIN forum__thread f2 ON f.id = f2.board_id");
doctrine's avatar
doctrine committed
922 923
        $coll = $q->execute();
        $this->assertEqual($coll->count(), 1);
doctrine's avatar
doctrine committed
924 925


doctrine's avatar
doctrine committed
926 927

        $q->from("Forum_Board-l.Threads-l");
928
        $this->assertEqual($q->getQuery(), "SELECT f.id AS f__id, f2.id AS f2__id FROM forum__board f LEFT JOIN forum__thread f2 ON f.id = f2.board_id");
doctrine's avatar
doctrine committed
929

zYne's avatar
zYne committed
930
        //$this->connection->clear();
931 932

        $q->from("Forum_Board-l.Threads-l.Entries-l");
933
        $this->assertEqual($q->getQuery(), "SELECT f.id AS f__id, f2.id AS f2__id, f3.id AS f3__id FROM forum__board f LEFT JOIN forum__thread f2 ON f.id = f2.board_id LEFT JOIN forum__entry f3 ON f2.id = f3.thread_id");
doctrine's avatar
doctrine committed
934 935 936 937 938
        $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);
939 940 941
        $this->assertEqual($boards[0]->Threads[0]->Entries->count(), 2);


doctrine's avatar
doctrine committed
942 943 944 945 946
        $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);
947 948
        $this->assertEqual($boards[0]->Threads[0]->Entries->count(), 2);

doctrine's avatar
doctrine committed
949
    }
doctrine's avatar
doctrine committed
950 951

    public function testQueryWithAliases() {
zYne's avatar
zYne committed
952
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
953

doctrine's avatar
doctrine committed
954 955 956 957 958 959
        $task = new Task();
        $task->name = "Task 1";
        $task->ResourceAlias[0]->name = "Resource 1";
        $task->ResourceAlias[1]->name = "Resource 2";

        $task->save();
doctrine's avatar
doctrine committed
960 961


doctrine's avatar
doctrine committed
962 963 964 965 966 967
        $coll = $query->query("FROM Task WHERE Task.ResourceAlias.name = 'Resource 1'");

        $this->assertEqual($coll->count(), 1);
        $this->assertTrue($coll[0] instanceof Task);
    }

doctrine's avatar
doctrine committed
968
    public function testQueryArgs() {
zYne's avatar
zYne committed
969
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
970 971 972
        $query = $query->from("User-l");

        $this->assertTrue($query instanceof Doctrine_Query);
973
        $this->assertEqual($query->get("from"), "entity e");
doctrine's avatar
doctrine committed
974 975 976

        $query = $query->orderby("User.name");
        $this->assertTrue($query instanceof Doctrine_Query);
977
        $this->assertEqual($query->get("orderby"), array("e.name"));
doctrine's avatar
doctrine committed
978 979 980

        $query = $query->orderby("User.created");
        $this->assertTrue($query instanceof Doctrine_Query);
981
        $this->assertEqual($query->get("orderby"), array("e.created"));
doctrine's avatar
doctrine committed
982 983 984

        $query = $query->where("User.name LIKE 'zYne%'");
        $this->assertTrue($query instanceof Doctrine_Query);
985
        $this->assertEqual($query->get("where"), array("e.name LIKE 'zYne%'"));
doctrine's avatar
doctrine committed
986 987 988

        $query = $query->where("User.name LIKE 'Arnold%'");
        $this->assertTrue($query instanceof Doctrine_Query);
989
        $this->assertEqual($query->get("where"), array("e.name LIKE 'Arnold%'"));
doctrine's avatar
doctrine committed
990 991 992 993 994 995 996 997 998

        $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);

zYne's avatar
zYne committed
999 1000
        $query->remove('limit')->remove('offset');

zYne's avatar
zYne committed
1001 1002
        $this->assertFalse(strpos($query->getQuery(),"OFFSET"));

doctrine's avatar
doctrine committed
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
        $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() {
zYne's avatar
zYne committed
1016
        $query = new Doctrine_Query($this->connection);
zYne's avatar
zYne committed
1017
        $coll  = $query->query("FROM User(id) LIMIT 3");
doctrine's avatar
doctrine committed
1018 1019 1020 1021
        $this->assertEqual($query->limit, 3);
        $this->assertEqual($coll->count(), 3);
    }
    public function testOffset() {
zYne's avatar
zYne committed
1022
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
1023 1024 1025 1026
        $coll  = $query->query("FROM User LIMIT 3 OFFSET 3");
        $this->assertEqual($query->offset, 3);
        $this->assertEqual($coll->count(), 3);
    }
1027
    public function testPreparedQuery() {
zYne's avatar
zYne committed
1028
        $coll = $this->connection->query("FROM User WHERE User.name = :name", array(":name" => "zYne"));
doctrine's avatar
doctrine committed
1029 1030 1031
        $this->assertEqual($coll->count(), 1);
    }
    public function testOrderBy() {
zYne's avatar
zYne committed
1032
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
1033 1034
        $query->from("User-b")->orderby("User.name ASC, User.Email.address");
        $users = $query->execute();
doctrine's avatar
doctrine committed
1035

doctrine's avatar
doctrine committed
1036
        $this->assertEqual(trim($query->getQuery()),
1037
        "SELECT e.id AS e__id FROM entity e LEFT JOIN email e2 ON e.email_id = e2.id WHERE (e.type = 0) ORDER BY e.name ASC, e2.address");
doctrine's avatar
doctrine committed
1038 1039 1040
        $this->assertEqual($users->count(),8);
        $this->assertTrue($users[0]->name == "Arnold Schwarzenegger");
    }
1041
    public function testBatchFetching() {
zYne's avatar
zYne committed
1042
        $query = new Doctrine_Query($this->connection);
1043 1044
        $users = $query->query("FROM User-b");
        $this->assertEqual(trim($query->getQuery()),
1045
        "SELECT e.id AS e__id FROM entity e WHERE (e.type = 0)");
1046 1047 1048 1049 1050

        $this->assertEqual($users[0]->name, "zYne");
        $this->assertTrue($users instanceof Doctrine_Collection_Batch);
    }
    public function testLazyFetching() {
zYne's avatar
zYne committed
1051
        $query = new Doctrine_Query($this->connection);
1052 1053
        $users = $query->query("FROM User-l");
        $this->assertEqual(trim($query->getQuery()),
1054
        "SELECT e.id AS e__id FROM entity e WHERE (e.type = 0)");
1055 1056 1057 1058 1059

        $this->assertEqual($users[0]->name, "zYne");
        $this->assertTrue($users instanceof Doctrine_Collection_Lazy);

    }
doctrine's avatar
doctrine committed
1060 1061


1062
    public function testFetchingWithCollectionExpanding() {
doctrine's avatar
doctrine committed
1063
        // DYNAMIC COLLECTION EXPANDING
zYne's avatar
zYne committed
1064
        $query = new Doctrine_Query($this->connection);
doctrine's avatar
doctrine committed
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086

        $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);

zYne's avatar
zYne committed
1087 1088
        $this->connection->getTable("User")->clear();
        $this->connection->getTable("Phonenumber")->clear();
doctrine's avatar
doctrine committed
1089

doctrine's avatar
doctrine committed
1090
        $users = $query->query("FROM User-b.Phonenumber-l WHERE User.Phonenumber.phonenumber LIKE '%123%'");
doctrine's avatar
doctrine committed
1091
        $this->assertEqual(trim($query->getQuery()),
1092
        "SELECT e.id AS e__id, p.id AS p__id FROM entity e LEFT JOIN phonenumber p ON e.id = p.entity_id WHERE p.phonenumber LIKE '%123%' AND (e.type = 0)");
doctrine's avatar
doctrine committed
1093

zYne's avatar
zYne committed
1094
        $count = $this->connection->getDBH()->count();
doctrine's avatar
doctrine committed
1095 1096 1097 1098 1099 1100 1101

        $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);
zYne's avatar
zYne committed
1102
        $count2 = $this->connection->getDBH()->count();
doctrine's avatar
doctrine committed
1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
        $this->assertEqual($count + 4,$count2);



        // DYNAMIC FETCHMODES
        $e = false;
        try {
            $users = $query->query("FROM User-unknown");
        } catch(Exception $e) {
        }
1113
        $this->assertTrue($e instanceof Doctrine_Query_Exception);
doctrine's avatar
doctrine committed
1114 1115 1116 1117


        $users = $query->query("FROM User-i");
        $this->assertEqual(trim($query->getQuery()),
1118
        "SELECT e.id AS e__id, e.name AS e__name, e.loginname AS e__loginname, e.password AS e__password, e.type AS e__type, e.created AS e__created, e.updated AS e__updated, e.email_id AS e__email_id FROM entity e WHERE (e.type = 0)");
doctrine's avatar
doctrine committed
1119

zYne's avatar
zYne committed
1120
        $count = $this->connection->getDBH()->count();
doctrine's avatar
doctrine committed
1121 1122 1123
        $this->assertEqual($users[0]->name, "zYne");

        $this->assertTrue($users instanceof Doctrine_Collection_Immediate);
zYne's avatar
zYne committed
1124
        $count2 = $this->connection->getDBH()->count();
doctrine's avatar
doctrine committed
1125 1126 1127 1128 1129 1130 1131 1132






        //$this->clearCache();

doctrine's avatar
doctrine committed
1133
        $users = $query->query("FROM User-b.Phonenumber-b");
doctrine's avatar
doctrine committed
1134
        $this->assertEqual(trim($query->getQuery()),
1135
        "SELECT e.id AS e__id, p.id AS p__id FROM entity e LEFT JOIN phonenumber p ON e.id = p.entity_id WHERE (e.type = 0)");
doctrine's avatar
doctrine committed
1136 1137 1138 1139 1140

        $this->assertEqual($users->count(),8);

        // EXPECTED THAT ONE NEW QUERY IS NEEDED TO GET THE FIRST USER's PHONENUMBER

zYne's avatar
zYne committed
1141
        $count = $this->connection->getDBH()->count();
doctrine's avatar
doctrine committed
1142
        $users[0]->Phonenumber[0]->phonenumber;
zYne's avatar
zYne committed
1143
        $count2 = $this->connection->getDBH()->count();
doctrine's avatar
doctrine committed
1144 1145 1146 1147 1148
        $this->assertEqual($count + 1,$count2);




doctrine's avatar
doctrine committed
1149 1150
        $users = $query->query("FROM User-l:Email-b");

doctrine's avatar
doctrine committed
1151
        $this->assertEqual(trim($query->getQuery()),
1152
        "SELECT e.id AS e__id, e2.id AS e2__id FROM entity e INNER JOIN email e2 ON e.email_id = e2.id WHERE (e.type = 0)");
doctrine's avatar
doctrine committed
1153 1154 1155 1156

        $this->assertEqual($users->count(),8);

        $users = $query->query("FROM Email-b WHERE Email.address LIKE '%@example%'");
doctrine's avatar
doctrine committed
1157

doctrine's avatar
doctrine committed
1158
        $this->assertEqual($query->getQuery(),
1159
        "SELECT e.id AS e__id FROM email e WHERE e.address LIKE '%@example%'");
doctrine's avatar
doctrine committed
1160 1161 1162
        $this->assertEqual($users->count(),8);

        $users = $query->query("FROM User-b WHERE User.name LIKE '%Jack%'");
1163
        $this->assertEqual($query->getQuery(), "SELECT e.id AS e__id FROM entity e WHERE e.name LIKE '%Jack%' AND (e.type = 0)");
doctrine's avatar
doctrine committed
1164 1165 1166
        $this->assertEqual($users->count(),0);


1167
        $users = $query->query("FROM User-b WHERE User.Phonenumber.phonenumber LIKE '%123%'");
doctrine's avatar
doctrine committed
1168
        $this->assertEqual(trim($query->getQuery()),
1169
        "SELECT e.id AS e__id FROM entity e LEFT JOIN phonenumber p ON e.id = p.entity_id WHERE p.phonenumber LIKE '%123%' AND (e.type = 0)");
1170
        $this->assertEqual($users->count(),5);
doctrine's avatar
doctrine committed
1171

doctrine's avatar
doctrine committed
1172 1173

        //$values = $query->query("SELECT COUNT(User.name) AS users, MAX(User.name) AS max FROM User");
1174
        //$this->assertEqual(trim($query->getQuery()),"SELECT COUNT(e.name) AS users, MAX(e.name) AS max FROM entity e e WHERE (e.type = 0)");
doctrine's avatar
doctrine committed
1175 1176 1177 1178
        //$this->assertTrue(is_array($values));
        //$this->assertTrue(isset($values['users']));
        //$this->assertTrue(isset($values['max']));

doctrine's avatar
doctrine committed
1179
    }
1180

doctrine's avatar
doctrine committed
1181 1182
}
?>