Skip to content

Commit 3955918

Browse files
committed
add rsm result
1 parent 4f7ea12 commit 3955918

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
namespace Porpaginas\Doctrine\ORM\RSM;
4+
5+
use Doctrine\ORM\EntityManagerInterface;
6+
use Doctrine\ORM\Query\ResultSetMappingBuilder;
7+
use Doctrine\DBAL\Query\QueryBuilder;
8+
use Porpaginas\Arrays\ArrayPage;
9+
10+
final class Result implements \Porpaginas\Result
11+
{
12+
/**
13+
* @param EntityManagerInterface $em
14+
* @param ResultSetMappingBuilder $rsm
15+
* @param QueryBuilder $qb
16+
* @param callable $countQueryBuilderModifier
17+
*/
18+
public function __construct(EntityManagerInterface $em, ResultSetMappingBuilder $rsm, QueryBuilder $qb, callable $countQueryBuilderModifier)
19+
{
20+
$this->em = $em;
21+
$this->rsm = $rsm;
22+
$this->qb = $qb;
23+
$this->countQueryBuilderModifier = $countQueryBuilderModifier;
24+
}
25+
26+
public function take($offset, $limit)
27+
{
28+
$qb = clone $this->qb;
29+
$qb
30+
->setMaxResults($limit)
31+
->setFirstResult($offset)
32+
;
33+
34+
$query = $this->em->createNativeQuery($qb->getSql(), $this->rsm);
35+
$query->setParameters($qb->getParameters());
36+
37+
return new ArrayPage($query->execute(), $offset, $limit, $this->count());
38+
}
39+
40+
public function count()
41+
{
42+
$qb = clone $this->qb;
43+
call_user_func($this->countQueryBuilderModifier, $qb);
44+
$result = $qb->execute()->fetchColumn();
45+
46+
return (int) $result;
47+
}
48+
49+
public function getIterator()
50+
{
51+
$query = $this->em->createNativeQuery($this->qb->getSql(), $this->rsm);
52+
$query->setParameters($this->qb->getParameters());
53+
54+
return new \ArrayIterator($query->execute());
55+
}
56+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace Porpaginas\Doctrine\ORM\RSM;
4+
5+
use Porpaginas\Doctrine\ORM\RSM\Result;
6+
7+
use Doctrine\ORM\Tools\Setup;
8+
use Doctrine\ORM\Tools\SchemaTool;
9+
use Doctrine\ORM\EntityManager;
10+
use Doctrine\ORM\Query\ResultSetMappingBuilder;
11+
use Porpaginas\AbstractResultTestCase;
12+
13+
class QueryTest extends AbstractResultTestCase
14+
{
15+
protected function createResultWithItems($count)
16+
{
17+
$entityManager = $this->setupEntityManager();
18+
19+
for ($i = 0; $i < $count; $i++) {
20+
$entityManager->persist(new DoctrineOrmRsmEntity());
21+
}
22+
$entityManager->flush();
23+
$entityManager->clear();
24+
25+
$qb = $entityManager->getConnection()->createQueryBuilder()
26+
->from('DoctrineOrmRsmEntity', 'e')
27+
->addOrderBy('e.id IS NOT NULL', 'DESC')
28+
;
29+
$rsm = new ResultSetMappingBuilder($entityManager, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
30+
$rsm->addRootEntityFromClassMetadata('Porpaginas\Doctrine\ORM\RSM\DoctrineOrmRsmEntity', 'e');
31+
$qb->select($rsm->generateSelectClause());
32+
33+
return new Result($entityManager, $rsm, $qb, function($qb) {
34+
return $qb->select('count(*)');
35+
});
36+
}
37+
38+
private function setupEntityManager()
39+
{
40+
$paths = array();
41+
$isDevMode = false;
42+
43+
// the connection configuration
44+
$dbParams = array(
45+
'driver' => 'pdo_sqlite',
46+
'memory' => true,
47+
);
48+
49+
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
50+
$entityManager = EntityManager::create($dbParams, $config);
51+
52+
$schemaTool = new SchemaTool($entityManager);
53+
$schemaTool->createSchema(array(
54+
$entityManager->getClassMetadata(__NAMESPACE__ . '\\DoctrineOrmRsmEntity')
55+
));
56+
57+
return $entityManager;
58+
}
59+
}
60+
61+
/**
62+
* @Entity
63+
*/
64+
class DoctrineOrmRsmEntity
65+
{
66+
/**
67+
* @Id @Column(type="integer") @GeneratedValue
68+
*/
69+
private $id;
70+
}

0 commit comments

Comments
 (0)