/**
  * Checks if the given column is a virtual relation and if so, generates and saves table aliases for it
  *
  * @param string $columnName
  */
 protected function addTableAliasesForVirtualRelation($columnName)
 {
     if (!empty($this->virtualColumnExpressions[$columnName])) {
         // already processed
         return;
     }
     $joinIds = $this->addTableAliasesForJoinIdentifiers($this->joinIdHelper->explodeColumnName($columnName));
     if (!$this->virtualRelationsJoins) {
         return;
     }
     $hasVirtualRelation = false;
     foreach ($joinIds as $columnJoinId) {
         $hasVirtualRelation = $hasVirtualRelation || array_search($columnJoinId, $this->virtualRelationsJoins);
     }
     if (!$hasVirtualRelation) {
         return;
     }
     $parentJoinId = $this->getParentJoinIdentifier($this->joinIdHelper->buildColumnJoinIdentifier($columnName));
     $fieldName = $this->getFieldName($parentJoinId);
     $className = $this->getEntityClassName($parentJoinId);
     if ($this->virtualRelationProvider->isVirtualRelation($className, $fieldName)) {
         $tableAlias = $this->aliases[$this->virtualRelationProvider->getTargetJoinAlias($className, $fieldName, $this->getFieldName($columnName))];
     } else {
         $joinId = end($joinIds);
         $tableAlias = $this->tableAliases[$joinId];
     }
     $this->virtualColumnExpressions[$columnName] = sprintf('%s.%s', $tableAlias, $this->getFieldName($columnName));
 }
 /**
  * Generates and saves aliases for the given column and all its parent joins
  *
  * @param string $columnName String with specified format
  *                           rootEntityField+Class\Name::joinedEntityRelation+Relation\Class::fieldToSelect
  */
 protected function addTableAliasesForColumn($columnName)
 {
     /**
      * joinIds - array of joins with parent definition but without select field join definition(last one)
      *
      * For `rootEntityField+Class\Name::joinedEntityRelation+Relation\Class::fieldToSelect` column name will be
      *
      * - `Root\Class::rootEntityField`
      * - `Root\Class::rootEntityField+Class\Name::joinedEntityRelation`
      */
     $joinIds = $this->joinIdHelper->explodeColumnName($columnName);
     $this->addTableAliasesForJoinIdentifiers($joinIds);
     $this->addColumnAliasesForVirtualRelation($columnName, $joinIds);
     $this->addTableAliasesForVirtualColumn($columnName);
 }
 /**
  * Generates and saves aliases for the given column and all its parent joins
  *
  * @param string $columnName
  */
 protected function addTableAliasesForColumn($columnName)
 {
     $this->addTableAliasesForJoinIdentifiers($this->joinIdHelper->explodeColumnName($columnName));
     $this->addTableAliasesForVirtualColumn($columnName);
 }
 /**
  * @dataProvider explodeColumnNameProvider
  */
 public function testExplodeColumnName($columnName, $expected)
 {
     $this->assertEquals($expected, $this->helper->explodeColumnName($columnName));
 }