![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-sales/Model/ResourceModel/Order/Customer/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Sales\Model\ResourceModel\Order\Customer; use Magento\Eav\Model\Config as EavConfig; use Magento\Eav\Model\EntityFactory as EavEntityFactory; use Magento\Eav\Model\ResourceModel\Helper; use Magento\Framework\App\ResourceConnection; use Magento\Framework\Data\Collection\Db\FetchStrategyInterface; use Magento\Framework\Data\Collection\EntityFactory; use Magento\Framework\DataObject; use Magento\Framework\DataObject\Copy\Config; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\Event\ManagerInterface; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot; use Magento\Framework\Validator\UniversalFactory; use Magento\Store\Model\StoreManagerInterface; use Psr\Log\LoggerInterface; /** * Customer Grid Collection * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Collection extends \Magento\Customer\Model\ResourceModel\Customer\Collection { /** * @var StoreManagerInterface */ private $storeManager; /** * Constructor * * @param EntityFactory $entityFactory * @param LoggerInterface $logger * @param FetchStrategyInterface $fetchStrategy * @param ManagerInterface $eventManager * @param EavConfig $eavConfig * @param ResourceConnection $resource * @param EavEntityFactory $eavEntityFactory * @param Helper $resourceHelper * @param UniversalFactory $universalFactory * @param Snapshot $entitySnapshot * @param Config $fieldsetConfig * @param StoreManagerInterface $storeManager * @param AdapterInterface|null $connection * @param string $modelName * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( EntityFactory $entityFactory, LoggerInterface $logger, FetchStrategyInterface $fetchStrategy, ManagerInterface $eventManager, EavConfig $eavConfig, ResourceConnection $resource, EavEntityFactory $eavEntityFactory, Helper $resourceHelper, UniversalFactory $universalFactory, Snapshot $entitySnapshot, Config $fieldsetConfig, StoreManagerInterface $storeManager, AdapterInterface $connection = null, $modelName = self::CUSTOMER_MODEL_NAME ) { $this->storeManager = $storeManager; parent::__construct( $entityFactory, $logger, $fetchStrategy, $eventManager, $eavConfig, $resource, $eavEntityFactory, $resourceHelper, $universalFactory, $entitySnapshot, $fieldsetConfig, $connection, $modelName ); } /** * Init select * * @return $this */ protected function _initSelect() { parent::_initSelect(); $this->addNameToSelect()->addAttributeToSelect( 'email' )->addAttributeToSelect( 'created_at' )->joinAttribute( 'billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left' )->joinAttribute( 'billing_city', 'customer_address/city', 'default_billing', null, 'left' )->joinAttribute( 'billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left' )->joinAttribute( 'billing_regione', 'customer_address/region', 'default_billing', null, 'left' )->joinAttribute( 'billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left' ); return $this; } /** * Performance issue fix for large number (over million) of customers on Orders Creation page in Admin * * Initially _initSelect method of this collection had two joins to Store and Website * tables on store_id and website_id to add store and website names. This caused extreme performance drop * resulting in loading page over minute, despite all optimizations were already in place. * To fix the issue the joins were removed, instead store and website names are added in this method. * * @param DataObject $item * @return DataObject */ protected function beforeAddLoadedItem(DataObject $item): DataObject { $storeId = $item->getStoreId(); $storeName = $storeId !== null ? $this->storeManager->getStore($storeId)->getName() : null; $item->setStoreName($storeName); $websiteId = $item->getWebsiteId(); $websiteName = $websiteId !== null ? $this->storeManager->getWebsite($websiteId)->getName() : null; $item->setWebsiteName($websiteName); return parent::beforeAddLoadedItem($item); } /** * @inheritDoc * * @throws LocalizedException */ public function addFieldToFilter($field, $condition = null) { if ($field === 'store_name') { $this->joinField( 'store_name', 'store', 'name', 'store_id=store_id', null, 'left' ); } if ($field === 'website_name') { $this->joinField( 'website_name', 'store_website', 'name', 'website_id=website_id', null, 'left' ); } return parent::addFieldToFilter($field, $condition); } }