martin-georgiev / postgresql-for-doctrine

PostgreSQL enhancements for Doctrine. Provides support for advanced data types (json, jssnb, arrays), text search, array operators and jsonb specific functions.

Home Page:https://packagist.org/packages/martin-georgiev/postgresql-for-doctrine

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Error: Class 'TO_TSQUERY' is not defined

shubaivan opened this issue · comments

@martin-georgiev
Hi, could you help me please transfrom this is native query to doctrine query builder or dql ? Because I faced with error when I try to do it myself :(

line 0, col 43 near 'TO_TSQUERY('Ba:*')': Error: Class 'TO_TSQUERY' is not defined.

SELECT                         
products_alias.id,
ts_rank_cd(to_tsvector('english',coalesce(name,'')|| ' '), query_search) AS rank

FROM shop products_alias 

JOIN to_tsquery('Ba:*') query_search
ON to_tsvector('english',coalesce(name,'')|| ' ') @@ query_search

GROUP BY id, query_search.query_search ORDER BY rank DESC
LIMIT 10
OFFSET 0;

I just try did query builder but faced with error

        $qb = $this->createQueryBuilder('s');

        $qb
            ->select('s')
            ->join(
                'TO_TSQUERY(\'Ba\')',
                'query_search',
                Join::ON,
                'TO_TSVECTOR(english,coalesce(name,\'\')||\' \')) TSMATCH query_search'
            )
            ->groupBy('query_search')
            ->setFirstResult(0)
            ->setMaxResults(10);

in Parser dql looks like this

SELECT s FROM App\Entity\Shop s INNER JOIN TO_TSQUERY('Ba:*') query_search ON TO_TSVECTOR(english,coalesce(name,'')||' ')) TSMATCH query_search GROUP BY query_search

ans the same problem with DQL

line 0, col 86 near 'TO_TSQUERY('test')': Error: Class 'TO_TSQUERY' is not defined.

        $query = $this->getEntityManager()
            ->createQuery('
                SELECT a FROM
                App\Entity\Shop a
                JOIN TO_TSQUERY(\'test\') query                
                ON TSMATCH(TO_TSVECTOR(\'english\',coalesce(name,\'\')|| \' \'), query_search)
            ');

UPDATE

I debuggint it and found something, in WHERE block it works

        $query = $this->getEntityManager()
            ->createQuery('
                SELECT a FROM
                App\Entity\Shop a
                WHERE TSMATCH(TO_TSVECTOR(coalesce(a.name,\'\')), TO_TSQUERY(\'test\')) = TRUE
            ');

but parser not parse it, dql looks like this
SELECT s FROM App\Entity\Shop s
and sql like this
SELECT s0_.id AS id_0, s0_.name AS name_1, s0_.created_at AS created_at_2, s0_.updated_at AS updated_at_3 FROM shop s0_

Could you help me please, maybe I missed something simple ?

The problem appears to be similar to the one in this comment.

DQL was not built for such uses. DQL's purpose is to make queries over object model. It is not a query language for your relational schema.