[Beeframework-svn] SF.net SVN: beeframework:[40] trunk/framework/Bee
Brought to you by:
b_hartmann,
m_plomer
From: <m_p...@us...> - 2013-06-25 11:44:14
|
Revision: 40 http://sourceforge.net/p/beeframework/code/40 Author: m_plomer Date: 2013-06-25 11:44:09 +0000 (Tue, 25 Jun 2013) Log Message: ----------- - updated Doctrine2 DaoBase - Doctrine2 Log4PHP implementation of SQLLogger - minor fix in Context\ParserDelegate Modified Paths: -------------- trunk/framework/Bee/Context/Xml/ParserDelegate.php trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php Added Paths: ----------- trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php Modified: trunk/framework/Bee/Context/Xml/ParserDelegate.php =================================================================== --- trunk/framework/Bee/Context/Xml/ParserDelegate.php 2013-06-12 14:14:12 UTC (rev 39) +++ trunk/framework/Bee/Context/Xml/ParserDelegate.php 2013-06-25 11:44:09 UTC (rev 40) @@ -462,7 +462,9 @@ if (!$this->isDefaultNamespace($ele->namespaceURI)) { // todo MP: why is this missing? prevents XMLs with e.g. nested <util:array/> elements from being parsed - return $this->parseNestedCustomElement($ele, $bd); +// return $this->parseNestedCustomElement($ele, $bd); +// return $this->parseCustomElement($ele, $bd); + throw new Bee_Context_BeanCreationException($bd->getBeanClassName(), 'Namespaced nested elements are currently not supported'); } else if (Bee_Utils_Dom::nodeNameEquals($ele, self::BEAN_ELEMENT)) { @@ -630,7 +632,8 @@ /** * Enter description here... * - * @param DOMElement $root + * @param DOMElement $ele + * @param Bee_Context_Config_IBeanDefinition $containingBd * @return Bee_Context_Config_IBeanDefinition */ public function parseCustomElement(DOMElement $ele, Bee_Context_Config_IBeanDefinition $containingBd = null) { Modified: trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php =================================================================== --- trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2013-06-12 14:14:12 UTC (rev 39) +++ trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2013-06-25 11:44:09 UTC (rev 40) @@ -13,20 +13,133 @@ /** * @var EntityManager */ - private $em; + private $entityManager; /** - * @return EntityManager + * @return EntityManager $entityManager */ - public function getEm() { - return $this->em; + public function getEntityManager() { + return $this->entityManager; } /** - * @param EntityManager $em + * @param $entityManager EntityManager */ - public function setEm(EntityManager $em) { - $this->em = $em; + public function setEntityManager(EntityManager $entityManager) { + $this->entityManager = $entityManager; + } + + + + + /** + * @param \Doctrine\ORM\QueryBuilder $query + * @param \Bee_Persistence_IRestrictionHolder $restrictionHolder + * @param \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder + * @param array $defaultOrderMapping + * + * @return array + */ + public function executeListQuery(\Doctrine\ORM\QueryBuilder $queryBuilder, \Bee_Persistence_IRestrictionHolder $restrictionHolder = null, \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping) { + $this->applyFilterRestrictions($queryBuilder, $restrictionHolder); + $this->applyOrderAndLimit($queryBuilder, $orderAndLimitHolder, $defaultOrderMapping); + return $queryBuilder->getQuery()->execute(); + } + + /** + * @param \Doctrine\ORM\QueryBuilder $query + * @param \Bee_Persistence_IRestrictionHolder $restrictionHolder + */ + protected final function applyFilterRestrictions(\Doctrine\ORM\QueryBuilder &$queryBuilder, \Bee_Persistence_IRestrictionHolder $restrictionHolder = null) { + if (is_null($restrictionHolder)) { + return; + } + + if (!\Bee_Utils_Strings::hasText($restrictionHolder->getFilterString())) { + return; + } + + $filterTokens = \Bee_Utils_Strings::tokenizeToArray($restrictionHolder->getFilterString(), ' '); + foreach ($filterTokens as $no => $token) { + $andWhereString = ''; + $params = array(); + + foreach ($restrictionHolder->getFilterableFields() as $fieldName) { + // $fieldName MUST BE A DOCTRINE NAME + if (\Bee_Utils_Strings::hasText($andWhereString)) { + $andWhereString .= ' OR '; + } + + $tokenName = 'filtertoken'.$no; + $andWhereString .= $fieldName.' LIKE :'.$tokenName; + $params[$tokenName] = '%'.$token.'%'; + } + + if (\Bee_Utils_Strings::hasText($andWhereString)) { + $queryBuilder->andWhere($andWhereString); + + foreach ($params as $key => $value) { + $queryBuilder->setParameter($key, $value); + } + } + } + } + + /** + * @param \Doctrine\ORM\QueryBuilder $query + * @param \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder + * @param array $defaultOrderMapping + */ + protected final function applyOrderAndLimit(\Doctrine\ORM\QueryBuilder &$queryBuilder, \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = array()) { + if (is_null($orderAndLimitHolder)) { + $orderMapping = $defaultOrderMapping; + } else { + $orderMapping = count($orderAndLimitHolder->getOrderMapping()) > 0 ? $orderAndLimitHolder->getOrderMapping() : $defaultOrderMapping; + } + + foreach ($orderMapping as $orderField => $orderDir) { + $queryBuilder->addOrderBy($orderField, $orderDir); + } + + if (is_null($orderAndLimitHolder)) { + return; + } + + if ($orderAndLimitHolder->getPageSize() > 0) { + $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize()); + + // TODO: build a performant count-query! This is simply bullshit! + $pageCount = ceil(count($queryBuilder->getQuery()->execute()) / $orderAndLimitHolder->getPageSize()); + $orderAndLimitHolder->setPageCount($pageCount); + + if ($orderAndLimitHolder->getCurrentPage() > $pageCount) { + $orderAndLimitHolder->setCurrentPage($pageCount); + } + $queryBuilder->setFirstResult($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize()); + $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize()); + } + } + + /** + * @param callback $func + * @throws \Exception + * @return mixed + */ + public function doInTransaction($func) { + $this->getDoctrineConnection()->beginTransaction(); + try { + $result = $func($this, self::getLog()); + + $this->getDoctrineConnection()->commit(); + $this->getDoctrineConnection()->flush(); + + return $result; + } catch(\Exception $e) { + self::getLog()->debug('exception caught', $e); + $this->getDoctrineConnection()->rollBack(); + throw $e; + } + } } Added: trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php =================================================================== --- trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php (rev 0) +++ trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php 2013-06-25 11:44:09 UTC (rev 40) @@ -0,0 +1,72 @@ +<?php +namespace Bee\Persistence\Doctrine2; + +/* + * Copyright 2008-2010 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. + */ +use Doctrine\DBAL\Logging\SQLLogger; + +/** + * User: mp + * Date: 21.06.13 + * Time: 16:23 + * + * Implementation of the Doctrine 2 SQLLogger interface that logs to Log4PHP + */ +class Log4PHPLogger implements SQLLogger { + + /** + * @var \Logger + */ + private static $log; + + /** + * @var int + */ + private $startTime; + + /** + * Logs a SQL statement somewhere. + * + * @param string $sql The SQL to be executed. + * @param array $params The SQL parameters. + * @param array $types The SQL parameter types. + * @return void + */ + public function startQuery($sql, array $params = null, array $types = null) { + self::getLog()->trace('SQL : [' . $sql . '] PARAMS : [' . serialize($params) . '] TYPES: ['. serialize($types) . ']'); + $this->startTime = microtime(true); + } + + /** + * Mark the last started query as stopped. This can be used for timing of queries. + * + * @return void + */ + public function stopQuery() { + $dur = microtime(true) - $this->startTime; + self::getLog()->trace('.. completed in '. ($dur*1000) . ' ms'); + } + + /** + * @return \Logger + */ + protected static function getLog() { + if (!self::$log) { + self::$log = \Bee_Framework::getLoggerForClass(__CLASS__); + } + return self::$log; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |