Failed Conditions
Pull Request — 2.6 (#7803)
by
unknown
06:44
created

testLimitSubqueryWithSortOnAssociation()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 0
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Doctrine\Tests\ORM\Tools\Pagination;
4
5
use Doctrine\ORM\Query;
6
use Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker;
7
8
/**
9
 * @group DDC-1613
10
 */
11
class LimitSubqueryWalkerTest extends PaginationTestCase
12
{
13
    public function testLimitSubquery()
14
    {
15
        $dql        = 'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN p.category c JOIN p.author a';
16
        $query      = $this->entityManager->createQuery($dql);
17
        $limitQuery = clone $query;
18
19
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
20
21
        $this->assertEquals(
22
            "SELECT DISTINCT m0_.id AS id_0 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON m0_.category_id = c1_.id INNER JOIN Author a2_ ON m0_.author_id = a2_.id",
23
            $limitQuery->getSQL()
24
        );
25
    }
26
27
    public function testLimitSubqueryWithSort()
28
    {
29
        $dql        = 'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN p.category c JOIN p.author a ORDER BY p.title';
30
        $query      = $this->entityManager->createQuery($dql);
31
        $limitQuery = clone $query;
32
33
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
34
35
        $this->assertEquals(
36
            "SELECT DISTINCT m0_.id AS id_0, m0_.title AS title_1 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON m0_.category_id = c1_.id INNER JOIN Author a2_ ON m0_.author_id = a2_.id ORDER BY m0_.title ASC",
37
            $limitQuery->getSQL()
38
        );
39
    }
40
41
    public function testLimitSubqueryWithSortFunction() : void
42
    {
43
        $dql   = 'SELECT p FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN p.category c GROUP BY p.id ORDER BY COUNT(c.id)';
44
        $query = $this->entityManager->createQuery($dql);
45
46
        $limitQuery = clone $query;
47
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
48
49
        self::assertSame(
50
            'SELECT DISTINCT m0_.id AS id_0 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON m0_.category_id = c1_.id GROUP BY m0_.id ORDER BY COUNT(c1_.id) ASC',
51
            $limitQuery->getSQL()
52
        );
53
    }
54
55
    public function testLimitSubqueryWithSortSimpleArithmetic() : void
56
    {
57
        $dql   = 'SELECT p FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN p.category c GROUP BY p.id ORDER BY p.title + 0';
58
        $query = $this->entityManager->createQuery($dql);
59
60
        $limitQuery = clone $query;
61
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
62
63
        self::assertSame(
64
            'SELECT DISTINCT m0_.id AS id_0, m0_.title AS title_1 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON m0_.category_id = c1_.id GROUP BY m0_.id ORDER BY m0_.title + 0 ASC',
65
            $limitQuery->getSQL()
66
        );
67
    }
68
69
    public function testCountQuery_MixedResultsWithName()
70
    {
71
        $dql        = 'SELECT a, sum(a.name) as foo FROM Doctrine\Tests\ORM\Tools\Pagination\Author a';
72
        $query      = $this->entityManager->createQuery($dql);
73
        $limitQuery = clone $query;
74
75
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
76
77
        $this->assertEquals(
78
            "SELECT DISTINCT a0_.id AS id_0 FROM Author a0_",
79
            $limitQuery->getSQL()
80
        );
81
    }
82
83
    public function testAggQuery_MixedResultsWithNameAndSort() : void
84
    {
85
        $dql   = 'SELECT a, sum(a.name) as foo FROM Doctrine\Tests\ORM\Tools\Pagination\Author a ORDER BY foo DESC';
86
        $query = $this->entityManager->createQuery($dql);
87
88
        $limitQuery = clone $query;
89
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
90
91
        self::assertSame(
92
            'SELECT DISTINCT a0_.id AS id_0, sum(a0_.name) AS sclr_1 FROM Author a0_ ORDER BY sclr_1 DESC',
93
            $limitQuery->getSQL()
94
        );
95
    }
96
97
    public function testAggQuery_MultipleMixedResultsWithSort() : void
98
    {
99
        $dql   = 'SELECT a, sum(a.name) as foo, (SELECT count(subA.id) FROM Doctrine\Tests\ORM\Tools\Pagination\Author subA WHERE subA.id = a.id ) as bar FROM Doctrine\Tests\ORM\Tools\Pagination\Author a ORDER BY foo DESC, bar ASC';
100
        $query = $this->entityManager->createQuery($dql);
101
102
        $limitQuery = clone $query;
103
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
104
105
        self::assertSame(
106
            'SELECT DISTINCT a0_.id AS id_0, sum(a0_.name) AS sclr_1, (SELECT count(a1_.id) AS sclr_3 FROM Author a1_ WHERE a1_.id = a0_.id) AS sclr_2 FROM Author a0_ ORDER BY sclr_1 DESC, sclr_2 ASC',
107
            $limitQuery->getSQL()
108
        );
109
    }
110
111
    /**
112
     * @group DDC-2890
113
     */
114
    public function testLimitSubqueryWithSortOnAssociation()
115
    {
116
        $dql        = 'SELECT p FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p ORDER BY p.author';
117
        $query      = $this->entityManager->createQuery($dql);
118
        $limitQuery = clone $query;
119
120
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
121
122
        $this->assertEquals(
123
            "SELECT DISTINCT m0_.id AS id_0, m0_.author_id AS sclr_1 FROM MyBlogPost m0_ ORDER BY m0_.author_id ASC",
124
            $limitQuery->getSQL()
125
        );
126
    }
127
128
    /**
129
     * Arbitrary Join
130
     */
131
     public function testLimitSubqueryWithArbitraryJoin()
132
    {
133
        $dql        = 'SELECT p, c FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN Doctrine\Tests\ORM\Tools\Pagination\Category c WITH p.category = c';
134
        $query      = $this->entityManager->createQuery($dql);
135
        $limitQuery = clone $query;
136
137
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
138
139
        $this->assertEquals(
140
            "SELECT DISTINCT m0_.id AS id_0 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON (m0_.category_id = c1_.id)",
141
            $limitQuery->getSQL()
142
        );
143
    }
144
145
    public function testLimitSubqueryWithSortWithArbitraryJoin()
146
    {
147
        $dql        = 'SELECT p, c FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN Doctrine\Tests\ORM\Tools\Pagination\Category c WITH p.category = c ORDER BY p.title';
148
        $query      = $this->entityManager->createQuery($dql);
149
        $limitQuery = clone $query;
150
151
        $limitQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [LimitSubqueryWalker::class]);
152
153
        $this->assertEquals(
154
            "SELECT DISTINCT m0_.id AS id_0, m0_.title AS title_1 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON (m0_.category_id = c1_.id) ORDER BY m0_.title ASC",
155
            $limitQuery->getSQL()
156
        );
157
    }
158
}
159
160