Revision: 240
http://sourceforge.net/p/beeframework/code/240
Author: m_plomer
Date: 2014-10-01 15:30:32 +0000 (Wed, 01 Oct 2014)
Log Message:
-----------
Persistence: fixed severe pagination bug in Doctrine2 DaoBase
Modified Paths:
--------------
trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php
Modified: trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php
===================================================================
--- trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2014-09-28 22:03:01 UTC (rev 239)
+++ trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2014-10-01 15:30:32 UTC (rev 240)
@@ -41,8 +41,12 @@
*/
public function executeListQuery(QueryBuilder $queryBuilder, IRestrictionHolder $restrictionHolder = null, IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = null, $hydrationMode = null) {
$this->applyFilterRestrictions($queryBuilder, $restrictionHolder);
- $this->applyOrderAndLimit($queryBuilder, $orderAndLimitHolder, $defaultOrderMapping);
- return $this->getQueryFromBuilder($queryBuilder)->execute(null, $hydrationMode);
+ $this->applyOrderMapping($queryBuilder, $orderAndLimitHolder, $defaultOrderMapping);
+ $q = $this->getQueryFromBuilder($queryBuilder);
+ if(!is_null($hydrationMode)) {
+ $q->setHydrationMode($hydrationMode);
+ }
+ return $this->getPaginatedOrderedResultFromQuery($q, $orderAndLimitHolder);
}
/**
@@ -99,7 +103,7 @@
* @param IOrderAndLimitHolder $orderAndLimitHolder
* @param array $defaultOrderMapping
*/
- protected final function applyOrderAndLimit(QueryBuilder &$queryBuilder, IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = null) {
+ protected final function applyOrderMapping(QueryBuilder &$queryBuilder, IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = null) {
if (is_null($defaultOrderMapping)) {
$defaultOrderMapping = array();
}
@@ -112,17 +116,6 @@
foreach ($orderMapping as $orderField => $orderDir) {
$queryBuilder->addOrderBy($orderField, $orderDir);
}
-
- if (is_null($orderAndLimitHolder)) {
- return;
- }
-
- if ($orderAndLimitHolder->getPageSize() > 0) {
- $paginator = new Paginator($queryBuilder, false);
- $orderAndLimitHolder->setResultCount(count($paginator));
- $queryBuilder->setFirstResult($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize());
- $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize());
- }
}
/**
@@ -151,4 +144,28 @@
throw $e;
}
}
+
+ /**
+ * @param Query $q
+ * @param IOrderAndLimitHolder $orderAndLimitHolder
+ * @return array|Paginator
+ */
+ protected function getPaginatedOrderedResultFromQuery(Query $q, IOrderAndLimitHolder $orderAndLimitHolder) {
+ if (!is_null($orderAndLimitHolder) && $orderAndLimitHolder->getPageSize() > 0) {
+ $q->setFirstResult($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize());
+ $q->setMaxResults($orderAndLimitHolder->getPageSize());
+ $paginator = new Paginator($q, $this->useWhereInPagination());
+ $orderAndLimitHolder->setResultCount(count($paginator));
+ return $paginator;
+ } else {
+ return $q->getResult($q->getHydrationMode());
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ protected function useWhereInPagination() {
+ return true;
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|