/** * 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; }