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