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
|
|||
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 |
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.