/** * Processes all virtual column join declarations of $joinType type * * @param array $joins * @param array $aliases * @param array $query * @param string $joinType * @param $parentJoinId * * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function processVirtualColumnJoins(&$joins, &$aliases, &$query, $joinType, $parentJoinId) { if (isset($query['join'][$joinType])) { foreach ($query['join'][$joinType] as $item) { $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'], isset($item['conditionType']) ? $item['conditionType'] : null, isset($item['condition']) ? $item['condition'] : null); if (isset($this->tableAliases[$itemJoinId])) { $item['alias'] = $this->tableAliases[$itemJoinId]; $aliases[$alias] = $this->tableAliases[$itemJoinId]; } $joins[] = $item; } } }
/** * 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; } }
/** * @param array $join * @param string $parentJoinId * @param string|null $joinType * * @return string */ protected function buildJoinIdentifier(array $join, $parentJoinId, $joinType = null) { return $this->joinIdHelper->buildJoinIdentifier($join['join'], $parentJoinId, $joinType ?: $join['type'], $this->getJoinDefinitionConditionType($join), $this->getDefinitionJoinCondition($join)); }
/** * @dataProvider buildJoinIdentifierProvider */ public function testBuildJoinIdentifier($join, $parentJoinId, $joinType, $conditionType, $condition, $expected) { $result = $this->helper->buildJoinIdentifier($join, $parentJoinId, $joinType, $conditionType, $condition); $this->assertEquals($expected, $result); }