Skip to content

Commit 7a047e8

Browse files
feat: add support for formatting functions to_char, to_date, to_number, to_timestamp (#386)
Co-authored-by: Martin Georgiev <martin-georgiev@users.noreply.github.com>
1 parent 5541f7f commit 7a047e8

File tree

19 files changed

+599
-3
lines changed

19 files changed

+599
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ This package provides comprehensive Doctrine support for PostgreSQL features:
8181
- Special aggregates (`any_value`, `xmlagg`)
8282
- **Mathematical/Arithmetic Functions**
8383
- **Range Functions**
84+
- **Data Type Formatting Functions**
8485

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

docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,12 @@
107107
| starts_with | STARTS_WITH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StartsWith` |
108108
| string_agg | STRING_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StringAgg` |
109109
| string_to_array | STRING_TO_ARRAY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StringToArray` |
110+
| to_char | TO_CHAR | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToChar` |
111+
| to_date | TO_DATE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToDate` |
110112
| to_json | TO_JSON | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToJson` |
111113
| to_jsonb | TO_JSONB | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToJsonb` |
114+
| to_number | TO_NUMBER | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToNumber` |
115+
| to_timestamp | TO_TIMESTAMP | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToTimestamp` |
112116
| to_tsquery | TO_TSQUERY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToTsquery` |
113117
| to_tsvector | TO_TSVECTOR | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToTsvector` |
114118
| trunc | TRUNC | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Trunc` |

docs/INTEGRATING-WITH-DOCTRINE.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,12 @@ $configuration->addCustomStringFunction('JSONB_OBJECT_AGG', MartinGeorgiev\Doctr
193193
$configuration->addCustomStringFunction('STRING_AGG', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StringAgg::class);
194194
$configuration->addCustomStringFunction('XML_AGG', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\XmlAgg::class);
195195

196+
# data type formatting functions
197+
$configuration->addCustomStringFunction('TO_CHAR', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToChar::class);
198+
$configuration->addCustomStringFunction('TO_DATE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToDate::class);
199+
$configuration->addCustomStringFunction('TO_NUMBER', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToNumber::class);
200+
$configuration->addCustomStringFunction('TO_TIMESTAMP', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToTimestamp::class);
201+
196202
$em = EntityManager::create($dbParams, $configuration);
197203
```
198204

docs/INTEGRATING-WITH-LARAVEL.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,12 @@ return [
247247
'JSONB_OBJECT_AGG' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectAgg::class,
248248
'STRING_AGG' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StringAgg::class,
249249
'XML_AGG' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\XmlAgg::class,
250+
251+
# data type formatting functions
252+
'TO_CHAR' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToChar::class,
253+
'TO_DATE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToDate::class,
254+
'TO_NUMBER' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToNumber::class,
255+
'TO_TIMESTAMP' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToTimestamp::class,
250256
],
251257

252258
...

docs/INTEGRATING-WITH-SYMFONY.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,10 @@ doctrine:
241241
JSONB_OBJECT_AGG: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectAgg
242242
STRING_AGG: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StringAgg
243243
XML_AGG: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\XmlAgg
244+
245+
# data type formatting functions
246+
TO_CHAR: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToChar
247+
TO_DATE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToDate
248+
TO_NUMBER: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToNumber
249+
TO_TIMESTAMP: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToTimestamp
244250
```

fixtures/MartinGeorgiev/Doctrine/Entity/ContainsDates.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@ class ContainsDates extends Entity
2727

2828
#[ORM\Column(type: Types::DATETIMETZ_IMMUTABLE)]
2929
public \DateTimeImmutable $datetimetz2;
30+
31+
#[ORM\Column(type: Types::DATEINTERVAL)]
32+
public \DateTimeImmutable $dateinterval1;
3033
}
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 to_char().
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-formatting.html
11+
* @since 3.3.0
12+
*/
13+
class ToChar extends BaseFunction
14+
{
15+
protected function customizeFunction(): void
16+
{
17+
$this->setFunctionPrototype('to_char(%s, %s)');
18+
$this->addNodeMapping('ArithmeticFactor');
19+
$this->addNodeMapping('StringPrimary');
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 to_date().
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-formatting.html
11+
* @since 3.3.0
12+
*/
13+
class ToDate extends BaseFunction
14+
{
15+
protected function customizeFunction(): void
16+
{
17+
$this->setFunctionPrototype('to_date(%s, %s)');
18+
$this->addNodeMapping('StringPrimary');
19+
$this->addNodeMapping('StringPrimary');
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 to_number().
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-formatting.html
11+
* @since 3.3.0
12+
*/
13+
class ToNumber extends BaseFunction
14+
{
15+
protected function customizeFunction(): void
16+
{
17+
$this->setFunctionPrototype('to_number(%s, %s)');
18+
$this->addNodeMapping('StringPrimary');
19+
$this->addNodeMapping('StringPrimary');
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 to_timestamp().
9+
*
10+
* @see https://www.postgresql.org/docs/17/functions-formatting.html
11+
* @since 3.3.0
12+
*/
13+
class ToTimestamp extends BaseFunction
14+
{
15+
protected function customizeFunction(): void
16+
{
17+
$this->setFunctionPrototype('to_timestamp(%s, %s)');
18+
$this->addNodeMapping('StringPrimary');
19+
$this->addNodeMapping('StringPrimary');
20+
}
21+
}

0 commit comments

Comments
 (0)