From 87a01e4ab3cf77689e6f68f1d2fff66880dcf0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Oct 2019 22:29:10 +0100 Subject: [PATCH] add replace dql function --- CHANGELOG.md | 2 + DependencyInjection/ChillMainExtension.php | 4 +- Doctrine/DQL/Replace.php | 64 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 Doctrine/DQL/Replace.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aa10a40e..5e4acbfe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,3 +86,5 @@ Master branch - fix errors in pagination - fix search: usage of parenthesis +- add DQL function REPLACE for replacing in strings: "REPLACE(string, 'from', 'to')" + diff --git a/DependencyInjection/ChillMainExtension.php b/DependencyInjection/ChillMainExtension.php index 7b4b0243a..f4ec46fe8 100644 --- a/DependencyInjection/ChillMainExtension.php +++ b/DependencyInjection/ChillMainExtension.php @@ -32,6 +32,7 @@ use Chill\MainBundle\Doctrine\DQL\JsonAggregate; use Chill\MainBundle\Doctrine\DQL\JsonbExistsInArray; use Chill\MainBundle\Doctrine\DQL\Similarity; use Chill\MainBundle\Doctrine\DQL\OverlapsI; +use Chill\MainBundle\Doctrine\DQL\Replace; /** * This class load config for chillMainExtension. @@ -159,7 +160,8 @@ class ChillMainExtension extends Extension implements PrependExtensionInterface, 'string_functions' => array( 'unaccent' => Unaccent::class, 'GET_JSON_FIELD_BY_KEY' => GetJsonFieldByKey::class, - 'AGGREGATE' => JsonAggregate::class + 'AGGREGATE' => JsonAggregate::class, + 'REPLACE' => Replace::class, ), 'numeric_functions' => [ 'JSONB_EXISTS_IN_ARRAY' => JsonbExistsInArray::class, diff --git a/Doctrine/DQL/Replace.php b/Doctrine/DQL/Replace.php new file mode 100644 index 000000000..6d30ec7d9 --- /dev/null +++ b/Doctrine/DQL/Replace.php @@ -0,0 +1,64 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\MainBundle\Doctrine\DQL; + +use Doctrine\ORM\Query\AST\Functions\FunctionNode; +use Doctrine\ORM\Query\Lexer; + +/** + * + * + */ +class Replace extends FunctionNode +{ + protected $string; + + protected $from; + + protected $to; + + public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker): string + { + return 'REPLACE('. + $this->string->dispatch($sqlWalker). + ', '. + $this->from->dispatch($sqlWalker). + ', '. + $this->to->dispatch($sqlWalker). + ')'; + } + + public function parse(\Doctrine\ORM\Query\Parser $parser): void + { + $parser->match(Lexer::T_IDENTIFIER); + $parser->match(Lexer::T_OPEN_PARENTHESIS); + + $this->string = $parser->StringPrimary(); + + $parser->match(Lexer::T_COMMA); + + $this->from = $parser->StringPrimary(); + + $parser->match(Lexer::T_COMMA); + + $this->to = $parser->StringPrimary(); + + $parser->match(Lexer::T_CLOSE_PARENTHESIS); + } +}