Skip to content

Commit 90a9b9e

Browse files
feat: add support for array_shuffle() (#324)
1 parent 19ee3db commit 90a9b9e

File tree

5 files changed

+61
-0
lines changed

5 files changed

+61
-0
lines changed

docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
| array_prepend | ARRAY_PREPEND | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayPrepend` |
4141
| array_remove | ARRAY_REMOVE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayRemove` |
4242
| array_replace | ARRAY_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayReplace` |
43+
| array_shuffle | ARRAY_SHUFFLE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayShuffle` |
4344
| array_to_json | ARRAY_TO_JSON | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToJson` |
4445
| array_to_string | ARRAY_TO_STRING | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToString` |
4546
| cardinality | ARRAY_CARDINALITY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cardinality` |

docs/INTEGRATING-WITH-LARAVEL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ return [
9797
'ARRAY_PREPEND' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayPrepend::class,
9898
'ARRAY_REMOVE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayRemove::class,
9999
'ARRAY_REPLACE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayReplace::class,
100+
'ARRAY_SHUFFLE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayShuffle::class,
100101
'ARRAY_TO_JSON' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToJson::class,
101102
'ARRAY_TO_STRING' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToString::class,
102103
'SPLIT_PART' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\SplitPart::class,

docs/INTEGRATING-WITH-SYMFONY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ doctrine:
9090
ARRAY_PREPEND: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayPrepend
9191
ARRAY_REMOVE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayRemove
9292
ARRAY_REPLACE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayReplace
93+
ARRAY_SHUFFLE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayShuffle
9394
ARRAY_TO_JSON: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToJson
9495
ARRAY_TO_STRING: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToString
9596
SPLIT_PART: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\SplitPart
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL ARRAY_SHUFFLE().
9+
*
10+
* @see https://www.postgresql.org/docs/current/functions-array.html
11+
* @since 3.0
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class ArrayShuffle extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('array_shuffle(%s)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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\ContainsArrays;
8+
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Arr;
9+
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayShuffle;
10+
11+
class ArrayShuffleTest extends TestCase
12+
{
13+
protected function getStringFunctions(): array
14+
{
15+
return [
16+
'ARRAY_SHUFFLE' => ArrayShuffle::class,
17+
'ARRAY' => Arr::class,
18+
];
19+
}
20+
21+
protected function getExpectedSqlStatements(): array
22+
{
23+
return [
24+
'from array field' => 'SELECT array_shuffle(c0_.array1) AS sclr_0 FROM ContainsArrays c0_',
25+
'from literal array' => "SELECT array_shuffle(ARRAY['red', 'green', 'blue']) AS sclr_0 FROM ContainsArrays c0_",
26+
];
27+
}
28+
29+
protected function getDqlStatements(): array
30+
{
31+
return [
32+
'from array field' => \sprintf('SELECT ARRAY_SHUFFLE(e.array1) FROM %s e', ContainsArrays::class),
33+
'from literal array' => \sprintf("SELECT ARRAY_SHUFFLE(ARRAY('red', 'green', 'blue')) FROM %s e", ContainsArrays::class),
34+
];
35+
}
36+
}

0 commit comments

Comments
 (0)