Skip to content

Commit cc4749c

Browse files
feat: add support for range types (#396)
1 parent 7dad712 commit cc4749c

Some content is hidden

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

46 files changed

+4046
-1
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Enhances Doctrine with PostgreSQL-specific features and functions. Supports Post
1313
// Register types with Doctrine
1414
Type::addType('jsonb', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Jsonb");
1515
Type::addType('text[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\TextArray");
16+
Type::addType('numrange', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\NumRange");
1617

1718
// Use in your Doctrine entities
1819
#[ORM\Column(type: 'jsonb')]
@@ -21,6 +22,9 @@ private array $data;
2122
#[ORM\Column(type: 'text[]')]
2223
private array $tags;
2324

25+
#[ORM\Column(type: 'numrange')]
26+
private NumericRange $priceRange;
27+
2428
// Use in DQL
2529
$query = $em->createQuery('
2630
SELECT e
@@ -51,6 +55,9 @@ This package provides comprehensive Doctrine support for PostgreSQL features:
5155
- MAC addresses (`macaddr`, `macaddr[]`)
5256
- **Geometric Types**
5357
- Point (`point`, `point[]`)
58+
- **Range Types**
59+
- Date and time ranges (`daterange`, `tsrange`, `tstzrange`)
60+
- Numeric ranges (`numrange`, `int4range`, `int8range`)
5461

5562
### PostgreSQL Operators
5663
- **Array Operations**
@@ -62,6 +69,9 @@ This package provides comprehensive Doctrine support for PostgreSQL features:
6269
- Field access (`->`, `->>`)
6370
- Path operations (`#>`, `#>>`)
6471
- JSON containment and existence operators
72+
- **Range Operations**
73+
- Containment checks (in PHP value objects and for DQL queries with `@>` and `<@`)
74+
- Overlaps (`&&`)
6575

6676
### Functions
6777
- **Text Search**
@@ -85,6 +95,7 @@ This package provides comprehensive Doctrine support for PostgreSQL features:
8595

8696
Full documentation:
8797
- [Available Types](docs/AVAILABLE-TYPES.md)
98+
- [Value Objects for Range Types](docs/RANGE-TYPES.md)
8899
- [Available Functions and Operators](docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md)
89100
- [Common Use Cases and Examples](docs/USE-CASES-AND-EXAMPLES.md)
90101

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
parameters:
2+
ignoreErrors:
3+
-
4+
message: '#^Method MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\:\:empty\(\) should return static\(MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\<R of DateTimeInterface\|float\|int\>\) but returns static\(MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\<DateTimeInterface\|float\|int\>\)\.$#'
5+
identifier: return.type
6+
count: 1
7+
path: ../../../src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Range.php
8+
9+
-
10+
message: '#^Method MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\:\:fromString\(\) should return static\(MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\<R of DateTimeInterface\|float\|int\>\) but returns static\(MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\<DateTimeInterface\|float\|int\>\)\.$#'
11+
identifier: return.type
12+
count: 2
13+
path: ../../../src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Range.php
14+
15+
-
16+
message: '#^Method MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\:\:infinite\(\) should return static\(MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\<R of DateTimeInterface\|float\|int\>\) but returns static\(MartinGeorgiev\\Doctrine\\DBAL\\Types\\ValueObject\\Range\<DateTimeInterface\|float\|int\>\)\.$#'
17+
identifier: return.type
18+
count: 1
19+
path: ../../../src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Range.php
20+
21+
-
22+
message: '#^Unsafe usage of new static\(\)\.$#'
23+
identifier: new.static
24+
count: 4
25+
path: ../../../src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Range.php
26+
27+
# Temporary suppression for PHPStan's lack of covariant generics support
28+
# Remove when PHPStan supports covariance (https://github.com/phpstan/phpstan/issues/7427)
29+
-
30+
message: '#.*Template type R on class.*Range is not covariant#'
31+
path: ../../../tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/
32+
33+
-
34+
message: '#.*should return.*Range<DateTimeInterface\|float\|int>.*but returns.*Range#'
35+
path: ../../../tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/
36+
37+
-
38+
message: '#.*Generator expects value type.*Range<DateTimeInterface\|float\|int>.*given#'
39+
path: ../../../tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/
40+
41+
-
42+
message: '#.*extends generic class.*but does not specify its types#'
43+
path: ../../../tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/
44+
45+
-
46+
message: '#.*should be compatible with return type#'
47+
path: ../../../tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/

ci/phpstan/config.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ includes:
66
- ./baselines/deprecated-methods.neon
77
- ./baselines/lexer-variations.neon
88
- ./baselines/phpstan-identifiers.neon
9+
- ./baselines/range-baseline.neon
910
- ./baselines/type-mismatches.neon
1011

1112
parameters:

docs/AVAILABLE-TYPES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,9 @@
1919
| macaddr[] | _macaddr | `MartinGeorgiev\Doctrine\DBAL\Types\MacaddrArray` |
2020
| point | point | `MartinGeorgiev\Doctrine\DBAL\Types\Point` |
2121
| point[] | _point | `MartinGeorgiev\Doctrine\DBAL\Types\PointArray` |
22+
| daterange | daterange | `MartinGeorgiev\Doctrine\DBAL\Types\DateRange` |
23+
| int4range | int4range | `MartinGeorgiev\Doctrine\DBAL\Types\Int4Range` |
24+
| int8range | int8range | `MartinGeorgiev\Doctrine\DBAL\Types\Int8Range` |
25+
| numrange | numrange | `MartinGeorgiev\Doctrine\DBAL\Types\NumRange` |
26+
| tsrange | tsrange | `MartinGeorgiev\Doctrine\DBAL\Types\TsRange` |
27+
| tstzrange | tstzrange | `MartinGeorgiev\Doctrine\DBAL\Types\TstzRange` |

docs/INTEGRATING-WITH-DOCTRINE.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ Type::addType('macaddr[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\MacaddrArray"
3131

3232
Type::addType('point', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Point");
3333
Type::addType('point[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\PointArray");
34+
35+
Type::addType('daterange', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\DateRange");
36+
Type::addType('int4range', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Int4Range");
37+
Type::addType('int8range', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Int8Range");
38+
Type::addType('numrange', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\NumRange");
39+
Type::addType('tsrange', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\TsRange");
40+
Type::addType('tstzrange', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\TstzRange");
3441
```
3542

3643

@@ -237,6 +244,13 @@ $platform->registerDoctrineTypeMapping('_macaddr','macaddr[]');
237244
$platform->registerDoctrineTypeMapping('point','point');
238245
$platform->registerDoctrineTypeMapping('point[]','point[]');
239246
$platform->registerDoctrineTypeMapping('_point','point[]');
247+
248+
$platform->registerDoctrineTypeMapping('daterange','daterange');
249+
$platform->registerDoctrineTypeMapping('int4range','int4range');
250+
$platform->registerDoctrineTypeMapping('int8range','int8range');
251+
$platform->registerDoctrineTypeMapping('numrange','numrange');
252+
$platform->registerDoctrineTypeMapping('tsrange','tsrange');
253+
$platform->registerDoctrineTypeMapping('tstzrange','tstzrange');
240254
...
241255

242256
```

0 commit comments

Comments
 (0)