From c6f7fd3375493ab9ece558d1e4562ea9e827c44a Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Mon, 2 Nov 2015 15:05:26 +0100 Subject: [PATCH] add rsm result --- src/Porpaginas/Doctrine/ORM/RSM/Result.php | 58 +++++++++++++++ .../Porpaginas/Doctrine/ORM/RSM/QueryTest.php | 70 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/Porpaginas/Doctrine/ORM/RSM/Result.php create mode 100644 tests/Porpaginas/Doctrine/ORM/RSM/QueryTest.php diff --git a/src/Porpaginas/Doctrine/ORM/RSM/Result.php b/src/Porpaginas/Doctrine/ORM/RSM/Result.php new file mode 100644 index 0000000..4075fbe --- /dev/null +++ b/src/Porpaginas/Doctrine/ORM/RSM/Result.php @@ -0,0 +1,58 @@ +em = $em; + $this->rsm = $rsm; + $this->qb = $qb; + $this->countQueryBuilderModifier = $countQueryBuilderModifier ?: function($qb) { + return $qb->select('count(*)'); + }; + } + + public function take($offset, $limit) + { + $qb = clone $this->qb; + $qb + ->setMaxResults($limit) + ->setFirstResult($offset) + ; + + $query = $this->em->createNativeQuery($qb->getSql(), $this->rsm); + $query->setParameters($qb->getParameters()); + + return new ArrayPage($query->execute(), $offset, $limit, $this->count()); + } + + public function count() + { + $qb = clone $this->qb; + call_user_func($this->countQueryBuilderModifier, $qb); + $result = $qb->execute()->fetchColumn(); + + return (int) $result; + } + + public function getIterator() + { + $query = $this->em->createNativeQuery($this->qb->getSql(), $this->rsm); + $query->setParameters($this->qb->getParameters()); + + return new \ArrayIterator($query->execute()); + } +} diff --git a/tests/Porpaginas/Doctrine/ORM/RSM/QueryTest.php b/tests/Porpaginas/Doctrine/ORM/RSM/QueryTest.php new file mode 100644 index 0000000..6765a1a --- /dev/null +++ b/tests/Porpaginas/Doctrine/ORM/RSM/QueryTest.php @@ -0,0 +1,70 @@ +setupEntityManager(); + + for ($i = 0; $i < $count; $i++) { + $entityManager->persist(new DoctrineOrmRsmEntity()); + } + $entityManager->flush(); + $entityManager->clear(); + + $qb = $entityManager->getConnection()->createQueryBuilder() + ->from('DoctrineOrmRsmEntity', 'e') + ->addOrderBy('e.id IS NOT NULL', 'DESC') + ; + $rsm = new ResultSetMappingBuilder($entityManager, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT); + $rsm->addRootEntityFromClassMetadata('Porpaginas\Doctrine\ORM\RSM\DoctrineOrmRsmEntity', 'e'); + $qb->select($rsm->generateSelectClause()); + + return new Result($entityManager, $rsm, $qb, function($qb) { + return $qb->select('count(*)'); + }); + } + + private function setupEntityManager() + { + $paths = array(); + $isDevMode = false; + + // the connection configuration + $dbParams = array( + 'driver' => 'pdo_sqlite', + 'memory' => true, + ); + + $config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode); + $entityManager = EntityManager::create($dbParams, $config); + + $schemaTool = new SchemaTool($entityManager); + $schemaTool->createSchema(array( + $entityManager->getClassMetadata(__NAMESPACE__ . '\\DoctrineOrmRsmEntity') + )); + + return $entityManager; + } +} + +/** + * @Entity + */ +class DoctrineOrmRsmEntity +{ + /** + * @Id @Column(type="integer") @GeneratedValue + */ + private $id; +}