/** * @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; }
/** * @param string $value * @param QueryOptimizationContext $context * * @return bool */ protected function isTrueValue($value, QueryOptimizationContext $context) { if ($value === 'true' || $value === '1') { return true; } if (strpos($value, ':') === 0 || strpos($value, '?') === 0) { $param = $context->getOriginalQueryBuilder()->getParameter(substr($value, 1)); if ($param instanceof Parameter) { $paramValue = $param->getValue(); if ($paramValue === true || $paramValue === 1) { return true; } } } return false; }
/** * Gets original query builder * * @return QueryBuilder */ public function getOriginalQueryBuilder() { return $this->context->getOriginalQueryBuilder(); }