From e5475c8ff64df4880bec872c7c3a97a870d3f099 Mon Sep 17 00:00:00 2001 From: Christopher Georg Date: Sat, 17 Jun 2023 00:11:56 +0200 Subject: [PATCH] feat: improve REGEXP_REPLACE() for postgres --- src/Query/Postgresql/RegexpReplace.php | 15 ++++++++++++++- tests/Query/Postgresql/RegexpReplaceTest.php | 11 +++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Query/Postgresql/RegexpReplace.php b/src/Query/Postgresql/RegexpReplace.php index 4eaeeec51..0857bfb4b 100644 --- a/src/Query/Postgresql/RegexpReplace.php +++ b/src/Query/Postgresql/RegexpReplace.php @@ -19,9 +19,17 @@ class RegexpReplace extends FunctionNode private $replace; + private $flags; + public function getSql(SqlWalker $sqlWalker): string { - return 'REGEXP_REPLACE('.$this->string->dispatch($sqlWalker).', '.$this->search->dispatch($sqlWalker).', '.$this->replace->dispatch($sqlWalker).')'; + $sql = 'REGEXP_REPLACE('.$this->string->dispatch($sqlWalker).', '.$this->search->dispatch($sqlWalker).', '.$this->replace->dispatch($sqlWalker); + if ($this->flags) { + $sql .= ', '.$this->flags->dispatch($sqlWalker); + } + $sql .= ')'; + + return $sql; } public function parse(Parser $parser): void @@ -35,6 +43,11 @@ public function parse(Parser $parser): void $parser->match(Lexer::T_COMMA); $this->replace = $parser->StringExpression(); + if ($parser->getLexer()->isNextToken(Lexer::T_COMMA)) { + $parser->match(Lexer::T_COMMA); + $this->flags = $parser->StringExpression(); + } + $parser->match(Lexer::T_CLOSE_PARENTHESIS); } } diff --git a/tests/Query/Postgresql/RegexpReplaceTest.php b/tests/Query/Postgresql/RegexpReplaceTest.php index 57241500d..d6d72855a 100644 --- a/tests/Query/Postgresql/RegexpReplaceTest.php +++ b/tests/Query/Postgresql/RegexpReplaceTest.php @@ -16,4 +16,15 @@ public function testRegexpReplace(): void $q->getSql() ); } + + public function testRegexpReplaceWithFlags(): void + { + $dql = "SELECT p FROM DoctrineExtensions\Tests\Entities\Set p WHERE REGEXP_REPLACE(p.set, '\d', 'X', 'g') LIKE 'testXXX'"; + $q = $this->entityManager->createQuery($dql); + + $this->assertEquals( + "SELECT s0_.id AS id_0, s0_.set AS set_1 FROM Set s0_ WHERE REGEXP_REPLACE(s0_.set, '\d', 'X', 'g') LIKE 'testXXX'", + $q->getSql() + ); + } }