diff --git a/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md b/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md index 535e0be5..3ff8469b 100644 --- a/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md +++ b/docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md @@ -45,6 +45,9 @@ | array_to_string | ARRAY_TO_STRING | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToString` | | cardinality | ARRAY_CARDINALITY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cardinality` | | cast | CAST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cast` | +| date_add | DATE_ADD | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateAdd` | +| date_bin | DATE_BIN | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateBin` | +| date_subtract | DATE_SUBTRACT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateSubtract` | | daterange | DATERANGE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Daterange` | | extract | DATE_EXTRACT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateExtract` | | greatest | GREATEST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Greatest` | @@ -75,6 +78,11 @@ | jsonb_insert | JSONB_INSERT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbInsert` | | jsonb_object_agg | JSONB_OBJECT_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectAgg` | | jsonb_object_keys | JSONB_OBJECT_KEYS |`MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectKeys` | +| jsonb_path_exists | JSONB_PATH_EXISTS | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathExists` | +| jsonb_path_match | JSONB_PATH_MATCH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathMatch` | +| jsonb_path_query | JSONB_PATH_QUERY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQuery` | +| jsonb_path_query_array | JSONB_PATH_QUERY_ARRAY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryArray` | +| jsonb_path_query_first | JSONB_PATH_QUERY_FIRST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryFirst` | | jsonb_pretty | JSONB_PRETTY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPretty` | | jsonb_set | JSONB_SET | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSet` | | jsonb_set_lax | JSONB_SET_LAX | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSetLax` | @@ -82,12 +90,12 @@ | least | LEAST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Least` | | numrange | NUMRANGE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Numrange` | | overlaps | DATE_OVERLAPS | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps` | -| regexp_like (with flags) | FLAGGED_REGEXP_LIKE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpLike` | -| regexp_like (with no flags) | REGEXP_LIKE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike` | -| regexp_match (with flags) | FLAGGED_REGEXP_MATCH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpMatch` | -| regexp_match (with no flags) | REGEXP_MATCH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch` | -| regexp_replace (with flags) | FLAGGED_REGEXP_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpReplace` | -| regexp_replace (with no flags) | REGEXP_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace` | +| regexp_count | REGEXP_COUNT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpCount` | +| regexp_instr | REGEXP_INSTR | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpInstr` | +| regexp_like | REGEXP_LIKE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike` | +| regexp_match | REGEXP_MATCH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch` | +| regexp_replace | REGEXP_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace` | +| regexp_substr | REGEXP_SUBSTR | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpSubstr` | | row | ROW | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row` | | row_to_json | ROW_TO_JSON | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RowToJson` | | split_part | SPLIT_PART | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\SplitPart` | diff --git a/docs/INTEGRATING-WITH-DOCTRINE.md b/docs/INTEGRATING-WITH-DOCTRINE.md index bbbf8f9e..93d7efad 100644 --- a/docs/INTEGRATING-WITH-DOCTRINE.md +++ b/docs/INTEGRATING-WITH-DOCTRINE.md @@ -14,9 +14,20 @@ Type::addType('bool[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\BooleanArray"); Type::addType('smallint[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\SmallIntArray"); Type::addType('integer[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\IntegerArray"); Type::addType('bigint[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\BigIntArray"); + +Type::addType('double precision[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\DoublePrecisionArray"); +Type::addType('real[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\RealArray"); + Type::addType('text[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\TextArray"); Type::addType('jsonb', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Jsonb"); Type::addType('jsonb[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\JsonbArray"); + +Type::addType('cidr', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Cidr"); +Type::addType('cidr[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\CidrArray"); +Type::addType('inet', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Inet"); +Type::addType('inet[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\InetArray"); +Type::addType('macaddr', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Macaddr"); +Type::addType('macaddr[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\MacaddrArray"); ``` @@ -90,7 +101,6 @@ $configuration->addCustomStringFunction('JSON_VALUE', MartinGeorgiev\Doctrine\OR $configuration->addCustomStringFunction('TO_JSON', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ToJson::class); $configuration->addCustomStringFunction('ROW_TO_JSON', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RowToJson::class); - # jsonb specific functions $configuration->addCustomStringFunction('JSONB_ARRAY_ELEMENTS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbArrayElements::class); $configuration->addCustomStringFunction('JSONB_ARRAY_ELEMENTS_TEXT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbArrayElementsText::class); @@ -101,6 +111,11 @@ $configuration->addCustomStringFunction('JSONB_EACH_TEXT', MartinGeorgiev\Doctri $configuration->addCustomStringFunction('JSONB_EXISTS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbExists::class); $configuration->addCustomStringFunction('JSONB_INSERT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbInsert::class); $configuration->addCustomStringFunction('JSONB_OBJECT_KEYS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectKeys::class); +$configuration->addCustomStringFunction('JSONB_PATH_EXISTS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathExists::class); +$configuration->addCustomStringFunction('JSONB_PATH_MATCH', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathMatch::class); +$configuration->addCustomStringFunction('JSONB_PATH_QUERY', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQuery::class); +$configuration->addCustomStringFunction('JSONB_PATH_QUERY_ARRAY', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryArray::class); +$configuration->addCustomStringFunction('JSONB_PATH_QUERY_FIRST', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryFirst::class); $configuration->addCustomStringFunction('JSONB_PRETTY', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPretty::class); $configuration->addCustomStringFunction('JSONB_SET', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSet::class); $configuration->addCustomStringFunction('JSONB_SET_LAX', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSetLax::class); @@ -113,8 +128,11 @@ $configuration->addCustomStringFunction('TO_TSVECTOR', MartinGeorgiev\Doctrine\O $configuration->addCustomStringFunction('TSMATCH', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tsmatch::class); # date specific functions -$configuration->addCustomStringFunction('DATE_OVERLAPS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps::class); +$configuration->addCustomStringFunction('DATE_ADD', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateAdd::class); +$configuration->addCustomStringFunction('DATE_BIN', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateBin::class); $configuration->addCustomStringFunction('DATE_EXTRACT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateExtract::class); +$configuration->addCustomStringFunction('DATE_OVERLAPS', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps::class); +$configuration->addCustomStringFunction('DATE_SUBTRACT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateSubtract::class); # range functions $configuration->addCustomStringFunction('DATERANGE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Daterange::class); @@ -134,12 +152,12 @@ $configuration->addCustomStringFunction('REGEXP', MartinGeorgiev\Doctrine\ORM\Qu $configuration->addCustomStringFunction('IREGEXP', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\IRegexp::class); $configuration->addCustomStringFunction('NOT_REGEXP', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\NotRegexp::class); $configuration->addCustomStringFunction('NOT_IREGEXP', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\NotIRegexp::class); -$configuration->addCustomStringFunction('FLAGGED_REGEXP_LIKE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike::class); $configuration->addCustomStringFunction('REGEXP_LIKE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpLike::class); -$configuration->addCustomStringFunction('FLAGGED_REGEXP_MATCH', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpMatch::class); +$configuration->addCustomStringFunction('REGEXP_COUNT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpCount::class); +$configuration->addCustomStringFunction('REGEXP_INSTR', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpInstr::class); +$configuration->addCustomStringFunction('REGEXP_SUBSTR', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpSubstr::class); $configuration->addCustomStringFunction('REGEXP_MATCH', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch::class); $configuration->addCustomStringFunction('STRCONCAT', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StrConcat::class); -$configuration->addCustomStringFunction('FLAGGED_REGEXP_REPLACE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpReplace::class); $configuration->addCustomStringFunction('REGEXP_REPLACE', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace::class); $configuration->addCustomStringFunction('ROW', MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row::class); @@ -159,15 +177,33 @@ $em = EntityManager::create($dbParams, $configuration); ```php $platform = $em->getConnection()->getDatabasePlatform(); + $platform->registerDoctrineTypeMapping('bool[]','bool[]'); $platform->registerDoctrineTypeMapping('_bool','bool[]'); +$platform->registerDoctrineTypeMapping('smallint[]','smallint[]'); +$platform->registerDoctrineTypeMapping('_int2','smallint[]'); $platform->registerDoctrineTypeMapping('integer[]','integer[]'); $platform->registerDoctrineTypeMapping('_int4','integer[]'); $platform->registerDoctrineTypeMapping('bigint[]','bigint[]'); $platform->registerDoctrineTypeMapping('_int8','bigint[]'); + +$platform->registerDoctrineTypeMapping('double precision[]','double precision[]'); +$platform->registerDoctrineTypeMapping('_float8','double precision[]'); +$platform->registerDoctrineTypeMapping('real[]','real[]'); +$platform->registerDoctrineTypeMapping('_float4','real[]'); + $platform->registerDoctrineTypeMapping('text[]','text[]'); $platform->registerDoctrineTypeMapping('_text','text[]'); $platform->registerDoctrineTypeMapping('jsonb','jsonb'); +$platform->registerDoctrineTypeMapping('jsonb[]','jsonb[]'); +$platform->registerDoctrineTypeMapping('_jsonb','jsonb[]'); + +$platform->registerDoctrineTypeMapping('cidr[]','cidr[]'); +$platform->registerDoctrineTypeMapping('_cidr','cidr[]'); +$platform->registerDoctrineTypeMapping('inet[]','inet[]'); +$platform->registerDoctrineTypeMapping('_inet','inet[]'); +$platform->registerDoctrineTypeMapping('macaddr[]','macaddr[]'); +$platform->registerDoctrineTypeMapping('_macaddr','macaddr[]'); ... ``` diff --git a/docs/INTEGRATING-WITH-LARAVEL.md b/docs/INTEGRATING-WITH-LARAVEL.md index cfc0789c..077acca6 100644 --- a/docs/INTEGRATING-WITH-LARAVEL.md +++ b/docs/INTEGRATING-WITH-LARAVEL.md @@ -19,17 +19,33 @@ return [ 'type_mappings' => [ '_bool' => 'bool[]', 'bool[]' => 'bool[]', - '_int2' => 'smallint[]', 'smallint[]' => 'smallint[]', - '_int4' => 'integer[]', + '_int2' => 'smallint[]', 'integer[]' => 'integer[]', - '_int8' => 'bigint', + '_int4' => 'integer[]', 'bigint[]' => 'bigint[]', + '_int8' => 'bigint', + + 'double precision[]' => 'double precision[]', + '_float8' => 'double precision[]', + 'real[]' => 'real[]', + '_float4' => 'real', + '_text' => 'text[]', 'text[]' => 'text[]', 'jsonb' => 'jsonb', '_jsonb' => 'jsonb[]', 'jsonb[]' => 'jsonb[]', + + 'cidr' => 'cidr', + 'cidr[]' => 'cidr[]', + '_cidr' => 'cidr[]', + 'inet' => 'inet', + 'inet[]' => 'inet[]', + '_inet' => 'inet[]', + 'macaddr' => 'macaddr', + 'macaddr[]' => 'macaddr[]', + '_macaddr' => 'macaddr[]', ], ], ], @@ -50,9 +66,20 @@ return [ 'bigint[]' => MartinGeorgiev\Doctrine\DBAL\Types\BigIntArray::class, 'integer[]' => MartinGeorgiev\Doctrine\DBAL\Types\IntegerArray::class, 'smallint[]' => MartinGeorgiev\Doctrine\DBAL\Types\SmallIntArray::class, + + 'double precision[]' => MartinGeorgiev\Doctrine\DBAL\Types\DoublePrecisionArray::class, + 'real[]' => MartinGeorgiev\Doctrine\DBAL\Types\RealArray::class, + 'text[]' => MartinGeorgiev\Doctrine\DBAL\Types\TextArray::class, 'jsonb' => MartinGeorgiev\Doctrine\DBAL\Types\Jsonb::class, 'jsonb[]' => MartinGeorgiev\Doctrine\DBAL\Types\JsonbArray::class, + + 'cnet' => MartinGeorgiev\Doctrine\DBAL\Types\Cnet::class, + 'cnet[]' => MartinGeorgiev\Doctrine\DBAL\Types\CnetArray::class, + 'inet' => MartinGeorgiev\Doctrine\DBAL\Types\Inet::class, + 'inet[]' => MartinGeorgiev\Doctrine\DBAL\Types\InetArray::class, + 'macaddr' => MartinGeorgiev\Doctrine\DBAL\Types\Macaddr::class, + 'macaddr[]' => MartinGeorgiev\Doctrine\DBAL\Types\MacaddrArray::class, ], ]; ``` @@ -135,6 +162,11 @@ return [ 'JSONB_EXISTS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbExists::class, 'JSONB_INSERT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbInsert::class, 'JSONB_OBJECT_KEYS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectKeys::class, + 'JSONB_PATH_EXISTS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathExists::class, + 'JSONB_PATH_MATCH' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathMatch::class, + 'JSONB_PATH_QUERY' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQuery::class, + 'JSONB_PATH_QUERY_ARRAY' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryArray::class, + 'JSONB_PATH_QUERY_FIRST' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryFirst::class, 'JSONB_PRETTY' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPretty::class, 'JSONB_SET' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSet::class, 'JSONB_SET_LAX' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSetLax::class, @@ -147,8 +179,11 @@ return [ 'TSMATCH' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tsmatch::class, # date specific functions - 'DATE_OVERLAPS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps::class, + 'DATE_ADD' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateAdd::class, + 'DATE_BIN' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateBin::class, 'DATE_EXTRACT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateExtract::class, + 'DATE_OVERLAPS' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps::class, + 'DATE_SUBTRACT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateSubtract::class, # range functions 'DATERANGE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Daterange::class, @@ -168,13 +203,13 @@ return [ 'IREGEXP' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\IRegexp::class, 'NOT_REGEXP' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\NotRegexp::class, 'NOT_IREGEXP' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\NotIRegexp::class, - 'FLAGGED_REGEXP_LIKE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpLike::class, + 'REGEXP_COUNT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpCount::class, + 'REGEXP_INSTR' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpInstr::class, 'REGEXP_LIKE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike::class, - 'FLAGGED_REGEXP_MATCH' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpMatch::class, 'REGEXP_MATCH' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch::class, - 'STRCONCAT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StrConcat::class, // the `||` operator - 'FLAGGED_REGEXP_REPLACE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpReplace::class, 'REGEXP_REPLACE' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace::class, + 'REGEXP_SUBSTR' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpSubstr::class, + 'STRCONCAT' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StrConcat::class, // the `||` operator 'ROW' => MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row::class, # aggregation functions @@ -233,6 +268,12 @@ class DoctrineEventSubscriber implements Subscriber if (!Type::hasType('smallint[]')) { Type::addType('smallint[]', \MartinGeorgiev\Doctrine\DBAL\Types\SmallIntArray::class); } + if (!Type::hasType('double precision[]')) { + Type::addType('double precision[]', \MartinGeorgiev\Doctrine\DBAL\Types\DoublePrecisionArray::class); + } + if (!Type::hasType('real[]')) { + Type::addType('real[]', \MartinGeorgiev\Doctrine\DBAL\Types\RealArray::class); + } if (!Type::hasType('text[]')) { Type::addType('text[]', \MartinGeorgiev\Doctrine\DBAL\Types\TextArray::class); } @@ -242,6 +283,24 @@ class DoctrineEventSubscriber implements Subscriber if (!Type::hasType('jsonb[]')) { Type::addType('jsonb[]', \MartinGeorgiev\Doctrine\DBAL\Types\JsonbArray::class); } + if (!Type::hasType('cidr')) { + Type::addType('cidr', \MartinGeorgiev\Doctrine\DBAL\Types\Cidr::class); + } + if (!Type::hasType('cidr[]')) { + Type::addType('cidr[]', \MartinGeorgiev\Doctrine\DBAL\Types\CidrArray::class); + } + if (!Type::hasType('inet')) { + Type::addType('inet', \MartinGeorgiev\Doctrine\DBAL\Types\Inet::class); + } + if (!Type::hasType('inet[]')) { + Type::addType('inet[]', \MartinGeorgiev\Doctrine\DBAL\Types\InetArray::class); + } + if (!Type::hasType('macaddr')) { + Type::addType('macaddr', \MartinGeorgiev\Doctrine\DBAL\Types\Macaddr::class); + } + if (!Type::hasType('macaddr[]')) { + Type::addType('macaddr[]', \MartinGeorgiev\Doctrine\DBAL\Types\MacaddrArray::class); + } } } ``` diff --git a/docs/INTEGRATING-WITH-SYMFONY.md b/docs/INTEGRATING-WITH-SYMFONY.md index a4a6eb2c..576eceda 100644 --- a/docs/INTEGRATING-WITH-SYMFONY.md +++ b/docs/INTEGRATING-WITH-SYMFONY.md @@ -14,9 +14,20 @@ doctrine: smallint[]: MartinGeorgiev\Doctrine\DBAL\Types\SmallIntArray integer[]: MartinGeorgiev\Doctrine\DBAL\Types\IntegerArray bigint[]: MartinGeorgiev\Doctrine\DBAL\Types\BigIntArray + + double precision[]: MartinGeorgiev\Doctrine\DBAL\Types\DoublePrecisionArray + real[]: MartinGeorgiev\Doctrine\DBAL\Types\RealArray + text[]: MartinGeorgiev\Doctrine\DBAL\Types\TextArray jsonb: MartinGeorgiev\Doctrine\DBAL\Types\Jsonb jsonb[]: MartinGeorgiev\Doctrine\DBAL\Types\JsonbArray + + cidr: MartinGeorgiev\Doctrine\DBAL\Types\Cidr + cidr[]: MartinGeorgiev\Doctrine\DBAL\Types\CidrArray + inet: MartinGeorgiev\Doctrine\DBAL\Types\Inet + inet[]: MartinGeorgiev\Doctrine\DBAL\Types\InetArray + macaddr: MartinGeorgiev\Doctrine\DBAL\Types\Macaddr + macaddr[]: MartinGeorgiev\Doctrine\DBAL\Types\MacaddrArray ``` @@ -41,11 +52,27 @@ doctrine: _int4: integer[] bigint[]: bigint[] _int8: bigint[] + + double precision[]: double precision[] + _float8: double precision[] + real[]: real[] + _float4: real[] + text[]: text[] _text: text[] jsonb: jsonb jsonb[]: jsonb[] _jsonb: jsonb[] + + cidr: cidr + cidr[]: cidr[] + _cidr: cidr[] + inet: inet + inet[]: inet[] + _inet: inet[] + macaddr: macaddr + macaddr[]: macaddr[] + _macaddr: macaddr[] ``` @@ -64,7 +91,7 @@ doctrine: # alternative implementation of ALL() and ANY() where subquery is not required, useful for arrays ALL_OF: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\All ANY_OF: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Any - + # operators for working with array and json(b) data GREATEST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Greatest LEAST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Least @@ -76,7 +103,7 @@ doctrine: ANY_ON_RIGHT_EXISTS_ON_LEFT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyOnTheRightExistsOnTheLeft # ?| RETURNS_VALUE_FOR_JSON_VALUE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ReturnsValueForJsonValue # @? DELETE_AT_PATH: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DeleteAtPath # #- - + # array and string specific functions IN_ARRAY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\InArray ANY_VALUE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue @@ -129,6 +156,11 @@ doctrine: JSONB_EXISTS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbExists JSONB_INSERT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbInsert JSONB_OBJECT_KEYS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbObjectKeys + JSONB_PATH_EXISTS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathExists + JSONB_PATH_MATCH: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathMatch + JSONB_PATH_QUERY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQuery + JSONB_PATH_QUERY_ARRAY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryArray + JSONB_PATH_QUERY_FIRST: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryFirst JSONB_PRETTY: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPretty JSONB_SET: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSet JSONB_SET_LAX: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSetLax @@ -141,8 +173,11 @@ doctrine: TSMATCH: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Tsmatch # date specific functions - DATE_OVERLAPS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps + DATE_ADD: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateAdd + DATE_BIN: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateBin DATE_EXTRACT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateExtract + DATE_OVERLAPS: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateOverlaps + DATE_SUBTRACT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateSubtract # range functions DATERANGE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Daterange @@ -162,14 +197,14 @@ doctrine: IREGEXP: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\IRegexp NOT_REGEXP: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\NotRegexp NOT_IREGEXP: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\NotIRegexp - FLAGGED_REGEXP_LIKE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike - REGEXP_LIKE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpLike - FLAGGED_REGEXP_MATCH: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpMatch + REGEXP_COUNT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpCount + REGEXP_INSTR: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpInstr + REGEXP_LIKE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike REGEXP_MATCH: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch - STRCONCAT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StrConcat - FLAGGED_REGEXP_REPLACE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\FlaggedRegexpReplace REGEXP_REPLACE: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace + REGEXP_SUBSTR: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpSubstr ROW: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row + STRCONCAT: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StrConcat # aggregation functions ARRAY_AGG: MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayAgg diff --git a/docs/USE-CASES-AND-EXAMPLES.md b/docs/USE-CASES-AND-EXAMPLES.md index aa1ea513..c4a47ff0 100644 --- a/docs/USE-CASES-AND-EXAMPLES.md +++ b/docs/USE-CASES-AND-EXAMPLES.md @@ -41,3 +41,59 @@ SELECT JSONB_BUILD_OBJECT('number', 123) -- All number types, NULL and boole ``` Note: Keys must always be string literals, while values can be either string literals or object property references. + +Using JSON Path Functions +--- + +PostgreSQL 14+ introduced JSON path functions that provide a powerful way to query JSON data. Here are some examples: + +```sql +-- Check if a JSON path exists with a condition +SELECT e FROM Entity e WHERE JSONB_PATH_EXISTS(e.jsonData, '$.items[*] ? (@.price > 100)') = TRUE + +-- Check if a JSON path matches a condition +SELECT e FROM Entity e WHERE JSONB_PATH_MATCH(e.jsonData, 'exists($.items[*] ? (@.price >= 50 && @.price <= 100))') = TRUE + +-- Extract all items matching a path query +SELECT e.id, JSONB_PATH_QUERY(e.jsonData, '$.items[*].name') FROM Entity e + +-- Extract all items as an array +SELECT e.id, JSONB_PATH_QUERY_ARRAY(e.jsonData, '$.items[*].id') FROM Entity e + +-- Extract the first item matching a path query +SELECT e.id, JSONB_PATH_QUERY_FIRST(e.jsonData, '$.items[*] ? (@.featured == true)') FROM Entity e +``` + +Using Regular Expression Functions +--- + +PostgreSQL 15+ introduced additional regular expression functions that provide more flexibility when working with text data: + +```sql +-- Count occurrences of a pattern +SELECT e.id, REGEXP_COUNT(e.text, '\d{3}-\d{2}-\d{4}') as ssn_count FROM Entity e + +-- Find position of a pattern +SELECT e.id, REGEXP_INSTR(e.text, 'important') as position FROM Entity e + +-- Extract substring matching a pattern +SELECT e.id, REGEXP_SUBSTR(e.text, 'https?://[\w.-]+') as url FROM Entity e +``` + +Using Date Functions +--- + +PostgreSQL 14+ introduced additional date functions that provide more flexibility when working with dates and timestamps: + +```sql +-- Bin timestamps into 15-minute intervals +SELECT DATE_BIN('15 minutes', e.createdAt, '2001-01-01') FROM Entity e + +-- Add an interval to a timestamp (timezone parameter is optional) +SELECT DATE_ADD(e.timestampWithTz, '1 day') FROM Entity e +SELECT DATE_ADD(e.timestampWithTz, '1 day', 'Europe/London') FROM Entity e + +-- Subtract an interval from a timestamp (timezone parameter is optional) +SELECT DATE_SUBTRACT(e.timestampWithTz, '2 hours') FROM Entity e +SELECT DATE_SUBTRACT(e.timestampWithTz, '2 hours', 'UTC') FROM Entity e +```