Completed
Push — master ( c7757e...39cb21 )
by Luís
16s
created

Tests/DBAL/Functional/ModifyLimitQueryTest.php (1 issue)

1
<?php
2
3
namespace Doctrine\Tests\DBAL\Functional;
4
5
class ModifyLimitQueryTest extends \Doctrine\Tests\DbalFunctionalTestCase
6
{
7
    private static $tableCreated = false;
8
9
    protected function setUp()
10
    {
11
        parent::setUp();
12
13
        if (!self::$tableCreated) {
14
            /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */
15
            $table = new \Doctrine\DBAL\Schema\Table("modify_limit_table");
16
            $table->addColumn('test_int', 'integer');
17
            $table->setPrimaryKey(array('test_int'));
18
19
            $table2 = new \Doctrine\DBAL\Schema\Table("modify_limit_table2");
20
            $table2->addColumn('id', 'integer', array('autoincrement' => true));
21
            $table2->addColumn('test_int', 'integer');
22
            $table2->setPrimaryKey(array('id'));
23
24
            $sm = $this->_conn->getSchemaManager();
25
            $sm->createTable($table);
26
            $sm->createTable($table2);
27
            self::$tableCreated = true;
28
        }
29
        $this->_conn->exec($this->_conn->getDatabasePlatform()->getTruncateTableSQL('modify_limit_table'));
30
        $this->_conn->exec($this->_conn->getDatabasePlatform()->getTruncateTableSQL('modify_limit_table2'));
31
    }
32
33
    public function testModifyLimitQuerySimpleQuery()
34
    {
35
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
36
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
37
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
38
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
39
40
        $sql = "SELECT * FROM modify_limit_table ORDER BY test_int ASC";
41
42
        $this->assertLimitResult(array(1, 2, 3, 4), $sql, 10, 0);
43
        $this->assertLimitResult(array(1, 2), $sql, 2, 0);
44
        $this->assertLimitResult(array(3, 4), $sql, 2, 2);
45
        $this->assertLimitResult(array(2, 3, 4), $sql, null, 1);
46
    }
47
48
    public function testModifyLimitQueryJoinQuery()
49
    {
50
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
51
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
52
53
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
54
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
55
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
56
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
57
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
58
59
        $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 ORDER BY modify_limit_table.test_int DESC";
60
61
        $this->assertLimitResult(array(2, 2, 1, 1, 1), $sql, 10, 0);
62
        $this->assertLimitResult(array(1, 1, 1), $sql, 3, 2);
63
        $this->assertLimitResult(array(2, 2), $sql, 2, 0);
64
    }
65
66
    public function testModifyLimitQueryNonDeterministic()
67
    {
68
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
69
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
70
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
71
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
72
73
        $sql = "SELECT * FROM modify_limit_table";
74
75
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0, false);
76
        $this->assertLimitResult(array(4, 3), $sql, 2, 0, false);
77
        $this->assertLimitResult(array(2, 1), $sql, 2, 2, false);
78
    }
79
80
    public function testModifyLimitQueryGroupBy()
81
    {
82
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
83
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
84
85
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
86
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
87
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
88
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
89
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
90
91
        $sql = "SELECT modify_limit_table.test_int FROM modify_limit_table " .
92
               "INNER JOIN modify_limit_table2 ON modify_limit_table.test_int = modify_limit_table2.test_int ".
93
               "GROUP BY modify_limit_table.test_int " .
94
               "ORDER BY modify_limit_table.test_int ASC";
95
        $this->assertLimitResult(array(1, 2), $sql, 10, 0);
96
        $this->assertLimitResult(array(1), $sql, 1, 0);
97
        $this->assertLimitResult(array(2), $sql, 1, 1);
98
    }
99
100 View Code Duplication
    public function testModifyLimitQuerySubSelect()
101
    {
102
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
103
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
104
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
105
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
106
107
        $sql = "SELECT modify_limit_table.*, (SELECT COUNT(*) FROM modify_limit_table) AS cnt FROM modify_limit_table ORDER BY test_int DESC";
108
109
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0);
110
        $this->assertLimitResult(array(4, 3), $sql, 2, 0);
111
        $this->assertLimitResult(array(2, 1), $sql, 2, 2);
112
    }
113
114 View Code Duplication
    public function testModifyLimitQueryFromSubSelect()
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
115
    {
116
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
117
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
118
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
119
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
120
121
        $sql = "SELECT * FROM (SELECT * FROM modify_limit_table) sub ORDER BY test_int DESC";
122
123
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0);
124
        $this->assertLimitResult(array(4, 3), $sql, 2, 0);
125
        $this->assertLimitResult(array(2, 1), $sql, 2, 2);
126
    }
127
128
    public function testModifyLimitQueryLineBreaks()
129
    {
130
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
131
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
132
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
133
134
        $sql = <<<SQL
135
SELECT
136
*
137
FROM
138
modify_limit_table
139
ORDER
140
BY
141
test_int
142
ASC
143
SQL;
144
145
        $this->assertLimitResult(array(2), $sql, 1, 1);
146
    }
147
148
    public function testModifyLimitQueryZeroOffsetNoLimit()
149
    {
150
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
151
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
152
153
        $sql = "SELECT test_int FROM modify_limit_table ORDER BY test_int ASC";
154
155
        $this->assertLimitResult(array(1, 2), $sql, null, 0);
156
    }
157
158
    public function assertLimitResult($expectedResults, $sql, $limit, $offset, $deterministic = true)
159
    {
160
        $p = $this->_conn->getDatabasePlatform();
161
        $data = array();
162
        foreach ($this->_conn->fetchAll($p->modifyLimitQuery($sql, $limit, $offset)) as $row) {
163
            $row = array_change_key_case($row, CASE_LOWER);
164
            $data[] = $row['test_int'];
165
        }
166
167
        /**
168
         * Do not assert the order of results when results are non-deterministic
169
         */
170
        if ($deterministic) {
171
            self::assertEquals($expectedResults, $data);
172
        } else {
173
            self::assertCount(count($expectedResults), $data);
174
        }
175
    }
176
}
177