/** * @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); }
/** * @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']; } }
/** * 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; } }
/** * @dataProvider fieldsDataProvider * @param string $condition * @param array $expected */ public function getFields($condition, $expected) { $tools = new QueryBuilderTools(); $this->assertEquals($expected, $tools->getFields($condition)); }