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