From 31446506fc38c52134fe2d45febe417710e881c6 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 00:02:20 +0100 Subject: [PATCH 1/9] no message --- README.md | 4 ++ docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md | 12 +++- docs/INTEGRATING-WITH-DOCTRINE.md | 12 +++- docs/INTEGRATING-WITH-LARAVEL.md | 12 +++- docs/INTEGRATING-WITH-SYMFONY.md | 12 +++- .../ORM/Query/AST/Functions/ArrayShuffle.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/Cbrt.php | 21 +++++++ .../ORM/Query/AST/Functions/Degrees.php | 21 +++++++ .../Doctrine/ORM/Query/AST/Functions/Exp.php | 21 +++++++ .../Doctrine/ORM/Query/AST/Functions/Ln.php | 21 +++++++ .../Doctrine/ORM/Query/AST/Functions/Log.php | 31 ++++++++++ .../Doctrine/ORM/Query/AST/Functions/Pi.php | 31 ++++++++++ .../ORM/Query/AST/Functions/Power.php | 31 ++++++++++ .../ORM/Query/AST/Functions/Radians.php | 21 +++++++ .../ORM/Query/AST/Functions/Random.php | 31 ++++++++++ .../Doctrine/ORM/Query/AST/Functions/Sign.php | 21 +++++++ .../ORM/Query/AST/Functions/WidthBucket.php | 33 ++++++++++ .../ORM/Query/AST/Functions/CbrtTest.php | 53 ++++++++++++++++ .../ORM/Query/AST/Functions/DegreesTest.php | 31 ++++++++++ .../ORM/Query/AST/Functions/ExpTest.php | 31 ++++++++++ .../ORM/Query/AST/Functions/LnTest.php | 31 ++++++++++ .../ORM/Query/AST/Functions/LogTest.php | 31 ++++++++++ .../ORM/Query/AST/Functions/PiTest.php | 31 ++++++++++ .../ORM/Query/AST/Functions/PowerTest.php | 62 +++++++++++++++++++ .../ORM/Query/AST/Functions/RadiansTest.php | 31 ++++++++++ .../ORM/Query/AST/Functions/RandomTest.php | 33 ++++++++++ .../ORM/Query/AST/Functions/RoundTest.php | 21 ++++--- .../ORM/Query/AST/Functions/SignTest.php | 35 +++++++++++ .../Query/AST/Functions/WidthBucketTest.php | 32 ++++++++++ .../ORM/Query/AST/Functions/CbrtTest.php | 36 +++++++++++ .../ORM/Query/AST/Functions/DegreesTest.php | 17 +++++ .../ORM/Query/AST/Functions/ExpTest.php | 17 +++++ .../ORM/Query/AST/Functions/LnTest.php | 17 +++++ .../ORM/Query/AST/Functions/LogTest.php | 17 +++++ .../ORM/Query/AST/Functions/PiTest.php | 17 +++++ .../ORM/Query/AST/Functions/PowerTest.php | 36 +++++++++++ .../ORM/Query/AST/Functions/RadiansTest.php | 17 +++++ .../ORM/Query/AST/Functions/RandomTest.php | 17 +++++ .../ORM/Query/AST/Functions/SignTest.php | 36 +++++++++++ .../Query/AST/Functions/WidthBucketTest.php | 17 +++++ 40 files changed, 990 insertions(+), 13 deletions(-) create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Cbrt.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Degrees.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Exp.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Ln.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Pi.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Radians.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Random.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Sign.php create mode 100644 src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php diff --git a/README.md b/README.md index 4c930f11..fdf38b33 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,10 @@ This package provides comprehensive Doctrine support for PostgreSQL features: - **Aggregate Functions** - Aggregation with ordering and distinct (`array_agg`, `json_agg`, `jsonb_agg`) - Special aggregates (`any_value`, `xmlagg`) +- **Mathematical/Arithmetic Functions** + - CBRT, CEIL, DEGREES, EXP, FLOOR, LN, LOG, PI, POWER, RADIANS, RANDOM, ROUND, SIGN, TRUNC, WIDTH_BUCKET +- **Range Functions** + - DATERANGE, INT4RANGE, INT8RANGE, NUMRANGE, TSRANGE, TSTZRANGE Full documentation: - [Available Types](docs/AVAILABLE-TYPES.md) diff --git a/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md b/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md index 4acafd23..b5bd2b60 100644 --- a/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md +++ b/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md @@ -28,7 +28,6 @@ | PostgreSQL functions | Register for DQL as | Implemented by |---|---|---| -| abs | ABS | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs` | | all | ALL_OF | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\All` | | any | ANY_OF | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Any` | | any_value | ANY_VALUE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue` | @@ -118,6 +117,17 @@ | unaccent | UNACCENT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Unaccent` | | unnest | UNNEST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Unnest` | | xmlagg | XML_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\XmlAgg` | +| cbrt | CBRT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt` | +| degrees | DEGREES | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees` | +| exp | EXP | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp` | +| ln | LN | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln` | +| log | LOG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log` | +| pi | PI | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi` | +| power | POWER | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power` | +| radians | RADIANS | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians` | +| random | RANDOM | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random` | +| sign | SIGN | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign` | +| width_bucket | WIDTH_BUCKET | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket` | # Bonus helpers diff --git a/docs/INTEGRATING-WITH-DOCTRINE.md b/docs/INTEGRATING-WITH-DOCTRINE.md index e206bfb2..a72e8b99 100644 --- a/docs/INTEGRATING-WITH-DOCTRINE.md +++ b/docs/INTEGRATING-WITH-DOCTRINE.md @@ -148,11 +148,21 @@ $configuration->addCustomStringFunction('TSRANGE', MartinGeorgiev\Doctrine\ORM\Q $configuration->addCustomStringFunction('TSTZRANGE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange::class); # Arithmetic functions -$configuration->addCustomStringFunction('ABS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs::class); +$configuration->addCustomStringFunction('CBRT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt::class); $configuration->addCustomStringFunction('CEIL', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ceil::class); +$configuration->addCustomStringFunction('DEGREES', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees::class); +$configuration->addCustomStringFunction('EXP', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp::class); $configuration->addCustomStringFunction('FLOOR', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor::class); +$configuration->addCustomStringFunction('LN', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln::class); +$configuration->addCustomStringFunction('LOG', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log::class); +$configuration->addCustomStringFunction('PI', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi::class); +$configuration->addCustomStringFunction('POWER', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power::class); +$configuration->addCustomStringFunction('RADIANS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians::class); +$configuration->addCustomStringFunction('RANDOM', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random::class); $configuration->addCustomStringFunction('ROUND', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round::class); +$configuration->addCustomStringFunction('SIGN', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign::class); $configuration->addCustomStringFunction('TRUNC', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc::class); +$configuration->addCustomStringFunction('WIDTH_BUCKET', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket::class); # other operators $configuration->addCustomStringFunction('CAST', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast::class); diff --git a/docs/INTEGRATING-WITH-LARAVEL.md b/docs/INTEGRATING-WITH-LARAVEL.md index e10f0e3b..02372849 100644 --- a/docs/INTEGRATING-WITH-LARAVEL.md +++ b/docs/INTEGRATING-WITH-LARAVEL.md @@ -203,11 +203,21 @@ return [ 'TSTZRANGE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange::class, # Arithmetic functions - 'ABS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs::class, + 'CBRT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt::class, 'CEIL' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ceil::class, + 'DEGREES' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees::class, + 'EXP' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp::class, 'FLOOR' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor::class, + 'LN' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln::class, + 'LOG' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log::class, + 'PI' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi::class, + 'POWER' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power::class, + 'RADIANS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians::class, + 'RANDOM' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random::class, 'ROUND' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round::class, + 'SIGN' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign::class, 'TRUNC' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc::class, + 'WIDTH_BUCKET' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket::class, # other operators 'CAST' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast::class, diff --git a/docs/INTEGRATING-WITH-SYMFONY.md b/docs/INTEGRATING-WITH-SYMFONY.md index 5d18b19c..e59224bc 100644 --- a/docs/INTEGRATING-WITH-SYMFONY.md +++ b/docs/INTEGRATING-WITH-SYMFONY.md @@ -197,11 +197,21 @@ doctrine: TSTZRANGE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tstzrange # Arithmetic functions - ABS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Abs + CBRT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cbrt CEIL: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ceil + DEGREES: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees + EXP: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp FLOOR: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor + LN: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln + LOG: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log + PI: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi + POWER: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Power + RADIANS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Radians + RANDOM: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Random ROUND: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round + SIGN: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Sign TRUNC: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc + WIDTH_BUCKET: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket # other operators CAST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayShuffle.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayShuffle.php index c0a59c10..1a1b0218 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayShuffle.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayShuffle.php @@ -7,7 +7,7 @@ /** * Implementation of PostgreSQL ARRAY_SHUFFLE(). * - * @see https://www.postgresql.org/docs/current/functions-array.html + * @see https://www.postgresql.org/docs/17/functions-array.html * @since 3.0 * * @author Martin Georgiev diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Cbrt.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Cbrt.php new file mode 100644 index 00000000..faf780d1 --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Cbrt.php @@ -0,0 +1,21 @@ + + */ +class Cbrt extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'CBRT'; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Degrees.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Degrees.php new file mode 100644 index 00000000..a90b6e8f --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Degrees.php @@ -0,0 +1,21 @@ + + */ +class Degrees extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'DEGREES'; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Exp.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Exp.php new file mode 100644 index 00000000..4ceb3cf6 --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Exp.php @@ -0,0 +1,21 @@ + + */ +class Exp extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'EXP'; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Ln.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Ln.php new file mode 100644 index 00000000..a4c09e8d --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Ln.php @@ -0,0 +1,21 @@ + + */ +class Ln extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'LN'; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php new file mode 100644 index 00000000..35beec37 --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php @@ -0,0 +1,31 @@ + + */ +class Log extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'LOG'; + } + + protected function getMaxArgumentCount(): int + { + return 2; + } + + protected function getMinArgumentCount(): int + { + return 2; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Pi.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Pi.php new file mode 100644 index 00000000..de6f8668 --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Pi.php @@ -0,0 +1,31 @@ + + */ +class Pi extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'PI'; + } + + protected function getMaxArgumentCount(): int + { + return 0; // PI() takes no arguments + } + + protected function getMinArgumentCount(): int + { + return 0; // PI() takes no arguments + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php new file mode 100644 index 00000000..9dbf9ea8 --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php @@ -0,0 +1,31 @@ + + */ +class Power extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'POWER'; + } + + protected function getMaxArgumentCount(): int + { + return 2; + } + + protected function getMinArgumentCount(): int + { + return 2; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Radians.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Radians.php new file mode 100644 index 00000000..bc942e2b --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Radians.php @@ -0,0 +1,21 @@ + + */ +class Radians extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'RADIANS'; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Random.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Random.php new file mode 100644 index 00000000..eeaa3082 --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Random.php @@ -0,0 +1,31 @@ + + */ +class Random extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'RANDOM'; + } + + protected function getMaxArgumentCount(): int + { + return 0; // RANDOM() takes no arguments + } + + protected function getMinArgumentCount(): int + { + return 0; // RANDOM() takes no arguments + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Sign.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Sign.php new file mode 100644 index 00000000..1527c93c --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Sign.php @@ -0,0 +1,21 @@ + + */ +class Sign extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'SIGN'; + } +} diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php new file mode 100644 index 00000000..2ffabeed --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php @@ -0,0 +1,33 @@ + + * + * @example Using it in DQL: "SELECT WIDTH_BUCKET(operand, b1, b2, count) FROM Entity e" + */ +class WidthBucket extends BaseArithmeticFunction +{ + protected function getFunctionName(): string + { + return 'WIDTH_BUCKET'; + } + + protected function getMaxArgumentCount(): int + { + return 4; + } + + protected function getMinArgumentCount(): int + { + return 4; + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php new file mode 100644 index 00000000..d1743aed --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php @@ -0,0 +1,53 @@ + Cbrt::class, + ]; + } + + public function test_cbrt_with_perfect_cube(): void + { + $dql = 'SELECT CBRT(27.0) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(3.0, $result[0]['result'], 0.0001); + } + + public function test_cbrt_with_non_perfect_cube(): void + { + $dql = 'SELECT CBRT(10.0) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(2.1544, $result[0]['result'], 0.0001); + } + + public function test_cbrt_with_negative_number(): void + { + $dql = 'SELECT CBRT((-27.0)) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(-3.0, $result[0]['result'], 0.0001); + } + + public function test_cbrt_with_column_value(): void + { + $dql = 'SELECT CBRT(n.decimal1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(2.1897595699439445, $result[0]['result'], 0.0001); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php new file mode 100644 index 00000000..d039638d --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php @@ -0,0 +1,31 @@ + Degrees::class, + ]; + } + + public function test_degrees(): void + { + $dql = 'SELECT DEGREES(3.141592653589793) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(180.0, $result[0]['result'], 0.0001); + } + + public function test_degrees_with_entity_property(): void + { + $dql = 'SELECT DEGREES(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(1, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php new file mode 100644 index 00000000..f15fadbd --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php @@ -0,0 +1,31 @@ + Exp::class, + ]; + } + + public function test_exp(): void + { + $dql = 'SELECT EXP(1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(2.718281828459, $result[0]['result'], 0.0001); + } + + public function test_exp_with_entity_property(): void + { + $dql = 'SELECT EXP(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(1, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php new file mode 100644 index 00000000..5324c353 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php @@ -0,0 +1,31 @@ + Ln::class, + ]; + } + + public function test_ln(): void + { + $dql = 'SELECT LN(2.718281828459) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(1.0, $result[0]['result'], 0.0001); + } + + public function test_ln_with_entity_property(): void + { + $dql = 'SELECT LN(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(1, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php new file mode 100644 index 00000000..833681df --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php @@ -0,0 +1,31 @@ + Log::class, + ]; + } + + public function test_log(): void + { + $dql = 'SELECT LOG(10, 100) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(2.0, $result[0]['result'], 0.0001); + } + + public function test_log_with_entity_property(): void + { + $dql = 'SELECT LOG(10, n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(1, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php new file mode 100644 index 00000000..3d15598a --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php @@ -0,0 +1,31 @@ + Pi::class, + ]; + } + + public function test_pi(): void + { + $dql = 'SELECT PI() as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(3.141592653589793, $result[0]['result'], 0.0001); + } + + public function test_pi_plus_entity_property(): void + { + $dql = 'SELECT PI() + n.decimal1 as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(5.2907810314839, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php new file mode 100644 index 00000000..8e6b8729 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php @@ -0,0 +1,62 @@ + Power::class, + ]; + } + + public function test_power_with_integer_exponent(): void + { + $dql = 'SELECT POWER(2, 3) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEquals(8, $result[0]['result']); + } + + public function test_power_with_fractional_exponent(): void + { + $dql = 'SELECT POWER(9, 0.5) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(3.0, $result[0]['result'], 0.0001); + } + + public function test_power_with_negative_base(): void + { + $dql = 'SELECT POWER(-2, 3) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEquals(-8, $result[0]['result']); + } + + public function test_power_with_negative_exponent(): void + { + $dql = 'SELECT POWER(2, -2) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(0.25, $result[0]['result'], 0.0001); + } + + public function test_power_with_column_values(): void + { + $dql = 'SELECT POWER(n.decimal1, n.decimal2) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(859766721136081107225.6, $result[0]['result'], 0.0001); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php new file mode 100644 index 00000000..06b7ffc0 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php @@ -0,0 +1,31 @@ + Radians::class, + ]; + } + + public function test_radians(): void + { + $dql = 'SELECT RADIANS(180) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEqualsWithDelta(3.141592653589793, $result[0]['result'], 0.0001); + } + + public function test_radians_with_entity_property(): void + { + $dql = 'SELECT RADIANS(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(0.1832595714594046, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php new file mode 100644 index 00000000..ad3461c4 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -0,0 +1,33 @@ + Random::class, + ]; + } + + public function test_random(): void + { + $dql = 'SELECT RANDOM() as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertGreaterThanOrEqual(0.0, $result[0]['result']); + $this->assertLessThanOrEqual(1.0, $result[0]['result']); + } + + public function test_random_plus_entity_property(): void + { + $dql = 'SELECT RANDOM() + n.decimal1 as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertGreaterThanOrEqual(11.0, $result[0]['result']); + $this->assertLessThanOrEqual(12.0, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php index 5dd21c4c..63c9418c 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php @@ -19,8 +19,7 @@ public function test_round_with_positive_number(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, ['number' => 3.14159]); - $this->assertIsNumeric($result[0]['result']); - $this->assertSame(3.0, (float) $result[0]['result']); + $this->assertSame(3.0, $result[0]['result']); } public function test_round_with_negative_number(): void @@ -29,8 +28,7 @@ public function test_round_with_negative_number(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, ['number' => -3.14159]); - $this->assertIsNumeric($result[0]['result']); - $this->assertSame(-3.0, (float) $result[0]['result']); + $this->assertSame(-3.0, $result[0]['result']); } public function test_round_with_precision(): void @@ -42,8 +40,7 @@ public function test_round_with_precision(): void 'number' => 3.14159, 'precision' => 2, ]); - $this->assertIsNumeric($result[0]['result']); - $this->assertSame(3.14, (float) $result[0]['result']); + $this->assertSame('3.14', $result[0]['result']); } public function test_round_with_negative_precision(): void @@ -55,7 +52,15 @@ public function test_round_with_negative_precision(): void 'number' => 314.159, 'precision' => -2, ]); - $this->assertIsNumeric($result[0]['result']); - $this->assertSame(300.0, (float) $result[0]['result']); + $this->assertSame('300', $result[0]['result']); + } + + public function test_round_with_column_value(): void + { + $dql = 'SELECT ROUND(t.decimal1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(300.0, $result[0]['result']); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php new file mode 100644 index 00000000..7723d0ee --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php @@ -0,0 +1,35 @@ + Sign::class, + ]; + } + + public function test_sign_with_zero(): void + { + $dql = 'SELECT SIGN(0) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame('0.0', $result[0]['result']); + } + + public function test_sign_with_column_value(): void + { + $dql = 'SELECT SIGN(n.decimal1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n + WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame('1', $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php new file mode 100644 index 00000000..6bdcff90 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php @@ -0,0 +1,32 @@ + WidthBucket::class, + ]; + } + + public function test_width_bucket(): void + { + $dql = 'SELECT WIDTH_BUCKET(5.35, 0.024, 10.06, 5) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame(3, $result[0]['result']); + } + + public function test_width_bucket_with_entity_property(): void + { + $dql = 'SELECT WIDTH_BUCKET(n.decimal1, 0.0, 20.0, 4) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertIsInt($result[0]['result']); + $this->assertSame(3, $result[0]['result']); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php new file mode 100644 index 00000000..6e722303 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php @@ -0,0 +1,36 @@ + Cbrt::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT CBRT(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT CBRT(c0_.decimal2) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT CBRT(c0_.decimal3) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT CBRT(e.decimal1) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT CBRT(e.decimal2) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT CBRT(e.decimal3) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php new file mode 100644 index 00000000..4e11c559 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php @@ -0,0 +1,17 @@ +assertSame('DEGREES', $degrees->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php new file mode 100644 index 00000000..1a135d5a --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php @@ -0,0 +1,17 @@ +assertSame('EXP', $exp->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php new file mode 100644 index 00000000..c5d8fd88 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php @@ -0,0 +1,17 @@ +assertSame('LN', $ln->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php new file mode 100644 index 00000000..6629ae86 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php @@ -0,0 +1,17 @@ +assertSame('LOG', $log->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php new file mode 100644 index 00000000..356a60e3 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php @@ -0,0 +1,17 @@ +assertSame('PI', $pi->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php new file mode 100644 index 00000000..c5f650f5 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php @@ -0,0 +1,36 @@ + Power::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT POWER(c0_.decimal1, 2) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT POWER(c0_.decimal2, c0_.decimal3) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT POWER(2, 3) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT POWER(e.decimal1, 2) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT POWER(e.decimal2, e.decimal3) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT POWER(2, 3) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php new file mode 100644 index 00000000..191f81a4 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php @@ -0,0 +1,17 @@ +assertSame('RADIANS', $radians->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php new file mode 100644 index 00000000..3a6bfb01 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -0,0 +1,17 @@ +assertSame('RANDOM', $random->getFunctionName()); + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php new file mode 100644 index 00000000..33ae0606 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php @@ -0,0 +1,36 @@ + Sign::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT SIGN(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT SIGN(c0_.decimal2) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT SIGN(c0_.decimal3) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT SIGN(e.decimal1) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT SIGN(e.decimal2) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT SIGN(e.decimal3) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php new file mode 100644 index 00000000..3d4d912a --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php @@ -0,0 +1,17 @@ +assertSame('WIDTH_BUCKET', $widthBucket->getFunctionName()); + } +} From bf609f83b875a51e3c80e632c2951867f7c0802b Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 00:06:07 +0100 Subject: [PATCH 2/9] no message --- .../ORM/Query/AST/Functions/DegreesTest.php | 17 ----------------- .../ORM/Query/AST/Functions/ExpTest.php | 17 ----------------- .../Doctrine/ORM/Query/AST/Functions/LnTest.php | 17 ----------------- .../ORM/Query/AST/Functions/LogTest.php | 17 ----------------- .../Doctrine/ORM/Query/AST/Functions/PiTest.php | 17 ----------------- .../ORM/Query/AST/Functions/RadiansTest.php | 17 ----------------- .../ORM/Query/AST/Functions/RandomTest.php | 17 ----------------- .../ORM/Query/AST/Functions/WidthBucketTest.php | 17 ----------------- 8 files changed, 136 deletions(-) delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php delete mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php deleted file mode 100644 index 4e11c559..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('DEGREES', $degrees->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php deleted file mode 100644 index 1a135d5a..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('EXP', $exp->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php deleted file mode 100644 index c5d8fd88..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('LN', $ln->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php deleted file mode 100644 index 6629ae86..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('LOG', $log->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php deleted file mode 100644 index 356a60e3..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('PI', $pi->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php deleted file mode 100644 index 191f81a4..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('RADIANS', $radians->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php deleted file mode 100644 index 3a6bfb01..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('RANDOM', $random->getFunctionName()); - } -} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php deleted file mode 100644 index 3d4d912a..00000000 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php +++ /dev/null @@ -1,17 +0,0 @@ -assertSame('WIDTH_BUCKET', $widthBucket->getFunctionName()); - } -} From d297dc9518ffb9c2212113487bf53c92b54704b7 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 00:13:37 +0100 Subject: [PATCH 3/9] no message --- .../Doctrine/ORM/Query/AST/Functions/DegreesTest.php | 2 +- .../MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php | 2 +- .../MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php | 2 +- .../MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php | 2 +- .../MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/RadiansTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/RandomTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/SignTest.php | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php index d039638d..f3200880 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php @@ -26,6 +26,6 @@ public function test_degrees_with_entity_property(): void { $dql = 'SELECT DEGREES(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(1, $result[0]['result']); + $this->assertEqualsWithDelta(601.6056848873644, $result[0]['result'], 0.000001); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php index f15fadbd..c00f5e73 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php @@ -26,6 +26,6 @@ public function test_exp_with_entity_property(): void { $dql = 'SELECT EXP(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(1, $result[0]['result']); + $this->assertEqualsWithDelta(36315.502674246638, $result[0]['result'], 0.000001); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php index 5324c353..9c517462 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php @@ -26,6 +26,6 @@ public function test_ln_with_entity_property(): void { $dql = 'SELECT LN(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(1, $result[0]['result']); + $this->assertEqualsWithDelta(2.3513752571634777, $result[0]['result'], 0.000001); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php index 833681df..17c01eb1 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php @@ -26,6 +26,6 @@ public function test_log_with_entity_property(): void { $dql = 'SELECT LOG(10, n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(1, $result[0]['result']); + $this->assertEqualsWithDelta(1.0211892990699381, $result[0]['result'], 0.000001); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php index 3d15598a..e0a57d44 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php @@ -26,6 +26,6 @@ public function test_pi_plus_entity_property(): void { $dql = 'SELECT PI() + n.decimal1 as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(5.2907810314839, $result[0]['result']); + $this->assertEqualsWithDelta(13.641592653589793, $result[0]['result'], 0.000001); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php index 06b7ffc0..a75219e6 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php @@ -26,6 +26,6 @@ public function test_radians_with_entity_property(): void { $dql = 'SELECT RADIANS(n.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(0.1832595714594046, $result[0]['result']); + $this->assertEqualsWithDelta(0.1832595714594046, $result[0]['result'], 0.000001); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php index ad3461c4..803d2731 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -27,7 +27,7 @@ public function test_random_plus_entity_property(): void { $dql = 'SELECT RANDOM() + n.decimal1 as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertGreaterThanOrEqual(11.0, $result[0]['result']); + $this->assertGreaterThanOrEqual(10.0, $result[0]['result']); $this->assertLessThanOrEqual(12.0, $result[0]['result']); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php index 7723d0ee..6946a8dc 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php @@ -21,7 +21,7 @@ public function test_sign_with_zero(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame('0.0', $result[0]['result']); + $this->assertSame('0', $result[0]['result']); } public function test_sign_with_column_value(): void From 8cfbb3e3808992db55ae406c22b40354f4f98c0a Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 00:34:17 +0100 Subject: [PATCH 4/9] no message --- .../ORM/Query/AST/Functions/DegreesTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/ExpTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/LnTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/LogTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/PiTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/PowerTest.php | 4 ++-- .../ORM/Query/AST/Functions/RadiansTest.php | 2 +- .../ORM/Query/AST/Functions/RandomTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/RoundTest.php | 14 +++++++------- .../Doctrine/ORM/Query/AST/Functions/SignTest.php | 2 +- .../ORM/Query/AST/Functions/WidthBucketTest.php | 3 +-- 11 files changed, 18 insertions(+), 19 deletions(-) diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php index f3200880..1cb9140f 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_degrees(): void { - $dql = 'SELECT DEGREES(3.141592653589793) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT DEGREES(3.141592653589793) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertEqualsWithDelta(180.0, $result[0]['result'], 0.0001); } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php index c00f5e73..95b24e10 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_exp(): void { - $dql = 'SELECT EXP(1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT EXP(1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertEqualsWithDelta(2.718281828459, $result[0]['result'], 0.0001); } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php index 9c517462..a21bed8d 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_ln(): void { - $dql = 'SELECT LN(2.718281828459) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT LN(2.718281828459) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertEqualsWithDelta(1.0, $result[0]['result'], 0.0001); } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php index 17c01eb1..2b9df36e 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_log(): void { - $dql = 'SELECT LOG(10, 100) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT LOG(10, 100) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertEqualsWithDelta(2.0, $result[0]['result'], 0.0001); } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php index e0a57d44..c917058d 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_pi(): void { - $dql = 'SELECT PI() as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT PI() as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertEqualsWithDelta(3.141592653589793, $result[0]['result'], 0.0001); } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php index 8e6b8729..40cffd26 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PowerTest.php @@ -35,7 +35,7 @@ public function test_power_with_fractional_exponent(): void public function test_power_with_negative_base(): void { - $dql = 'SELECT POWER(-2, 3) as result + $dql = 'SELECT POWER((-2), 3) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); @@ -44,7 +44,7 @@ public function test_power_with_negative_base(): void public function test_power_with_negative_exponent(): void { - $dql = 'SELECT POWER(2, -2) as result + $dql = 'SELECT POWER(2, (-2)) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php index a75219e6..39dda8f0 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_radians(): void { - $dql = 'SELECT RADIANS(180) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT RADIANS(180) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertEqualsWithDelta(3.141592653589793, $result[0]['result'], 0.0001); } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php index 803d2731..6dd15809 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_random(): void { - $dql = 'SELECT RANDOM() as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT RANDOM() as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertGreaterThanOrEqual(0.0, $result[0]['result']); $this->assertLessThanOrEqual(1.0, $result[0]['result']); diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php index 63c9418c..e3d05044 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php @@ -6,7 +6,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Round; -class RoundTest extends ArrayTestCase +class RoundTest extends NumericTestCase { protected function getStringFunctions(): array { @@ -16,7 +16,7 @@ protected function getStringFunctions(): array public function test_round_with_positive_number(): void { $dql = 'SELECT ROUND(:number) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, ['number' => 3.14159]); $this->assertSame(3.0, $result[0]['result']); @@ -25,7 +25,7 @@ public function test_round_with_positive_number(): void public function test_round_with_negative_number(): void { $dql = 'SELECT ROUND(:number) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, ['number' => -3.14159]); $this->assertSame(-3.0, $result[0]['result']); @@ -34,7 +34,7 @@ public function test_round_with_negative_number(): void public function test_round_with_precision(): void { $dql = 'SELECT ROUND(:number, :precision) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, [ 'number' => 3.14159, @@ -46,7 +46,7 @@ public function test_round_with_precision(): void public function test_round_with_negative_precision(): void { $dql = 'SELECT ROUND(:number, :precision) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, [ 'number' => 314.159, @@ -58,9 +58,9 @@ public function test_round_with_negative_precision(): void public function test_round_with_column_value(): void { $dql = 'SELECT ROUND(t.decimal1) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(300.0, $result[0]['result']); + $this->assertSame('11', $result[0]['result']); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php index 6946a8dc..b05653d3 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php @@ -21,7 +21,7 @@ public function test_sign_with_zero(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame('0', $result[0]['result']); + $this->assertSame(0.0, $result[0]['result']); } public function test_sign_with_column_value(): void diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php index 6bdcff90..4f74dc7c 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php @@ -17,7 +17,7 @@ protected function getStringFunctions(): array public function test_width_bucket(): void { - $dql = 'SELECT WIDTH_BUCKET(5.35, 0.024, 10.06, 5) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t WHERE t.id = 1'; + $dql = 'SELECT WIDTH_BUCKET(5.35, 0.024, 10.06, 5) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); $this->assertSame(3, $result[0]['result']); } @@ -26,7 +26,6 @@ public function test_width_bucket_with_entity_property(): void { $dql = 'SELECT WIDTH_BUCKET(n.decimal1, 0.0, 20.0, 4) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertIsInt($result[0]['result']); $this->assertSame(3, $result[0]['result']); } } From db751b8cf6963d23987237d97e457db53277ecdd Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 11:07:12 +0100 Subject: [PATCH 5/9] no message --- .../ORM/Query/AST/Functions/CbrtTest.php | 6 ++-- .../ORM/Query/AST/Functions/DegreesTest.php | 34 ++++++++++++++++++ .../ORM/Query/AST/Functions/ExpTest.php | 34 ++++++++++++++++++ .../ORM/Query/AST/Functions/LnTest.php | 34 ++++++++++++++++++ .../ORM/Query/AST/Functions/LogTest.php | 36 +++++++++++++++++++ .../ORM/Query/AST/Functions/PiTest.php | 34 ++++++++++++++++++ .../ORM/Query/AST/Functions/RadiansTest.php | 34 ++++++++++++++++++ .../ORM/Query/AST/Functions/RandomTest.php | 34 ++++++++++++++++++ .../ORM/Query/AST/Functions/SignTest.php | 6 ++-- .../Query/AST/Functions/WidthBucketTest.php | 34 ++++++++++++++++++ 10 files changed, 278 insertions(+), 8 deletions(-) create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php create mode 100644 tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php index 6e722303..a03d4b47 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CbrtTest.php @@ -19,18 +19,16 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ + 'SELECT CBRT(42) AS sclr_0 FROM ContainsDecimals c0_', 'SELECT CBRT(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT CBRT(c0_.decimal2) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT CBRT(c0_.decimal3) AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ + \sprintf('SELECT CBRT(42) FROM %s e', ContainsDecimals::class), \sprintf('SELECT CBRT(e.decimal1) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT CBRT(e.decimal2) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT CBRT(e.decimal3) FROM %s e', ContainsDecimals::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php new file mode 100644 index 00000000..3359d16b --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DegreesTest.php @@ -0,0 +1,34 @@ + Degrees::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT DEGREES(33) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT DEGREES(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT DEGREES(33) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT DEGREES(e.decimal1) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php new file mode 100644 index 00000000..a336485c --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ExpTest.php @@ -0,0 +1,34 @@ + Exp::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT EXP(11) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT EXP(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT EXP(11) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT EXP(e.decimal1) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php new file mode 100644 index 00000000..a2cad122 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LnTest.php @@ -0,0 +1,34 @@ + Ln::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT LN(12) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT LN(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT LN(12) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT LN(e.decimal1) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php new file mode 100644 index 00000000..0fdc3ab3 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LogTest.php @@ -0,0 +1,36 @@ + Log::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT LOG(8) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT LOG(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT LOG(10, c0_.decimal2) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT LOG(8) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT LOG(e.decimal1) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT LOG(10, e.decimal2) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php new file mode 100644 index 00000000..4156e473 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PiTest.php @@ -0,0 +1,34 @@ + Pi::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT PI() AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT PI() + c0_.decimal1 AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT PI() FROM %s e', ContainsDecimals::class), + \sprintf('SELECT PI() + e.decimal1 FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php new file mode 100644 index 00000000..cb7767a7 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php @@ -0,0 +1,34 @@ + Radians::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT RADIANS(22) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT RADIANS(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT RADIANS(22) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT RADIANS(e.decimal1) FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php new file mode 100644 index 00000000..7f2f65ba --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -0,0 +1,34 @@ + Random::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT RANDOM() AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT RANDOM() + c0_.decimal1 AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT RANDOM() FROM %s e', ContainsDecimals::class), + \sprintf('SELECT RANDOM() + e.decimal1 FROM %s e', ContainsDecimals::class), + ]; + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php index 33ae0606..0b130bc9 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php @@ -19,18 +19,16 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ + 'SELECT SIGN(44) AS sclr_0 FROM ContainsDecimals c0_', 'SELECT SIGN(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT SIGN(c0_.decimal2) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT SIGN(c0_.decimal3) AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ + \sprintf('SELECT SIGN(44) FROM %s e', ContainsDecimals::class), \sprintf('SELECT SIGN(e.decimal1) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT SIGN(e.decimal2) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT SIGN(e.decimal3) FROM %s e', ContainsDecimals::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php new file mode 100644 index 00000000..66b4c973 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php @@ -0,0 +1,34 @@ + WidthBucket::class, + ]; + } + + protected function getExpectedSqlStatements(): array + { + return [ + 'SELECT WIDTH_BUCKET(c0_.decimal1, 0.0, 20.0, 4) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT WIDTH_BUCKET(15, 0.0, 20.0, 4) AS sclr_0 FROM ContainsDecimals c0_', + ]; + } + + protected function getDqlStatements(): array + { + return [ + \sprintf('SELECT WIDTH_BUCKET(e.decimal1, 0.0, 20.0, 4) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT WIDTH_BUCKET(15, 0.0, 20.0, 4) FROM %s e', ContainsDecimals::class), + ]; + } +} From c9b09e75ab3be519caeb7345574295d7230c8a49 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 12:02:58 +0100 Subject: [PATCH 6/9] no message --- .../Doctrine/ORM/Query/AST/Functions/Log.php | 6 +++--- .../Doctrine/ORM/Query/AST/Functions/Power.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/Round.php | 5 +++++ .../Doctrine/ORM/Query/AST/Functions/Trunc.php | 5 +++++ .../Doctrine/ORM/Query/AST/Functions/WidthBucket.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/RoundTest.php | 10 +++++----- .../Doctrine/ORM/Query/AST/Functions/SignTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/TruncTest.php | 8 ++++---- 8 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php index 35beec37..67dcbd59 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Log.php @@ -19,12 +19,12 @@ protected function getFunctionName(): string return 'LOG'; } - protected function getMaxArgumentCount(): int + protected function getMinArgumentCount(): int { - return 2; + return 1; } - protected function getMinArgumentCount(): int + protected function getMaxArgumentCount(): int { return 2; } diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php index 9dbf9ea8..a0310637 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Power.php @@ -19,12 +19,12 @@ protected function getFunctionName(): string return 'POWER'; } - protected function getMaxArgumentCount(): int + protected function getMinArgumentCount(): int { return 2; } - protected function getMinArgumentCount(): int + protected function getMaxArgumentCount(): int { return 2; } diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Round.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Round.php index b6bf1765..147e3895 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Round.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Round.php @@ -19,6 +19,11 @@ protected function getFunctionName(): string return 'ROUND'; } + protected function getMinArgumentCount(): int + { + return 1; + } + protected function getMaxArgumentCount(): int { return 2; diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Trunc.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Trunc.php index 5c42834d..f9614e31 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Trunc.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Trunc.php @@ -19,6 +19,11 @@ protected function getFunctionName(): string return 'TRUNC'; } + protected function getMinArgumentCount(): int + { + return 1; + } + protected function getMaxArgumentCount(): int { return 2; diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php index 2ffabeed..97eeae0d 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucket.php @@ -21,12 +21,12 @@ protected function getFunctionName(): string return 'WIDTH_BUCKET'; } - protected function getMaxArgumentCount(): int + protected function getMinArgumentCount(): int { return 4; } - protected function getMinArgumentCount(): int + protected function getMaxArgumentCount(): int { return 4; } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php index e3d05044..d8304d47 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RoundTest.php @@ -19,7 +19,7 @@ public function test_round_with_positive_number(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, ['number' => 3.14159]); - $this->assertSame(3.0, $result[0]['result']); + $this->assertEquals(3, $result[0]['result']); } public function test_round_with_negative_number(): void @@ -28,7 +28,7 @@ public function test_round_with_negative_number(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql, ['number' => -3.14159]); - $this->assertSame(-3.0, $result[0]['result']); + $this->assertEquals(-3, $result[0]['result']); } public function test_round_with_precision(): void @@ -40,7 +40,7 @@ public function test_round_with_precision(): void 'number' => 3.14159, 'precision' => 2, ]); - $this->assertSame('3.14', $result[0]['result']); + $this->assertEquals(3.14, $result[0]['result']); } public function test_round_with_negative_precision(): void @@ -52,7 +52,7 @@ public function test_round_with_negative_precision(): void 'number' => 314.159, 'precision' => -2, ]); - $this->assertSame('300', $result[0]['result']); + $this->assertEquals(300, $result[0]['result']); } public function test_round_with_column_value(): void @@ -61,6 +61,6 @@ public function test_round_with_column_value(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame('11', $result[0]['result']); + $this->assertEquals(11, $result[0]['result']); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php index b05653d3..0381fe9e 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SignTest.php @@ -21,7 +21,7 @@ public function test_sign_with_zero(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame(0.0, $result[0]['result']); + $this->assertEquals(0, $result[0]['result']); } public function test_sign_with_column_value(): void @@ -30,6 +30,6 @@ public function test_sign_with_column_value(): void FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertSame('1', $result[0]['result']); + $this->assertEquals(1, $result[0]['result']); } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TruncTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TruncTest.php index 4d54974f..31b6f771 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TruncTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TruncTest.php @@ -19,18 +19,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ + 'SELECT TRUNC(55.000200) AS sclr_0 FROM ContainsDecimals c0_', 'SELECT TRUNC(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT TRUNC(c0_.decimal2, 0) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT TRUNC(c0_.decimal3, 1) AS sclr_0 FROM ContainsDecimals c0_', + 'SELECT TRUNC(c0_.decimal2, 1) AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ + \sprintf('SELECT TRUNC(55.000200) FROM %s e', ContainsDecimals::class), \sprintf('SELECT TRUNC(e.decimal1) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT TRUNC(e.decimal2, 0) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT TRUNC(e.decimal3, 1) FROM %s e', ContainsDecimals::class), + \sprintf('SELECT TRUNC(e.decimal2, 1) FROM %s e', ContainsDecimals::class), ]; } } From 8ddd8737dbd5c5dbe236d26eeb711f163753b724 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 12:16:47 +0100 Subject: [PATCH 7/9] no message --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fdf38b33..27a2bd87 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ This package provides comprehensive Doctrine support for PostgreSQL features: - IP addresses (`inet`, `inet[]`) - Network CIDR notation (`cidr`, `cidr[]`) - MAC addresses (`macaddr`, `macaddr[]`) +- **Geometric Types** + - Point (`point`, `point[]`) ### PostgreSQL Operators - **Array Operations** @@ -78,9 +80,7 @@ This package provides comprehensive Doctrine support for PostgreSQL features: - Aggregation with ordering and distinct (`array_agg`, `json_agg`, `jsonb_agg`) - Special aggregates (`any_value`, `xmlagg`) - **Mathematical/Arithmetic Functions** - - CBRT, CEIL, DEGREES, EXP, FLOOR, LN, LOG, PI, POWER, RADIANS, RANDOM, ROUND, SIGN, TRUNC, WIDTH_BUCKET - **Range Functions** - - DATERANGE, INT4RANGE, INT8RANGE, NUMRANGE, TSRANGE, TSTZRANGE Full documentation: - [Available Types](docs/AVAILABLE-TYPES.md) From 9cb2fc1a8873528eeb002a4707199e578e8b9dcf Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 12:21:15 +0100 Subject: [PATCH 8/9] no message --- .../ORM/Query/AST/Functions/CeilTest.php | 38 +++++++++++++++++++ .../ORM/Query/AST/Functions/FloorTest.php | 38 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php new file mode 100644 index 00000000..f749f74e --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php @@ -0,0 +1,38 @@ + Ceil::class, + ]; + } + + public function test_ceil_with_positive_decimal(): void + { + $dql = 'SELECT CEIL(:number) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['number' => 10.5]); + $this->assertEquals(11, $result[0]['result']); + } + + public function test_ceil_with_negative_decimal(): void + { + $dql = 'SELECT CEIL(:number) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['number' => -10.5]); + $this->assertEquals(-10, $result[0]['result']); + } + + public function test_ceil_with_column_value(): void + { + $dql = 'SELECT CEIL(t.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEquals(11, $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php new file mode 100644 index 00000000..48c3cc59 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php @@ -0,0 +1,38 @@ + Floor::class, + ]; + } + + public function test_floor_with_positive_decimal(): void + { + $dql = 'SELECT FLOOR(:number) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['number' => 10.5]); + $this->assertEquals(10, $result[0]['result']); + } + + public function test_floor_with_negative_decimal(): void + { + $dql = 'SELECT FLOOR(:number) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['number' => -10.5]); + $this->assertEquals(-11, $result[0]['result']); + } + + public function test_floor_with_column_value(): void + { + $dql = 'SELECT FLOOR(t.decimal1) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertEquals(10, $result[0]['result']); + } +} From 69fa3bb159131abaeb49bfe77d7f651ee9a72617 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 23 May 2025 12:25:22 +0100 Subject: [PATCH 9/9] no message --- .../Doctrine/ORM/Query/AST/Functions/RandomTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php index 6dd15809..c1093c95 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -27,7 +27,7 @@ public function test_random_plus_entity_property(): void { $dql = 'SELECT RANDOM() + n.decimal1 as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics n WHERE n.id = 1'; $result = $this->executeDqlQuery($dql); - $this->assertGreaterThanOrEqual(10.0, $result[0]['result']); - $this->assertLessThanOrEqual(12.0, $result[0]['result']); + $this->assertGreaterThanOrEqual(10.5, $result[0]['result']); + $this->assertLessThanOrEqual(11.5, $result[0]['result']); } }