BonBonSlick
@BonBonSlick
Junior Web Developer Trainee

Doctrine FunctionNode not found?

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

final class StringSimilarity extends FunctionNode {
...

    public function parse(Parser $parser): void {
   ...
    }

    public function getSql(SqlWalker $sqlWalker): string {
        return sprintf(
            "SIMILARITY(LOWER(%s), LOWER(%s))",
            $sqlWalker->walkStateFieldPathExpression($this->fieldName),
            $sqlWalker->walkInParameter($this->similarStr)
        );
    }
}


Для dev + prod env работает, но для тестов выдает ошибку

SQLSTATE[HY000]: General error: 1 no such function: SIMILARITY. Code: 0 [] []


А значит проблема где-то в конфигах.
Вот конфиги обычные, глобальные root->config->packages->doctrine.yml
imports:
  - { resource: '../parameters.xml' }

parameters:
  # Adds a fallback DATABASE_URL if the env var is not set.
  # This allows you to run cache:warmup even if your
  # environment variables are not available yet.
  # You should not need to set this value.
  env(DATABASE_URL): ''

doctrine:
  dbal:
    driver: "%app.database_driver%"
    dbname: "%app.database_name%"
    host: "%app.database_host%"
    port: "%app.database_port%"
    user: "%app.database_user%"
    password: "%app.database_password%"
    charset: UTF8
    default_table_options:
      charset: UTF8
      collate: utf8_unicode_ci
    server_version: '13.0'
  #        unix_socket: /tmp/mysql.sock
  orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: false
    second_level_cache:
      enabled: true
    mappings: # https://symfony.com/doc/current/reference/configuration/doctrine.html#mapping-configuration
      App: # Kernel.php improves mappings
        is_bundle: false
        type: xml
        dir: '%kernel.project_dir%/src/Infrastructure/Mapping/'
        prefix: 'App\Domain'
        alias: App
      # Register new DQL functions
    dql:
      datetime_functions:
        date_format: DoctrineExtensions\Query\Postgresql\DateFormat
        at_time_zone: DoctrineExtensions\Query\Postgresql\AtTimeZoneFunction
      string_functions:
        similarity: App\Infrastructure\Persistence\FunctionsExtensions\StringSimilarity


Конифиги пакета для тестов root->config->packages->test->doctrine.yml
imports:
  - { resource: '../../parameters.xml' }

doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        driver: pdo_sqlite
        path: '%kernel.cache_dir%/test.db'
        memory: false
        charset: UTF8

  orm:
      # Register new DQL functions
    dql:
      datetime_functions:
        date_format: DoctrineExtensions\Query\Postgresql\DateFormat
        at_time_zone: DoctrineExtensions\Query\Postgresql\AtTimeZoneFunction
      string_functions:
        similarity: App\Infrastructure\Persistence\FunctionsExtensions\StringSimilarity

Есть подозрение что pdo_sqlite не поддерживает расширение pg_trgm SIMILARITY
Если так, то ошибка указывает вообще не туда, ведь она зарегестрирована как глобально так и для тестов конкретно, сомневаюсь что дело в phpunit.xml конфиге, ведь там конфиги проекта.

Возникает вопрос, как быть?
Использовать ту же БД при тестах увеличет время тестов в разы. Тестировать чисто в памяти не проверит запросы на валидность.
  • Вопрос задан
  • 12 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
21 сент. 2021, в 14:57
1000 руб./за проект
17 сент. 2021, в 16:46
500 руб./в час
21 сент. 2021, в 14:47
300000 руб./за проект