Skip to content

Commit 5570832

Browse files
author
Alexander Paliarush
committed
MAGETWO-38305: Fix Performance Degradation caused by Join Directive
1 parent 2f3a21d commit 5570832

File tree

2 files changed

+11
-13
lines changed

2 files changed

+11
-13
lines changed

lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public function process(DbCollection $collection, $extensibleEntityClass)
131131
return $selectFieldData[Converter::JOIN_SELECT_FIELD];
132132
};
133133
$joinData->setSelectFields(array_map($selectFieldsMapper, $directive[Converter::JOIN_SELECT_FIELDS]));
134-
$collection->joinExtensionAttribute($joinData);
134+
$collection->joinExtensionAttribute($joinData, [$this, 'extractExtensionAttributes']);
135135
}
136136
}
137137

lib/internal/Magento/Framework/Data/Collection/AbstractDb.php

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ abstract class AbstractDb extends \Magento\Framework\Data\Collection
8989
/**
9090
* Flag which determines if extension attributes were joined before the collection was loaded.
9191
*
92-
* @var bool
92+
* @var callable|null
9393
*/
94-
private $extensionAttributesJoined = false;
94+
protected $extensionAttributesExtractorCallback;
9595

9696
/**
9797
* @param EntityFactoryInterface $entityFactory
@@ -743,6 +743,7 @@ protected function _reset()
743743
$this->_setIsLoaded(false);
744744
$this->_items = [];
745745
$this->_data = null;
746+
$this->extensionAttributesExtractorCallback = null;
746747
return $this;
747748
}
748749

@@ -755,15 +756,11 @@ protected function _reset()
755756
protected function _fetchAll(\Zend_Db_Select $select)
756757
{
757758
$data = $this->_fetchStrategy->fetchAll($select, $this->_bindParams);
758-
if ($this->extensionAttributesJoined) {
759-
// TODO: Temporary implementation to evaluate performance improvement
760-
/** @var \Magento\Framework\Api\ExtensionAttributesFactory $extensionAttributesFactory */
761-
$extensionAttributesFactory = \Magento\Framework\App\ObjectManager::getInstance()
762-
->get('Magento\Framework\Api\ExtensionAttributesFactory');
759+
if ($this->extensionAttributesExtractorCallback && is_callable($this->extensionAttributesExtractorCallback)) {
763760
foreach ($data as $key => $dataItem) {
764-
$data[$key] = $extensionAttributesFactory->extractExtensionAttributes(
765-
$this->_itemObjectClass,
766-
$dataItem
761+
$data[$key] = call_user_func_array(
762+
$this->extensionAttributesExtractorCallback,
763+
[$this->_itemObjectClass, $dataItem]
767764
);
768765
}
769766
}
@@ -816,9 +813,10 @@ protected function _initSelect()
816813
* Join extension attribute.
817814
*
818815
* @param \Magento\Framework\Api\ExtensionAttribute\JoinData $join
816+
* @param callable $extensionAttributesExtractorCallback
819817
* @return $this
820818
*/
821-
public function joinExtensionAttribute($join)
819+
public function joinExtensionAttribute($join, $extensionAttributesExtractorCallback)
822820
{
823821
$selectFrom = $this->getSelect()->getPart(\Zend_Db_Select::FROM);
824822
$joinRequired = !isset($selectFrom[$join->getReferenceTableAlias()]);
@@ -836,7 +834,7 @@ public function joinExtensionAttribute($join)
836834
$columns[$fieldAlias] = $join->getReferenceTableAlias() . '.' . $selectField;
837835
}
838836
$this->getSelect()->columns($columns);
839-
$this->extensionAttributesJoined = !empty($columns) ?: false;
837+
$this->extensionAttributesExtractorCallback = $extensionAttributesExtractorCallback;
840838
return $this;
841839
}
842840

0 commit comments

Comments
 (0)