Last active
September 15, 2017 07:42
-
-
Save dnahrebecki/fec4eb3272d1e8a25c2a6327acc1d5b3 to your computer and use it in GitHub Desktop.
Workaround for supporting virtual fields in virtual relations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Oro\Bundle\QueryDesignerBundle\QueryDesigner; | |
abstract class AbstractQueryConverter | |
{ | |
// .... | |
// Please add this new method (added new one due to BC. In master probably addTableAliasesForVirtualField will be refactored instead.) | |
/** | |
* Checks if the given column is a virtual field and if so, generates and saves table aliases for it | |
* | |
* @param string $columnName | |
* @param string $mainEntityJoinId | |
*/ | |
protected function addTableAliasesForVirtualFieldWithParentJoinId($columnName, $mainEntityJoinId) | |
{ | |
if (isset($this->virtualColumnExpressions[$columnName])) { | |
// already processed | |
return; | |
} | |
$className = $this->getEntityClassName($columnName); | |
$fieldName = $this->getFieldName($columnName); | |
if (!$className || !$this->virtualFieldProvider->isVirtualField($className, $fieldName)) { | |
// not a virtual field | |
return; | |
} | |
$query = $this->registerVirtualColumnQueryAliases( | |
$this->virtualFieldProvider->getVirtualFieldQuery($className, $fieldName), | |
$mainEntityJoinId | |
); | |
$this->virtualColumnExpressions[$columnName] = $query['select']['expr']; | |
$key = sprintf('%s::%s', $className, $fieldName); | |
if (!isset($this->virtualColumnOptions[$key])) { | |
$options = $query['select']; | |
unset($options['expr']); | |
$this->virtualColumnOptions[$key] = $options; | |
} | |
} | |
// .... | |
// and in the method protected function addTableAliasesForVirtualRelation($columnName) added call to this new method | |
/** | |
* 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; | |
} | |
// NEW CODE BELOW | |
// check if last field is virtual, if yes, add tableAlias to related virtual field. check BAP-15414 and OPS-637 | |
$isLastVirtualField = $this->virtualFieldProvider->isVirtualField( | |
$this->getEntityClassName($columnName), | |
$this->getFieldName($columnName) | |
); | |
if ($isLastVirtualField) { | |
$this->addTableAliasesForVirtualFieldWithParentJoinId($columnName, $columnJoinId); | |
return; | |
} | |
// END OF NEW CODE | |
$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)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment