Skip to content

Commit ff1528b

Browse files
authored
Add support for Row (#247)
1 parent 2eeec4e commit ff1528b

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
| regexp_match (with no flags) | REGEXP_MATCH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch` |
7676
| regexp_replace (with flags) | FLAGGED_REGEXP_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpReplace` |
7777
| regexp_replace (with no flags) | REGEXP_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace` |
78+
| row | ROW | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row` |
7879
| row_to_json | ROW_TO_JSON | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RowToJson` |
7980
| split_part | SPLIT_PART | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\SplitPart` |
8081
| starts_with | STARTS_WITH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StartsWith` |
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSql Row Constructor expression.
9+
*
10+
* @see https://www.postgresql.org/docs/14/sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS
11+
*/
12+
class Row extends BaseVariadicFunction
13+
{
14+
protected string $commonNodeMapping = 'InParameter';
15+
16+
protected function customiseFunction(): void
17+
{
18+
$this->setFunctionPrototype('ROW(%s)');
19+
}
20+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsDates;
8+
use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsIntegers;
9+
use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons;
10+
use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsTexts;
11+
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row;
12+
13+
class RowTest extends TestCase
14+
{
15+
protected function getStringFunctions(): array
16+
{
17+
return [
18+
'ROW' => Row::class,
19+
];
20+
}
21+
22+
protected function getExpectedSqlStatements(): array
23+
{
24+
return [
25+
'SELECT ROW(c0_.text1, c0_.text2) AS sclr_0 FROM ContainsTexts c0_',
26+
'SELECT ROW(c0_.date1, c0_.date2) AS sclr_0 FROM ContainsDates c0_',
27+
'SELECT ROW(c0_.object1, c0_.object2) AS sclr_0 FROM ContainsJsons c0_',
28+
"SELECT c0_.id AS id_0 FROM ContainsTexts c0_ WHERE ROW(c0_.text1, c0_.text2) > ROW('test', 'test')",
29+
"SELECT c0_.id AS id_0 FROM ContainsIntegers c0_ WHERE ROW(c0_.integer1, c0_.integer2, 'This is a test') > ROW(1, 2, 'This')",
30+
];
31+
}
32+
33+
protected function getDqlStatements(): array
34+
{
35+
return [
36+
\sprintf('SELECT ROW(e.text1, e.text2) FROM %s e', ContainsTexts::class),
37+
\sprintf('SELECT ROW(e.date1, e.date2) FROM %s e', ContainsDates::class),
38+
\sprintf('SELECT ROW(e.object1, e.object2) FROM %s e', ContainsJsons::class),
39+
\sprintf("SELECT e.id FROM %s e WHERE ROW(e.text1, e.text2) > ROW('test', 'test')", ContainsTexts::class),
40+
\sprintf("SELECT e.id FROM %s e WHERE ROW(e.integer1, e.integer2, 'This is a test') > ROW(1, 2, 'This')", ContainsIntegers::class),
41+
];
42+
}
43+
}

0 commit comments

Comments
 (0)