Ejemplo n.º 1
0
 /**
  * @param QueryBuilder      $queryBuilder
  * @param QueryBuilderTools $qbTools
  */
 public function __construct(QueryBuilder $queryBuilder, QueryBuilderTools $qbTools)
 {
     // make sure 'from' DQL part is initialized for both original and optimized query builders
     $queryBuilder->getRootEntities();
     $this->originalQueryBuilder = $queryBuilder;
     $this->qbTools = $qbTools;
     // initialize the query builder helper
     $this->qbTools->prepareFieldAliases($this->originalQueryBuilder->getDQLPart('select'));
     $this->qbTools->prepareJoinTablePaths($this->originalQueryBuilder->getDQLPart('join'));
 }
 /**
  * @param Expr\From[] $fromStatements
  * @param array       $joins
  *
  * @return array
  */
 protected function getNonSymmetricJoinDependencies($fromStatements, $joins)
 {
     $dependencies = [];
     foreach ($fromStatements as $from) {
         $rootAlias = $from->getAlias();
         if (isset($joins[$rootAlias])) {
             $dependencies = array_merge($dependencies, $this->qbTools->getAllDependencies($rootAlias, $joins[$rootAlias]));
         }
     }
     return $dependencies;
 }
 /**
  * @param string $groupByPart
  * @return array
  */
 protected function getSelectFieldFromGroupByPart($groupByPart)
 {
     $expressions = array();
     if (strpos($groupByPart, ',') !== false) {
         $groupByParts = explode(',', $groupByPart);
         foreach ($groupByParts as $part) {
             $expressions = array_merge($expressions, $this->getSelectFieldFromGroupByPart($part));
         }
     } else {
         $groupByPart = trim($groupByPart);
         $groupByPart = $this->qbTools->replaceAliasesWithFields($groupByPart);
         $expressions[] = $groupByPart;
     }
     return $expressions;
 }
 /**
  * {@inheritdoc}
  */
 public function getFieldByAlias($fieldName)
 {
     return $this->qbTools->getFieldByAlias($fieldName);
 }
Ejemplo n.º 5
0
 /**
  * @param QueryBuilder $qb
  * @param QueryBuilderTools $qbTools
  * @param array $value
  * @param string $joinType
  * @param array $usedAliases
  * @param array $knownAliases
  */
 protected function addJoinByDefinition(QueryBuilder $qb, QueryBuilderTools $qbTools, array $value, $joinType, array &$usedAliases, array $knownAliases)
 {
     $joinType = strtolower($joinType);
     if (!isset($value['join'][$joinType])) {
         return;
     }
     $defaultValues = ['conditionType' => null, 'condition' => null];
     foreach ((array) $value['join'][$joinType] as $join) {
         if (in_array($join['alias'], $usedAliases)) {
             continue;
         }
         $join = array_merge($defaultValues, $join);
         $joinUsedAliases = array_merge($qbTools->getUsedTableAliases($join['join']), $qbTools->getTablesUsedInJoinCondition($join['condition'], $knownAliases));
         // Intersect with known aliases to prevent counting aliases from subselects
         $joinUsedAliases = array_intersect($joinUsedAliases, $knownAliases);
         $unknownAliases = array_diff($joinUsedAliases, array_merge($usedAliases, [$join['alias']]));
         if (!empty($unknownAliases)) {
             continue;
         }
         $joinMethod = $joinType . 'Join';
         $qb->{$joinMethod}($join['join'], $join['alias'], $join['conditionType'], $join['condition']);
         $usedAliases[] = $join['alias'];
     }
 }
Ejemplo n.º 6
0
 /**
  * Processes all virtual column join declarations of $joinType type
  *
  * @param array  $joins
  * @param array  $aliases
  * @param array  $query
  * @param string $joinType
  * @param string $parentJoinId
  */
 protected function processVirtualColumnJoins(&$joins, &$aliases, &$query, $joinType, $parentJoinId)
 {
     $joinType = strtolower($joinType);
     if (!isset($query['join'][$joinType])) {
         return;
     }
     foreach ($query['join'][$joinType] as &$item) {
         if (!empty($item['processed'])) {
             continue;
         }
         $condition = $this->getDefinitionJoinCondition($item);
         $usedAliases = $this->qbTools->getTablesUsedInJoinCondition($condition, $this->queryAliases);
         $unknownAliases = array_diff($usedAliases, array_merge(array_keys($this->aliases), [$item['alias']]));
         if ($unknownAliases) {
             continue;
         }
         $item['type'] = $joinType;
         $delimiterPos = strpos($item['join'], '.');
         if (false !== $delimiterPos) {
             $alias = substr($item['join'], 0, $delimiterPos);
             if (!isset($aliases[$alias])) {
                 $aliases[$alias] = $this->generateTableAlias();
             }
             $item['join'] = $aliases[$alias] . substr($item['join'], $delimiterPos);
         }
         $alias = $item['alias'];
         if (!isset($aliases[$alias])) {
             $aliases[$alias] = $this->generateTableAlias();
         }
         $item['alias'] = $aliases[$alias];
         $itemJoinId = $this->joinIdHelper->buildJoinIdentifier($item['join'], $parentJoinId, $item['type'], $this->getJoinDefinitionConditionType($item), $condition);
         if (isset($this->tableAliases[$itemJoinId])) {
             $item['alias'] = $this->tableAliases[$itemJoinId];
             $aliases[$alias] = $this->tableAliases[$itemJoinId];
         }
         $item['processed'] = true;
         $joins[] = $item;
     }
 }
Ejemplo n.º 7
0
 /**
  * @dataProvider fieldsDataProvider
  * @param string $condition
  * @param array $expected
  */
 public function getFields($condition, $expected)
 {
     $tools = new QueryBuilderTools();
     $this->assertEquals($expected, $tools->getFields($condition));
 }