--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/bundles/Pagerfanta/Adapter/DoctrineORM/LimitSubqueryWalker.php Fri Oct 21 17:10:54 2011 +0200
@@ -0,0 +1,82 @@
+<?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\Query\TreeWalkerAdapter,
+ Doctrine\ORM\Query\AST\SelectStatement,
+ Doctrine\ORM\Query\AST\SimpleSelectExpression,
+ Doctrine\ORM\Query\AST\PathExpression,
+ Doctrine\ORM\Query\AST\AggregateExpression;
+
+/**
+ * Replaces the selectClause of the AST with a SELECT DISTINCT root.id equivalent
+ *
+ * @category DoctrineExtensions
+ * @package DoctrineExtensions\Paginate
+ * @author David Abdemoulaie <dave@hobodave.com>
+ * @copyright Copyright (c) 2010 David Abdemoulaie (http://hobodave.com/)
+ * @license http://hobodave.com/license.txt New BSD License
+ */
+class LimitSubqueryWalker extends TreeWalkerAdapter
+{
+
+ /**
+ * Walks down a SelectStatement AST node, modifying it to retrieve DISTINCT ids
+ * of the root Entity
+ *
+ * @param SelectStatement $AST
+ * @return void
+ */
+ public function walkSelectStatement(SelectStatement $AST)
+ {
+ $parent = null;
+ $parentName = null;
+ foreach ($this->_getQueryComponents() AS $dqlAlias => $qComp) {
+
+ // skip mixed data in query
+ if (isset($qComp['resultVariable'])) {
+ continue;
+ }
+
+ if ($qComp['parent'] === null && $qComp['nestingLevel'] == 0) {
+ $parent = $qComp;
+ $parentName = $dqlAlias;
+ break;
+ }
+ }
+
+ $pathExpression = new PathExpression(
+ PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION, $parentName,
+ $parent['metadata']->getSingleIdentifierFieldName()
+ );
+ $pathExpression->type = PathExpression::TYPE_STATE_FIELD;
+
+ $AST->selectClause->selectExpressions = array(
+ new SimpleSelectExpression($pathExpression)
+ );
+
+ if (isset($AST->orderByClause)) {
+ foreach ($AST->orderByClause->orderByItems as $item) {
+ $pathExpression = new PathExpression(
+ PathExpression::TYPE_STATE_FIELD | PathExpression::TYPE_SINGLE_VALUED_ASSOCIATION,
+ $item->expression->identificationVariable,
+ $item->expression->field
+ );
+ $pathExpression->type = PathExpression::TYPE_STATE_FIELD;
+ $AST->selectClause->selectExpressions[] = new SimpleSelectExpression($pathExpression);
+ }
+ }
+
+ $AST->selectClause->isDistinct = true;
+ }
+
+}