public function testPostgresQueryBuild() { $app = $this->getApp(); $this->addSomeContent(); $repo = $app['storage']->getRepository('bolt_pages'); $query = $repo->createQueryBuilder('pages'); $handler = new PostgresSearch($query, $app['query.search_config'], explode(' ', 'lorem ipsum')); $handler->setContentType('pages'); $query = $handler->getQuery(); $this->assertEquals(['pages.*', "ts_rank(bsearch.document, to_tsquery('lorem&ipsum')) as score"], $query->getQueryPart('select')); $this->assertEquals([['table' => 'bolt_pages', 'alias' => 'pages'], ['table' => "(SELECT *, setweight(to_tsvector(pages.title), 'A') || setweight(to_tsvector(pages.teaser), 'B') || setweight(to_tsvector(pages.body), 'B') AS document FROM bolt_pages pages GROUP BY pages.id)", 'alias' => 'bsearch']], $query->getQueryPart('from')); $this->assertInstanceOf('Doctrine\\DBAL\\Query\\Expression\\CompositeExpression', $query->getQueryPart('where')); $this->assertEquals(['score DESC'], $query->getQueryPart('orderBy')); }
public function postgresSearch(ContentQueryParser $contentQuery) { $set = new SearchQueryResultset(); foreach ($contentQuery->getContentTypes() as $contenttype) { $repo = $contentQuery->getEntityManager()->getRepository($contenttype); $query = $repo->createQueryBuilder($contenttype); $config = $contentQuery->getService('search_config'); $search = $contentQuery->getParameter('filter'); $adapter = new PostgresSearch($query, $config, explode(' ', $search)); $adapter->setContentType($contenttype); $result = $repo->findWith($adapter->getQuery()); $set->add($result, $contenttype); } return $set; }