Skip to content

Commit 19ee3db

Browse files
feat: add support for any_value() (#323)
1 parent 396856f commit 19ee3db

File tree

7 files changed

+69
-2
lines changed

7 files changed

+69
-2
lines changed

.github/workflows/sloth.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,5 @@ jobs:
3636
token: ${{ secrets.GITHUB_TOKEN }}
3737
interval: 10
3838
ignored: |
39-
Auto Request Review
4039
CodeRabbit
4140
Scrutinizer

docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
|---|---|---|
3131
| all | ALL_OF | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\All` |
3232
| any | ANY_OF | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Any` |
33+
| any_value | ANY_VALUE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue` |
3334
| array_agg | ARRAY_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayAgg` |
3435
| array_append | ARRAY_APPEND | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayAppend` |
3536
| array_cat | ARRAY_CAT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayCat` |

docs/INTEGRATING-WITH-DOCTRINE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ $configuration->addCustomStringFunction('INT8RANGE', MartinGeorgiev\Doctrine\ORM
7070
$configuration->addCustomStringFunction('NUMRANGE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Numrange::class);
7171
$configuration->addCustomStringFunction('TSRANGE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tsrange::class);
7272
$configuration->addCustomStringFunction('TSTZRANGE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange::class);
73+
# Register array value extracting functions
74+
$configuration->addCustomStringFunction('ALL_OF', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\All::class);
75+
$configuration->addCustomStringFunction('ANY_OF', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Any::class);
76+
$configuration->addCustomStringFunction('ANY_VALUE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue::class);
7377

7478
$em = EntityManager::create($dbParams, $configuration);
7579
```

docs/INTEGRATING-WITH-LARAVEL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ return [
8686

8787
# array and string specific functions
8888
'IN_ARRAY' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\InArray::class,
89+
'ANY_VALUE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue::class,
8990
'ARRAY' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Arr::class,
9091
'ARRAY_APPEND' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayAppend::class,
9192
'ARRAY_CARDINALITY' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayCardinality::class,

docs/INTEGRATING-WITH-SYMFONY.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ doctrine:
6464
# alternative implementation of ALL() and ANY() where subquery is not required, useful for arrays
6565
ALL_OF: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\All
6666
ANY_OF: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Any
67-
67+
6868
# operators for working with array and json(b) data
6969
GREATEST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Greatest
7070
LEAST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Least
@@ -79,6 +79,7 @@ doctrine:
7979
8080
# array and string specific functions
8181
IN_ARRAY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\InArray
82+
ANY_VALUE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue
8283
ARRAY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Arr
8384
ARRAY_APPEND: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayAppend
8485
ARRAY_CARDINALITY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayCardinality
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 ANY_VALUE().
9+
*
10+
* @see https://www.postgresql.org/docs/16/functions-aggregate.html
11+
* @since 3.0
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class AnyValue extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('any_value(%s)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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 Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsTexts;
9+
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue;
10+
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Arr;
11+
12+
class AnyValueTest extends TestCase
13+
{
14+
protected function getStringFunctions(): array
15+
{
16+
return [
17+
'ANY_VALUE' => AnyValue::class,
18+
'ARRAY' => Arr::class,
19+
];
20+
}
21+
22+
protected function getExpectedSqlStatements(): array
23+
{
24+
return [
25+
'from array field' => 'SELECT any_value(c0_.array1) AS sclr_0 FROM ContainsArrays c0_',
26+
'from text field' => 'SELECT any_value(c0_.text1) AS sclr_0 FROM ContainsTexts c0_',
27+
'from list of integers' => "SELECT any_value(ARRAY['red', 'green', 'blue']) AS sclr_0 FROM ContainsTexts c0_",
28+
];
29+
}
30+
31+
protected function getDqlStatements(): array
32+
{
33+
return [
34+
'from array field' => \sprintf('SELECT ANY_VALUE(e.array1) FROM %s e', ContainsArrays::class),
35+
'from text field' => \sprintf('SELECT ANY_VALUE(e.text1) FROM %s e', ContainsTexts::class),
36+
'from list of integers' => \sprintf("SELECT ANY_VALUE(ARRAY('red', 'green', 'blue')) FROM %s e", ContainsTexts::class),
37+
];
38+
}
39+
}

0 commit comments

Comments
 (0)