Skip to content

Instantly share code, notes, and snippets.

@dnahrebecki
Last active September 15, 2017 07:42
Show Gist options
  • Save dnahrebecki/fec4eb3272d1e8a25c2a6327acc1d5b3 to your computer and use it in GitHub Desktop.
Save dnahrebecki/fec4eb3272d1e8a25c2a6327acc1d5b3 to your computer and use it in GitHub Desktop.
Workaround for supporting virtual fields in virtual relations
<?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