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); + } +}