Permalink
Browse files

Merge remote-tracking branch 'stof/doctrine_orm_native'

  • Loading branch information...
2 parents e0ce761 + d3c60f8 commit c490684def33e992241e7fad33bcbd03d9d18643 @pablodip pablodip committed Jan 22, 2012
Showing with 175 additions and 78 deletions.
  1. +159 −0 src/Pagerfanta/Adapter/DoctrineORM/Paginator.php
  2. +16 −78 src/Pagerfanta/Adapter/DoctrineORMAdapter.php
@@ -0,0 +1,159 @@
+<?php
+
+/*
+ * This file is part of the Pagerfanta package.
+ *
+ * (c) Pablo Díez <pablodip@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Pagerfanta\Adapter\DoctrineORM;
+
+use Doctrine\ORM\QueryBuilder;
+use Doctrine\ORM\Query;
+use Doctrine\ORM\NoResultException;
+
+/**
+ * DoctrineORM Paginator.
+ *
+ * This class emulates Doctrine\ORM\Tools\Pagination\Paginator for older
+ * Doctrine versions.
+ *
+ * @author Pablo Díez <pablodip@gmail.com>
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
+ *
+ * @api
+ */
+class Paginator implements \Countable, \IteratorAggregate
+{
+ /**
+ * @var Query
+ */
+ private $query;
+
+ private $fetchJoinCollection;
+
+ /**
+ * Constructor.
+ *
+ * @param Query|QueryBuilder $query A Doctrine ORM query or query builder.
+ * @param Boolean $fetchJoinCollection Whether the query joins a collection (true by default).
+ *
+ * @api
+ */
+ public function __construct($query, $fetchJoinCollection = true)
+ {
+ if ($query instanceof QueryBuilder) {
+ $query = $query->getQuery();
+ }
+
+ $this->query = $query;
+ $this->fetchJoinCollection = (Boolean) $fetchJoinCollection;
+ }
+
+ /**
+ * Returns the query
+ *
+ * @return Query
+ *
+ * @api
+ */
+ public function getQuery()
+ {
+ return $this->query;
+ }
+
+ /**
+ * Returns whether the query joins a collection.
+ *
+ * @return Boolean Whether the query joins a collection.
+ */
+ public function getFetchJoinCollection()
+ {
+ return $this->fetchJoinCollection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function count()
+ {
+ /* @var $countQuery Query */
+ $countQuery = $this->cloneQuery($this->query);
+
+ $countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\CountWalker'));
+ $countQuery->setFirstResult(null)->setMaxResults(null);
+
+ try {
+ $data = $countQuery->getScalarResult();
+ $data = array_map('current', $data);
+ return array_sum($data);
+ } catch(NoResultException $e) {
+ return 0;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getIterator()
+ {
+ $offset = $this->query->getFirstResult();
+ $length = $this->query->getMaxResults();
+
+ if ($this->fetchJoinCollection) {
+ $subQuery = $this->cloneQuery($this->query);
+ $subQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\LimitSubqueryWalker'))
+ ->setFirstResult($offset)
+ ->setMaxResults($length);
+
+ $ids = array_map('current', $subQuery->getScalarResult());
+
+ $whereInQuery = $this->cloneQuery($this->query);
+ // don't do this for an empty id array
+ if (count($ids) > 0) {
+ $namespace = 'pg_';
+
+ $whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\WhereInWalker'));
+ $whereInQuery->setHint('id.count', count($ids));
+ $whereInQuery->setHint('pg.ns', $namespace);
+ $whereInQuery->setFirstResult(null)->setMaxResults(null);
+ foreach ($ids as $i => $id) {
+ $i++;
+ $whereInQuery->setParameter("{$namespace}_{$i}", $id);
+ }
+ }
+
+ return new \ArrayIterator($whereInQuery->getResult($this->query->getHydrationMode()));
+ }
+
+ $result = $this->cloneQuery($this->query)
+ ->setMaxResults($length)
+ ->setFirstResult($offset)
+ ->getResult($this->query->getHydrationMode())
+ ;
+
+ return new \ArrayIterator($result);
+ }
+
+ /**
+ * Clones a query.
+ *
+ * @param Query $query The query.
+ *
+ * @return Query The cloned query.
+ */
+ private function cloneQuery(Query $query)
+ {
+ /* @var $cloneQuery Query */
+ $cloneQuery = clone $query;
+ $cloneQuery->setParameters($query->getParameters());
+ foreach ($query->getHints() as $name => $value) {
+ $cloneQuery->setHint($name, $value);
+ }
+
+ return $cloneQuery;
+ }
+}
@@ -11,43 +11,38 @@
namespace Pagerfanta\Adapter;
-use Doctrine\ORM\QueryBuilder;
-use Doctrine\ORM\Query;
-use Doctrine\ORM\NoResultException;
+use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
+use Pagerfanta\Adapter\DoctrineORM\Paginator as LegacyPaginator;
/**
* DoctrineORMAdapter.
*
- * @author Pablo Díez <pablodip@gmail.com>
- * @author Benjamin Eberlei <kontakt@beberlei.de>
+ * @author Christophe Coevoet <stof@notk.org>
*
* @api
*/
class DoctrineORMAdapter implements AdapterInterface
{
/**
- * @var Query
+ * @var \Doctrine\ORM\Tools\Pagination\Paginator|\Pagerfanta\Adapter\DoctrineORM\Paginator
*/
- private $query;
-
- private $fetchJoinCollection;
+ private $paginator;
/**
* Constructor.
*
- * @param Query|QueryBuilder $query A Doctrine ORM query or query builder.
+ * @param \Doctrine\ORM\Query|\Doctrine\ORM\QueryBuilder $query A Doctrine ORM query or query builder.
* @param Boolean $fetchJoinCollection Whether the query joins a collection (true by default).
*
* @api
*/
public function __construct($query, $fetchJoinCollection = true)
{
- if ($query instanceof QueryBuilder) {
- $query = $query->getQuery();
+ if (class_exists('Doctrine\ORM\Tools\Pagination\Paginator')) {
+ $this->paginator = new DoctrinePaginator($query, $fetchJoinCollection);
+ } else {
+ $this->paginator = new LegacyPaginator($query, $fetchJoinCollection);
}
-
- $this->query = $query;
- $this->fetchJoinCollection = (Boolean) $fetchJoinCollection;
}
/**
@@ -59,7 +54,7 @@ public function __construct($query, $fetchJoinCollection = true)
*/
public function getQuery()
{
- return $this->query;
+ return $this->paginator->getQuery();
}
/**
@@ -69,83 +64,26 @@ public function getQuery()
*/
public function getFetchJoinCollection()
{
- return $this->fetchJoinCollection;
+ return $this->paginator->getFetchJoinCollection();
}
/**
* {@inheritdoc}
*/
public function getNbResults()
{
- /* @var $countQuery Query */
- $countQuery = $this->cloneQuery($this->query);
-
- $countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\CountWalker'));
- $countQuery->setFirstResult(null)->setMaxResults(null);
-
- try {
- $data = $countQuery->getScalarResult();
- $data = array_map('current', $data);
- return array_sum($data);
- } catch(NoResultException $e) {
- return 0;
- }
+ return count($this->paginator);
}
/**
* {@inheritdoc}
*/
public function getSlice($offset, $length)
{
- if ($this->fetchJoinCollection) {
- $subQuery = $this->cloneQuery($this->query);
- $subQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\LimitSubqueryWalker'))
- ->setFirstResult($offset)
- ->setMaxResults($length);
-
- $ids = array_map('current', $subQuery->getScalarResult());
-
- $whereInQuery = $this->cloneQuery($this->query);
- // don't do this for an empty id array
- if (count($ids) > 0) {
- $namespace = 'pg_';
-
- $whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Pagerfanta\Adapter\DoctrineORM\WhereInWalker'));
- $whereInQuery->setHint('id.count', count($ids));
- $whereInQuery->setHint('pg.ns', $namespace);
- $whereInQuery->setFirstResult(null)->setMaxResults(null);
- foreach ($ids as $i => $id) {
- $i++;
- $whereInQuery->setParameter("{$namespace}_{$i}", $id);
- }
- }
-
- return $whereInQuery->getResult($this->query->getHydrationMode());
- }
-
- return $this->cloneQuery($this->query)
- ->setMaxResults($length)
+ $this->paginator->getQuery()
->setFirstResult($offset)
- ->getResult($this->query->getHydrationMode())
- ;
- }
-
- /**
- * Clones a query.
- *
- * @param Query $query The query.
- *
- * @return Query The cloned query.
- */
- private function cloneQuery(Query $query)
- {
- /* @var $cloneQuery Query */
- $cloneQuery = clone $query;
- $cloneQuery->setParameters($query->getParameters());
- foreach ($query->getHints() as $name => $value) {
- $cloneQuery->setHint($name, $value);
- }
+ ->setMaxResults($length);
- return $cloneQuery;
+ return $this->paginator->getIterator();
}
}

0 comments on commit c490684

Please sign in to comment.