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)
);
}
}
|