ModifyLimitQueryTest.php 4.84 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php

namespace Doctrine\Tests\DBAL\Functional;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Connection;
use PDO;

require_once __DIR__ . '/../../TestInit.php';

class ModifyLimitQueryTest extends \Doctrine\Tests\DbalFunctionalTestCase
{
    private static $tableCreated = false;
14

15 16 17 18 19 20 21 22
    public function setUp()
    {
        parent::setUp();

        if (!self::$tableCreated) {
            /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */
            $table = new \Doctrine\DBAL\Schema\Table("modify_limit_table");
            $table->addColumn('test_int', 'integer');
23 24
            $table->setPrimaryKey(array('test_int'));

25
            $table2 = new \Doctrine\DBAL\Schema\Table("modify_limit_table2");
26
            $table2->addColumn('id', 'integer', array('autoincrement' => true));
27
            $table2->addColumn('test_int', 'integer');
28
            $table2->setPrimaryKey(array('id'));
29 30 31 32 33 34 35 36 37

            $sm = $this->_conn->getSchemaManager();
            $sm->createTable($table);
            $sm->createTable($table2);
            self::$tableCreated = true;
        }
        $this->_conn->exec($this->_conn->getDatabasePlatform()->getTruncateTableSQL('modify_limit_table'));
        $this->_conn->exec($this->_conn->getDatabasePlatform()->getTruncateTableSQL('modify_limit_table2'));
    }
38

39 40 41 42 43 44
    public function testModifyLimitQuerySimpleQuery()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
45

46
        $sql = "SELECT * FROM modify_limit_table";
47

48 49 50 51
        $this->assertLimitResult(array(1, 2, 3, 4), $sql, 10, 0);
        $this->assertLimitResult(array(1, 2), $sql, 2, 0);
        $this->assertLimitResult(array(3, 4), $sql, 2, 2);
    }
52

53 54 55 56
    public function testModifyLimitQueryJoinQuery()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
57

58 59 60 61 62
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
63

64
        $sql = "SELECT modify_limit_table.test_int FROM modify_limit_table INNER JOIN modify_limit_table2 ON modify_limit_table.test_int = modify_limit_table2.test_int";
65

66 67 68 69
        $this->assertLimitResult(array(1, 1, 1, 2, 2), $sql, 10, 0);
        $this->assertLimitResult(array(1, 1, 1), $sql, 3, 0);
        $this->assertLimitResult(array(2, 2), $sql, 2, 3);
    }
70

71 72 73 74 75 76
    public function testModifyLimitQueryOrderBy()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
77

78
        $sql = "SELECT * FROM modify_limit_table ORDER BY test_int DESC";
79

80 81 82 83
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0);
        $this->assertLimitResult(array(4, 3), $sql, 2, 0);
        $this->assertLimitResult(array(2, 1), $sql, 2, 2);
    }
84

85 86 87 88
    public function testModifyLimitQueryGroupBy()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
89

90 91 92 93 94
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
95

96 97 98 99 100 101 102
        $sql = "SELECT modify_limit_table.test_int FROM modify_limit_table " .
               "INNER JOIN modify_limit_table2 ON modify_limit_table.test_int = modify_limit_table2.test_int ".
               "GROUP BY modify_limit_table.test_int";
        $this->assertLimitResult(array(1, 2), $sql, 10, 0);
        $this->assertLimitResult(array(1), $sql, 1, 0);
        $this->assertLimitResult(array(2), $sql, 1, 1);
    }
103

104 105 106 107 108
    public function assertLimitResult($expectedResults, $sql, $limit, $offset)
    {
        $p = $this->_conn->getDatabasePlatform();
        $data = array();
        foreach ($this->_conn->fetchAll($p->modifyLimitQuery($sql, $limit, $offset)) AS $row) {
109 110
            $row = array_change_key_case($row, CASE_LOWER);
            $data[] = $row['test_int'];
111 112 113 114
        }
        $this->assertEquals($expectedResults, $data);
    }
}