File: GH7286Test.php

package info (click to toggle)
doctrine 2.14.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 10,612 kB
  • sloc: php: 113,660; xml: 4,630; makefile: 28; sh: 14
file content (134 lines) | stat: -rw-r--r-- 3,305 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\AST\Node;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\Tests\OrmFunctionalTestCase;

final class GH7286Test extends OrmFunctionalTestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        $this->setUpEntitySchema(
            [
                GH7286Entity::class,
            ]
        );

        $this->_em->persist(new GH7286Entity('foo', 1));
        $this->_em->persist(new GH7286Entity('foo', 2));
        $this->_em->persist(new GH7286Entity('bar', 3));
        $this->_em->persist(new GH7286Entity(null, 4));
        $this->_em->flush();
        $this->_em->clear();
    }

    public function testAggregateExpressionInFunction(): void
    {
        $query = $this->_em->createQuery(
            'SELECT CONCAT(e.type, MIN(e.version)) pair'
            . ' FROM ' . GH7286Entity::class . ' e'
            . ' WHERE e.type IS NOT NULL'
            . ' GROUP BY e.type'
            . ' ORDER BY e.type'
        );

        self::assertSame(
            [
                ['pair' => 'bar3'],
                ['pair' => 'foo1'],
            ],
            $query->getArrayResult()
        );
    }

    /** @group DDC-1091 */
    public function testAggregateFunctionInCustomFunction(): void
    {
        $this->_em->getConfiguration()->addCustomStringFunction('CC', GH7286CustomConcat::class);

        $query = $this->_em->createQuery(
            'SELECT CC(e.type, MIN(e.version)) pair'
            . ' FROM ' . GH7286Entity::class . ' e'
            . ' WHERE e.type IS NOT NULL AND e.type != :type'
            . ' GROUP BY e.type'
        );
        $query->setParameter('type', 'bar');

        self::assertSame(
            ['pair' => 'foo1'],
            $query->getSingleResult()
        );
    }
}

/** @Entity */
class GH7286Entity
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     * @var int
     */
    public $id;

    /**
     * @Column(nullable=true)
     * @var string|null
     */
    public $type;

    /**
     * @Column(type="integer")
     * @var int
     */
    public $version;

    public function __construct(?string $type, int $version)
    {
        $this->type    = $type;
        $this->version = $version;
    }
}

class GH7286CustomConcat extends FunctionNode
{
    /** @var Node */
    private $first;

    /** @var Node */
    private $second;

    public function parse(Parser $parser): void
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->first = $parser->StringPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->second = $parser->StringPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(SqlWalker $walker): string
    {
        return $walker->getConnection()->getDatabasePlatform()->getConcatExpression(
            $this->first->dispatch($walker),
            $this->second->dispatch($walker)
        );
    }
}