Skip to content

Commit 3665a25

Browse files
feat: add support for mathematical functions CBRT, DEGREES, EXP, LN, LOG, PI, POWER, RADIANS, RANDOM, SIGN and WIDTH_BUCKET (#383)
1 parent 9fb0419 commit 3665a25

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1218
-22
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ This package provides comprehensive Doctrine support for PostgreSQL features:
4949
- IP addresses (`inet`, `inet[]`)
5050
- Network CIDR notation (`cidr`, `cidr[]`)
5151
- MAC addresses (`macaddr`, `macaddr[]`)
52+
- **Geometric Types**
53+
- Point (`point`, `point[]`)
5254

5355
### PostgreSQL Operators
5456
- **Array Operations**
@@ -77,6 +79,8 @@ This package provides comprehensive Doctrine support for PostgreSQL features:
7779
- **Aggregate Functions**
7880
- Aggregation with ordering and distinct (`array_agg`, `json_agg`, `jsonb_agg`)
7981
- Special aggregates (`any_value`, `xmlagg`)
82+
- **Mathematical/Arithmetic Functions**
83+
- **Range Functions**
8084

8185
Full documentation:
8286
- [Available Types](docs/AVAILABLE-TYPES.md)

docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
| PostgreSQL functions | Register for DQL as | Implemented by
3030
|---|---|---|
31-
| abs | ABS | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs` |
3231
| all | ALL_OF | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\All` |
3332
| any | ANY_OF | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Any` |
3433
| any_value | ANY_VALUE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue` |
@@ -118,6 +117,17 @@
118117
| unaccent | UNACCENT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Unaccent` |
119118
| unnest | UNNEST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Unnest` |
120119
| xmlagg | XML_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\XmlAgg` |
120+
| cbrt | CBRT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt` |
121+
| degrees | DEGREES | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees` |
122+
| exp | EXP | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp` |
123+
| ln | LN | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln` |
124+
| log | LOG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log` |
125+
| pi | PI | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi` |
126+
| power | POWER | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power` |
127+
| radians | RADIANS | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians` |
128+
| random | RANDOM | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random` |
129+
| sign | SIGN | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign` |
130+
| width_bucket | WIDTH_BUCKET | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket` |
121131

122132

123133
# Bonus helpers

docs/INTEGRATING-WITH-DOCTRINE.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,21 @@ $configuration->addCustomStringFunction('TSRANGE', MartinGeorgiev\Doctrine\ORM\Q
148148
$configuration->addCustomStringFunction('TSTZRANGE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange::class);
149149

150150
# Arithmetic functions
151-
$configuration->addCustomStringFunction('ABS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs::class);
151+
$configuration->addCustomStringFunction('CBRT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt::class);
152152
$configuration->addCustomStringFunction('CEIL', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ceil::class);
153+
$configuration->addCustomStringFunction('DEGREES', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees::class);
154+
$configuration->addCustomStringFunction('EXP', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp::class);
153155
$configuration->addCustomStringFunction('FLOOR', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor::class);
156+
$configuration->addCustomStringFunction('LN', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln::class);
157+
$configuration->addCustomStringFunction('LOG', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log::class);
158+
$configuration->addCustomStringFunction('PI', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi::class);
159+
$configuration->addCustomStringFunction('POWER', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power::class);
160+
$configuration->addCustomStringFunction('RADIANS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians::class);
161+
$configuration->addCustomStringFunction('RANDOM', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random::class);
154162
$configuration->addCustomStringFunction('ROUND', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round::class);
163+
$configuration->addCustomStringFunction('SIGN', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign::class);
155164
$configuration->addCustomStringFunction('TRUNC', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc::class);
165+
$configuration->addCustomStringFunction('WIDTH_BUCKET', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket::class);
156166

157167
# other operators
158168
$configuration->addCustomStringFunction('CAST', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast::class);

docs/INTEGRATING-WITH-LARAVEL.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,21 @@ return [
203203
'TSTZRANGE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange::class,
204204

205205
# Arithmetic functions
206-
'ABS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs::class,
206+
'CBRT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt::class,
207207
'CEIL' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ceil::class,
208+
'DEGREES' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees::class,
209+
'EXP' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp::class,
208210
'FLOOR' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor::class,
211+
'LN' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln::class,
212+
'LOG' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log::class,
213+
'PI' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi::class,
214+
'POWER' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power::class,
215+
'RADIANS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians::class,
216+
'RANDOM' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random::class,
209217
'ROUND' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round::class,
218+
'SIGN' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign::class,
210219
'TRUNC' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc::class,
220+
'WIDTH_BUCKET' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket::class,
211221

212222
# other operators
213223
'CAST' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast::class,

docs/INTEGRATING-WITH-SYMFONY.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,21 @@ doctrine:
197197
TSTZRANGE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange
198198
199199
# Arithmetic functions
200-
ABS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs
200+
CBRT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt
201201
CEIL: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ceil
202+
DEGREES: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees
203+
EXP: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp
202204
FLOOR: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor
205+
LN: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln
206+
LOG: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log
207+
PI: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi
208+
POWER: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power
209+
RADIANS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians
210+
RANDOM: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random
203211
ROUND: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round
212+
SIGN: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign
204213
TRUNC: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc
214+
WIDTH_BUCKET: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket
205215
206216
# other operators
207217
CAST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast

src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayShuffle.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* Implementation of PostgreSQL ARRAY_SHUFFLE().
99
*
10-
* @see https://www.postgresql.org/docs/current/functions-array.html
10+
* @see https://www.postgresql.org/docs/17/functions-array.html
1111
* @since 3.0
1212
*
1313
* @author Martin Georgiev <martin.georgiev@gmail.com>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL CBRT() - cube root.
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-math.html
11+
* @since 3.2
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Cbrt extends BaseArithmeticFunction
16+
{
17+
protected function getFunctionName(): string
18+
{
19+
return 'CBRT';
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL DEGREES() - converts radians to degrees.
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-math.html
11+
* @since 3.2
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Degrees extends BaseArithmeticFunction
16+
{
17+
protected function getFunctionName(): string
18+
{
19+
return 'DEGREES';
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL EXP() - exponential function (e^x).
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-math.html
11+
* @since 3.2
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Exp extends BaseArithmeticFunction
16+
{
17+
protected function getFunctionName(): string
18+
{
19+
return 'EXP';
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL LN() - natural logarithm.
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-math.html
11+
* @since 3.2
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Ln extends BaseArithmeticFunction
16+
{
17+
protected function getFunctionName(): string
18+
{
19+
return 'LN';
20+
}
21+
}

0 commit comments

Comments
 (0)