/**
  * Get optimized query builder for count calculation.
  *
  * @param QueryBuilder $originalQb
  * @return QueryBuilder
  */
 public function getCountQueryBuilder(QueryBuilder $originalQb)
 {
     $this->setOriginalQueryBuilder($originalQb);
     $parts = $this->originalQb->getDQLParts();
     $qb = clone $this->originalQb;
     $qb->setFirstResult(null)->setMaxResults(null)->resetDQLPart('orderBy')->resetDQLPart('groupBy')->resetDQLPart('select')->resetDQLPart('join')->resetDQLPart('where')->resetDQLPart('having');
     $fieldsToSelect = array();
     if ($parts['groupBy']) {
         $groupBy = (array) $parts['groupBy'];
         $groupByFields = $this->getSelectFieldFromGroupBy($groupBy);
         $usedGroupByAliases = [];
         foreach ($groupByFields as $key => $groupByField) {
             $alias = '_groupByPart' . $key;
             $usedGroupByAliases[] = $alias;
             $fieldsToSelect[] = $groupByField . ' as ' . $alias;
         }
         $qb->groupBy(implode(', ', $usedGroupByAliases));
     } elseif (!$parts['where'] && $parts['having']) {
         // If there is no where and group by, but having is present - convert having to where.
         $parts['where'] = $parts['having'];
         $parts['having'] = null;
         $qb->resetDQLPart('having');
     }
     if ($parts['having']) {
         $qb->having($this->qbTools->replaceAliasesWithFields($parts['having']));
     }
     $hasJoins = false;
     if ($parts['join']) {
         $hasJoins = $this->addJoins($qb, $parts);
     }
     if (!$parts['groupBy']) {
         $qb->distinct($hasJoins);
         $fieldsToSelect[] = $this->getFieldFQN($this->idFieldName);
     }
     if ($parts['where']) {
         $qb->where($this->qbTools->replaceAliasesWithFields($parts['where']));
     }
     $qb->select(array_unique($fieldsToSelect));
     $this->qbTools->fixUnusedParameters($qb);
     return $qb;
 }
 public function testFixUnusedParameters()
 {
     $dql = 'SELECT a.name FROM Some:Other as a WHERE a.name = :param1
         AND a.name != :param2 AND a.status = ?1';
     $parameters = array($this->getParameterMock(0), $this->getParameterMock(1), $this->getParameterMock('param1'), $this->getParameterMock('param2'), $this->getParameterMock('param3'));
     $expectedParameters = array(1 => '1_value', 'param1' => 'param1_value', 'param2' => 'param2_value');
     $qb = $this->getMockBuilder('Doctrine\\ORM\\QueryBuilder')->disableOriginalConstructor()->getMock();
     $qb->expects($this->once())->method('getDql')->will($this->returnValue($dql));
     $qb->expects($this->once())->method('getParameters')->will($this->returnValue($parameters));
     $qb->expects($this->once())->method('setParameters')->with($expectedParameters);
     $tools = new QueryBuilderTools();
     $tools->fixUnusedParameters($qb);
 }
 /**
  * @return QueryBuilder
  */
 protected function buildCountQueryBuilder()
 {
     $optimizedQueryBuilder = clone $this->context->getOriginalQueryBuilder();
     $optimizedQueryBuilder->setFirstResult(null)->setMaxResults(null)->resetDQLPart('orderBy')->resetDQLPart('groupBy')->resetDQLPart('select')->resetDQLPart('join')->resetDQLPart('where')->resetDQLPart('having');
     $originalQueryParts = $this->context->getOriginalQueryBuilder()->getDQLParts();
     $fieldsToSelect = [];
     if ($originalQueryParts['groupBy']) {
         $groupBy = (array) $originalQueryParts['groupBy'];
         $groupByFields = $this->getSelectFieldFromGroupBy($groupBy);
         $usedGroupByAliases = [];
         foreach ($groupByFields as $key => $groupByField) {
             $alias = '_groupByPart' . $key;
             $usedGroupByAliases[] = $alias;
             $fieldsToSelect[] = $groupByField . ' as ' . $alias;
         }
         $optimizedQueryBuilder->groupBy(implode(', ', $usedGroupByAliases));
     } elseif (!$originalQueryParts['where'] && $originalQueryParts['having']) {
         // If there is no where and group by, but having is present - convert having to where.
         $originalQueryParts['where'] = $originalQueryParts['having'];
         $originalQueryParts['having'] = null;
         $optimizedQueryBuilder->resetDQLPart('having');
     }
     if ($originalQueryParts['having']) {
         $optimizedQueryBuilder->having($this->qbTools->replaceAliasesWithFields($originalQueryParts['having']));
     }
     if ($originalQueryParts['join']) {
         $this->addJoins($optimizedQueryBuilder, $originalQueryParts);
     }
     if (!$originalQueryParts['groupBy']) {
         /** @var Expr\From $from */
         foreach ($originalQueryParts['from'] as $from) {
             $fieldNames = $this->context->getClassMetadata($from->getFrom())->getIdentifierFieldNames();
             foreach ($fieldNames as $fieldName) {
                 $fieldsToSelect[] = $from->getAlias() . '.' . $fieldName;
             }
         }
     }
     if ($originalQueryParts['where']) {
         $optimizedQueryBuilder->where($this->qbTools->replaceAliasesWithFields($originalQueryParts['where']));
     }
     $optimizedQueryBuilder->select(array_unique($fieldsToSelect));
     $this->qbTools->fixUnusedParameters($optimizedQueryBuilder);
     return $optimizedQueryBuilder;
 }