Revision: 227
http://sourceforge.net/p/beeframework/code/227
Author: m_plomer
Date: 2014-09-25 22:36:28 +0000 (Thu, 25 Sep 2014)
Log Message:
-----------
- based OrderAndLimit implementation on resultCount rather than page count, moved page calculation to PaginationBase class
Modified Paths:
--------------
trunk/framework/Bee/Persistence/Doctrine/DaoBase.php
trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php
trunk/framework/Bee/Persistence/IOrderAndLimitHolder.php
Added Paths:
-----------
trunk/framework/Bee/Persistence/PaginationBase.php
Modified: trunk/framework/Bee/Persistence/Doctrine/DaoBase.php
===================================================================
--- trunk/framework/Bee/Persistence/Doctrine/DaoBase.php 2014-09-25 20:21:25 UTC (rev 226)
+++ trunk/framework/Bee/Persistence/Doctrine/DaoBase.php 2014-09-25 22:36:28 UTC (rev 227)
@@ -144,7 +144,6 @@
}
foreach ($orderMapping as $orderField => $orderDir) {
-// $query->orderBy($orderField.' '.$orderDir);
$query->addOrderBy($orderField . ' ' . $orderDir);
}
@@ -154,13 +153,7 @@
if ($orderAndLimitHolder->getPageSize() > 0) {
$query->limit($orderAndLimitHolder->getPageSize());
-
- $pageCount = ceil($query->count($params) / $orderAndLimitHolder->getPageSize());
- $orderAndLimitHolder->setPageCount($pageCount);
-
- if ($orderAndLimitHolder->getCurrentPage() > $pageCount) {
- $orderAndLimitHolder->setCurrentPage($pageCount);
- }
+ $orderAndLimitHolder->setResultCount($query->count($params));
$query->offset($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize());
}
}
Modified: trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php
===================================================================
--- trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2014-09-25 20:21:25 UTC (rev 226)
+++ trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2014-09-25 22:36:28 UTC (rev 227)
@@ -1,5 +1,6 @@
<?php
namespace Bee\Persistence\Doctrine2;
+
/*
* Copyright 2008-2014 the original author or authors.
*
@@ -38,11 +39,11 @@
* @param null $hydrationMode
* @return array
*/
- 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);
- }
+ 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);
+ }
/**
* @param QueryBuilder $qb
@@ -57,81 +58,73 @@
* @param IRestrictionHolder $restrictionHolder
* @internal param QueryBuilder $query
*/
- protected final function applyFilterRestrictions(QueryBuilder &$queryBuilder, IRestrictionHolder $restrictionHolder = null) {
- if (is_null($restrictionHolder)) {
- return;
- }
+ protected final function applyFilterRestrictions(QueryBuilder &$queryBuilder, IRestrictionHolder $restrictionHolder = null) {
+ if (is_null($restrictionHolder)) {
+ return;
+ }
- if (!Bee_Utils_Strings::hasText($restrictionHolder->getFilterString())) {
- return;
- }
+ if (!Bee_Utils_Strings::hasText($restrictionHolder->getFilterString())) {
+ return;
+ }
- $filterTokens = Bee_Utils_Strings::tokenizeToArray($restrictionHolder->getFilterString(), ' ');
- foreach ($filterTokens as $no => $token) {
- $andWhereString = '';
- $params = array();
+ $filterTokens = Bee_Utils_Strings::tokenizeToArray($restrictionHolder->getFilterString(), ' ');
+ foreach ($filterTokens as $no => $token) {
+ $andWhereString = '';
+ $params = array();
- $tokenName = 'filtertoken'.$no;
- $params[$tokenName] = '%'.$token.'%';
+ $tokenName = 'filtertoken' . $no;
+ $params[$tokenName] = '%' . $token . '%';
- foreach ($restrictionHolder->getFilterableFields() as $fieldName) {
- // $fieldName MUST BE A DOCTRINE NAME
- if (Bee_Utils_Strings::hasText($andWhereString)) {
- $andWhereString .= ' OR ';
- }
+ foreach ($restrictionHolder->getFilterableFields() as $fieldName) {
+ // $fieldName MUST BE A DOCTRINE NAME
+ if (Bee_Utils_Strings::hasText($andWhereString)) {
+ $andWhereString .= ' OR ';
+ }
- $andWhereString .= $fieldName.' LIKE :'.$tokenName;
- }
+ $andWhereString .= $fieldName . ' LIKE :' . $tokenName;
+ }
- if (Bee_Utils_Strings::hasText($andWhereString)) {
- $queryBuilder->andWhere($andWhereString);
+ if (Bee_Utils_Strings::hasText($andWhereString)) {
+ $queryBuilder->andWhere($andWhereString);
- foreach ($params as $key => $value) {
- $queryBuilder->setParameter($key, $value);
- }
- }
- }
- }
+ foreach ($params as $key => $value) {
+ $queryBuilder->setParameter($key, $value);
+ }
+ }
+ }
+ }
/**
* @param QueryBuilder $queryBuilder
* @param IOrderAndLimitHolder $orderAndLimitHolder
* @param array $defaultOrderMapping
*/
- protected final function applyOrderAndLimit(QueryBuilder &$queryBuilder, IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = null) {
- if(is_null($defaultOrderMapping)) {
+ protected final function applyOrderAndLimit(QueryBuilder &$queryBuilder, IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = null) {
+ if (is_null($defaultOrderMapping)) {
$defaultOrderMapping = array();
}
- if (is_null($orderAndLimitHolder)) {
- $orderMapping = $defaultOrderMapping;
- } else {
- $orderMapping = count($orderAndLimitHolder->getOrderMapping()) > 0 ? $orderAndLimitHolder->getOrderMapping() : $defaultOrderMapping;
- }
+ if (is_null($orderAndLimitHolder)) {
+ $orderMapping = $defaultOrderMapping;
+ } else {
+ $orderMapping = count($orderAndLimitHolder->getOrderMapping()) > 0 ? $orderAndLimitHolder->getOrderMapping() : $defaultOrderMapping;
+ }
- foreach ($orderMapping as $orderField => $orderDir) {
- $queryBuilder->addOrderBy($orderField, $orderDir);
- }
+ foreach ($orderMapping as $orderField => $orderDir) {
+ $queryBuilder->addOrderBy($orderField, $orderDir);
+ }
- if (is_null($orderAndLimitHolder)) {
- return;
- }
+ if (is_null($orderAndLimitHolder)) {
+ return;
+ }
- if ($orderAndLimitHolder->getPageSize() > 0) {
-
-// $pageCount = ceil(count($this->getQueryFromBuilder($queryBuilder)->execute()) / $orderAndLimitHolder->getPageSize());
- // TODO: optimize use of the Paginator concept. maybe reimplement it in a more specific way?
+ if ($orderAndLimitHolder->getPageSize() > 0) {
$paginator = new Paginator($queryBuilder, false);
- $pageCount = ceil(count($paginator) / $orderAndLimitHolder->getPageSize());
- $orderAndLimitHolder->setPageCount($pageCount);
+ $orderAndLimitHolder->setResultCount(count($paginator));
+ $queryBuilder->setFirstResult($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize());
+ $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize());
+ }
+ }
- if ($orderAndLimitHolder->getCurrentPage() > $pageCount) {
- $orderAndLimitHolder->setCurrentPage($pageCount);
- }
- $queryBuilder->setFirstResult($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize());
- $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize());
- }
- }
-
/**
* @param callback $func
* @throws Exception
Modified: trunk/framework/Bee/Persistence/IOrderAndLimitHolder.php
===================================================================
--- trunk/framework/Bee/Persistence/IOrderAndLimitHolder.php 2014-09-25 20:21:25 UTC (rev 226)
+++ trunk/framework/Bee/Persistence/IOrderAndLimitHolder.php 2014-09-25 22:36:28 UTC (rev 227)
@@ -38,11 +38,6 @@
public function getPageCount();
/**
- * @param $pageCount
- */
- public function setPageCount($pageCount);
-
- /**
* @return int
*/
public function getCurrentPage();
@@ -52,4 +47,8 @@
*/
public function setCurrentPage($currentPage);
+ /**
+ * @param int $resultCount
+ */
+ public function setResultCount($resultCount);
}
Added: trunk/framework/Bee/Persistence/PaginationBase.php
===================================================================
--- trunk/framework/Bee/Persistence/PaginationBase.php (rev 0)
+++ trunk/framework/Bee/Persistence/PaginationBase.php 2014-09-25 22:36:28 UTC (rev 227)
@@ -0,0 +1,94 @@
+<?php
+namespace Bee\Persistence;
+/*
+ * Copyright 2008-2014 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Class BasicListStateHolder
+ *
+ * Implements the pagination aspect of the IOrderAndLimitHolder and embodies generic logic for
+ * @package Bee\Persistence
+ */
+abstract class PaginationBase implements IOrderAndLimitHolder {
+
+ /**
+ * @var int
+ */
+ private $pageSize = 50;
+
+ /**
+ * @var int
+ */
+ private $currentPage = 0;
+
+ /**
+ * @var int
+ */
+ private $resultCount;
+
+ /**
+ * @return int
+ */
+ public function getPageSize() {
+ return $this->pageSize;
+ }
+
+ /**
+ * @return int
+ */
+ public function getPageCount() {
+ return ceil($this->getResultCount() / $this->getPageSize());
+ }
+
+ /**
+ * @return int
+ */
+ public function getCurrentPage() {
+ return $this->currentPage;
+ }
+
+ /**
+ * @param $currentPage
+ */
+ public function setCurrentPage($currentPage) {
+ $this->currentPage = $currentPage;
+ }
+
+ /**
+ * @param int $resultCount
+ */
+ public function setResultCount($resultCount) {
+ $this->resultCount = $resultCount;
+ if($this->getCurrentPage() >= $this->getPageCount()) {
+ $this->setCurrentPage($this->getPageCount() - 1);
+ }
+ }
+
+ /**
+ * @return int
+ */
+ public function getResultCount() {
+ return $this->resultCount;
+ }
+
+ /**
+ * Implements the default behavior in case the current page is beyond the acceptable limit. By default, sets the
+ * current page to the last page.
+ */
+ protected function adjustCurrentPageOnOverflow() {
+ $this->setCurrentPage($this->getPageCount() - 1);
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|