diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php index 920da739c8eb87109890f8d2d9f39b1699ad41f7..de647a34619dfe0355b9ff79277e3fc3ec24d131 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php @@ -34,8 +34,9 @@ class ChildrenUrlRewriteGenerator ) { $this->childrenCategoriesProvider = $childrenCategoriesProvider; $this->categoryUrlRewriteGeneratorFactory = $categoryUrlRewriteGeneratorFactory; - $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance() - ->get(MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php index eb3fd3954bd6e4c6b74bf7d73370859748a730fe..c994b424641470bf728765594460266f3c5311f2 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php @@ -57,8 +57,11 @@ class CurrentUrlRewritesRegenerator $this->urlFinder = $urlFinder; $this->urlRewriteFinder = $urlRewriteFinder ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder::class); - $mergeDataProviderFactory = $mergeDataProviderFactory ?: \Magento\Framework\App\ObjectManager::getInstance() - ->get(\Magento\UrlRewrite\Model\MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = \Magento\Framework\App\ObjectManager::getInstance()->get( + \Magento\UrlRewrite\Model\MergeDataProviderFactory::class + ); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php index f95c72515c46ab53c79d6b6d22a91158fbf55abd..e565760f33448346c7434b1bb4b2fc816dbd173d 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGenerator.php @@ -67,8 +67,9 @@ class CategoryUrlRewriteGenerator $this->childrenUrlRewriteGenerator = $childrenUrlRewriteGenerator; $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator; $this->categoryRepository = $categoryRepository; - $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance() - ->get(MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php index acb8c4a89711356ce9e9490aaa5745111e7f968a..616e120ebafe4a49bebb5bce4c6e4f82b804cf72 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php @@ -47,10 +47,7 @@ class DataCategoryHashMap implements HashMapInterface */ public function getAllData($categoryId) { - if (!isset($this->hashMap[$categoryId])) { - $this->hashMap[$categoryId] = $this->generateData($categoryId); - } - return $this->hashMap[$categoryId]; + return $this->generateData($categoryId); } /** @@ -58,25 +55,28 @@ class DataCategoryHashMap implements HashMapInterface */ public function getData($categoryId, $key) { - $this->getAllData($categoryId); - return $this->hashMap[$categoryId][$key]; + $categorySpecificData = $this->generateData($categoryId); + return $categorySpecificData[$key]; } /** - * Queries the database and returns results + * Returns an array of categories ids that includes category identified by $categoryId and all its subcategories * * @param int $categoryId * @return array */ private function generateData($categoryId) { - $category = $this->categoryRepository->get($categoryId); - return $this->collection->addIdFilter($this->getAllCategoryChildrenIds($category)) - ->getAllIds(); + if (!isset($this->hashMap[$categoryId])) { + $category = $this->categoryRepository->get($categoryId); + $this->hashMap[$categoryId] = $this->collection->addIdFilter($this->getAllCategoryChildrenIds($category)) + ->getAllIds(); + } + return $this->hashMap[$categoryId]; } /** - * Queries sub-categories ids from a category + * Queries the database for sub-categories ids from a category * * @param CategoryInterface $category * @return int[] diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php index bcc82ce8e44a2017ff8ed3f7c1907cb74e8bc985..032ed5e13023e1de62c7c111ed8889d7e6dab6b6 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUrlRewriteDatabaseMap.php @@ -58,7 +58,8 @@ class DataCategoryUrlRewriteDatabaseMap implements DatabaseMapInterface } /** - * Queries the database and returns the name of the temporary table where data is stored + * Queries the database for all category url rewrites that are affected by the category identified by $categoryId + * It returns the name of the temporary table where the resulting data is stored * * @param int $categoryId * @return string diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php index 0a3a99f8a0e7c3b728801f2e39db39e61beb6883..8864226d069d290034c540503e1ee882e5147e90 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryUsedInProductsHashMap.php @@ -38,10 +38,7 @@ class DataCategoryUsedInProductsHashMap implements HashMapInterface */ public function getAllData($categoryId) { - if (!isset($this->hashMap[$categoryId])) { - $this->hashMap[$categoryId] = $this->generateData($categoryId); - } - return $this->hashMap[$categoryId]; + return $this->generateData($categoryId); } /** @@ -49,45 +46,49 @@ class DataCategoryUsedInProductsHashMap implements HashMapInterface */ public function getData($categoryId, $key) { - $this->getAllData($categoryId); - return $this->hashMap[$categoryId][$key]; + $categorySpecificData = $this->generateData($categoryId); + return $categorySpecificData[$key]; } /** - * Queries the database and returns results + * Returns an array of product ids for all DataProductHashMap list, + * that occur in other categories not part of DataCategoryHashMap list * * @param int $categoryId * @return array */ private function generateData($categoryId) { - $productsLinkConnection = $this->connection->getConnection(); - $select = $productsLinkConnection->select() - ->from($this->connection->getTableName('catalog_category_product'), ['category_id']) - ->where( - $productsLinkConnection->prepareSqlCondition( - 'product_id', - [ - 'in' => $this->hashMapPool->getDataMap( - DataProductHashMap::class, - $categoryId - )->getAllData($categoryId) - ] - ) - ) - ->where( - $productsLinkConnection->prepareSqlCondition( - 'category_id', - [ - 'nin' => $this->hashMapPool->getDataMap( - DataCategoryHashMap::class, - $categoryId - )->getAllData($categoryId) - ] + if (!isset($this->hashMap[$categoryId])) { + $productsLinkConnection = $this->connection->getConnection(); + $select = $productsLinkConnection->select() + ->from($this->connection->getTableName('catalog_category_product'), ['category_id']) + ->where( + $productsLinkConnection->prepareSqlCondition( + 'product_id', + [ + 'in' => $this->hashMapPool->getDataMap( + DataProductHashMap::class, + $categoryId + )->getAllData($categoryId) + ] + ) ) - )->group('category_id'); + ->where( + $productsLinkConnection->prepareSqlCondition( + 'category_id', + [ + 'nin' => $this->hashMapPool->getDataMap( + DataCategoryHashMap::class, + $categoryId + )->getAllData($categoryId) + ] + ) + )->group('category_id'); - return $productsLinkConnection->fetchCol($select); + $this->hashMap[$categoryId] = $productsLinkConnection->fetchCol($select); + } + return $this->hashMap[$categoryId]; } /** diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php index 74731a7d40e206a3dd2645abb0a13fa8b3e00ffd..a20b837e4096ad3155aca948e393b8b79597a22a 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductHashMap.php @@ -45,10 +45,7 @@ class DataProductHashMap implements HashMapInterface */ public function getAllData($categoryId) { - if (!isset($this->hashMap[$categoryId])) { - $this->hashMap[$categoryId] = $this->generateData($categoryId); - } - return $this->hashMap[$categoryId]; + return $this->generateData($categoryId); } /** @@ -56,38 +53,40 @@ class DataProductHashMap implements HashMapInterface */ public function getData($categoryId, $key) { - $this->getAllData($categoryId); - return $this->hashMap[$categoryId][$key]; + $categorySpecificData = $this->generateData($categoryId); + return $categorySpecificData[$key]; } /** - * Queries the database and returns results + * Returns an array of ids of all visible products and assigned to a category and all its subcategories * * @param int $categoryId * @return array */ private function generateData($categoryId) { - $productsCollection = $this->collectionFactory->create(); - $productsCollection->getSelect() - ->joinInner( - ['cp' => $this->connection->getTableName('catalog_category_product')], - 'cp.product_id = e.entity_id', - [] - ) - ->where( - $productsCollection->getConnection()->prepareSqlCondition( - 'cp.category_id', - [ - 'in' => $this->hashMapPool->getDataMap( - DataCategoryHashMap::class, - $categoryId - )->getAllData($categoryId) - ] + if (!isset($this->hashMap[$categoryId])) { + $productsCollection = $this->collectionFactory->create(); + $productsCollection->getSelect() + ->joinInner( + ['cp' => $this->connection->getTableName('catalog_category_product')], + 'cp.product_id = e.entity_id', + [] ) - )->group('e.entity_id'); - - return $productsCollection->getAllIds(); + ->where( + $productsCollection->getConnection()->prepareSqlCondition( + 'cp.category_id', + [ + 'in' => $this->hashMapPool->getDataMap( + DataCategoryHashMap::class, + $categoryId + )->getAllData($categoryId) + ] + ) + )->group('e.entity_id'); + $this->hashMap[$categoryId] = $productsCollection->getAllIds(); + } + return $this->hashMap[$categoryId]; } /** diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php index bca04d727aefe60deb4e0d1e00e7c39de1b749f0..c369e2d62a6c25fffbc88a2a21ee27b78e63671f 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataProductUrlRewriteDatabaseMap.php @@ -72,7 +72,8 @@ class DataProductUrlRewriteDatabaseMap implements DatabaseMapInterface } /** - * Queries the database and returns the name of the temporary table where data is stored + * Queries the database for all category url rewrites that are affected by the category identified by $categoryId + * It returns the name of the temporary table where the resulting data is stored * * @param int $categoryId * @return string diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php index 32f81e246156f4de0fa888fb725ab4b7e969900c..c2a9a89a33fb5dc689886e5e071c391f99eadd01 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapInterface.php @@ -5,10 +5,11 @@ */ namespace Magento\CatalogUrlRewrite\Model\Map; -use \Magento\Framework\DB\Select; +use Magento\Framework\DB\Select; /** * Interface for a mysql data type of a map + * * Is used to get data by a unique key from a temporary table in mysql to prevent memory usage * It internally holds the knowledge the creation of the actual data and it initializes itself when we call getData * We should always call destroyTableAdapter when we don't need anymore the temporary tables @@ -17,6 +18,7 @@ interface DatabaseMapInterface { /** * Gets data by key from a map identified by a category Id + * * The key is a unique identifier that matches the values of the index used to build the temporary table * * Example "1_2" where ids would correspond to store_id entity_id diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php index 5dbe1ed12b8611fb161c3f5aba2f3c1a990ffa0f..30732013eace4df7906333bbd43935b2f5761d84 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DatabaseMapPool.php @@ -50,6 +50,11 @@ class DatabaseMapPool 'category' => $categoryId ] ); + if (!$this->dataArray[$key] instanceof DatabaseMapInterface) { + throw new \InvalidArgumentException( + $instanceName . ' does not implement interface ' . DatabaseMapInterface::class + ); + } } return $this->dataArray[$key]; } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php index 3e806fcbd805d0171ca729cf34c83663bd60c118..341cdb1a4fdb1aba3375bace3a687e9d7fd273ee 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapInterface.php @@ -5,11 +5,12 @@ */ namespace Magento\CatalogUrlRewrite\Model\Map; -use \Magento\Framework\DB\Select; +use Magento\Framework\DB\Select; /** * Interface for a hash data map - * It is used for classes tht would build hash maps and store them into memory + * + * It is used for classes that will build hash maps and store them into memory * The initialization is done transparently whenever getAllData or getData is called * The map, upon initialization, might have a dependency on some other DataMapInterfaces * The map has to free memory after we're done using it diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php index 74ede5393cf67c0619cd2f70b22a3b554826ec45..bc6be808d4d9a96e7cd8a42ed106c7266f209c40 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/HashMapPool.php @@ -44,10 +44,6 @@ class HashMapPool public function getDataMap($instanceName, $categoryId) { $key = $instanceName . '-' . $categoryId; - $reflectionClass = new \ReflectionClass($instanceName); - if (!$reflectionClass->implementsInterface(HashMapInterface::class)) { - throw new \Exception($instanceName . ' does not implement interface ' . HashMapInterface::class); - } if (!isset($this->dataArray[$key])) { $this->dataArray[$key] = $this->objectManager->create( $instanceName, @@ -55,6 +51,11 @@ class HashMapPool 'category' => $categoryId ] ); + if (!$this->dataArray[$key] instanceof HashMapInterface) { + throw new \InvalidArgumentException( + $instanceName . ' does not implement interface ' . HashMapInterface::class + ); + } } return $this->dataArray[$key]; } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php index dfa8d87644ad61649d9748027fe8d80396f7814e..bcadfd848e8830461c380b86aeb32bdc116a6a96 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/UrlRewriteFinder.php @@ -11,8 +11,11 @@ use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory; /** - * Allows query to Category and Product UrlRewrite Database Map or UrlFinderInterface by identifiers + * Finds specific queried url rewrites identified by specific fields * + * A group of identifiers specifies a query consumed by the client to retrieve existing url rewrites from the database + * Clients will query a map of DatabaseMapInterface type through this class resulting into a set of url rewrites results + * Each map type will fallback to a UrlFinderInterface by identifiers for unmapped values */ class UrlRewriteFinder { @@ -29,7 +32,7 @@ class UrlRewriteFinder private $urlRewritePrototype; /** @var array */ - private $urlRewriteClassNames; + private $urlRewriteClassNames = []; /** * @param DatabaseMapPool $databaseMapPool @@ -41,10 +44,7 @@ class UrlRewriteFinder DatabaseMapPool $databaseMapPool, UrlFinderInterface $urlFinder, UrlRewriteFactory $urlRewriteFactory, - $urlRewriteClassNames = [ - self::ENTITY_TYPE_PRODUCT => DataProductUrlRewriteDatabaseMap::class, - self::ENTITY_TYPE_CATEGORY => DataCategoryUrlRewriteDatabaseMap::class - ] + array $urlRewriteClassNames = [] ) { $this->databaseMapPool = $databaseMapPool; $this->urlFinder = $urlFinder; @@ -53,7 +53,8 @@ class UrlRewriteFinder } /** - * Queries by identifiers from maps or falls-back to UrlFinderInterface + * Retrieves existing url rewrites filtered by identifiers from prebuild database maps + * This method will fall-back to by using UrlFinderInterface when map type is not found in configured list * * @param int $entityId * @param int $storeId @@ -86,7 +87,7 @@ class UrlRewriteFinder } /** - * Transfer array values to url rewrite object values + * Transfers an array values to url rewrite object values * * @param array $data * @return UrlRewrite[] diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php index b801a84cc482095701c454f18bd2ccc656527448..dee95f236841ef6c3c4ceb5e32eaf4de8cdda238 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Product/CurrentUrlRewritesRegenerator.php @@ -75,8 +75,9 @@ class CurrentUrlRewritesRegenerator $this->urlRewriteFactory = $urlRewriteFactory; $this->urlRewritePrototype = $urlRewriteFactory->create(); $this->urlRewriteFinder = $urlRewriteFinder ?: ObjectManager::getInstance()->get(UrlRewriteFinder::class); - $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance() - ->get(MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php index 4df9fde0f2638fdb46c9305116d59b9ca86860e3..6e357459de8d3790c9e57624c1a7dbb1a9910268 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/ProductScopeRewriteGenerator.php @@ -88,8 +88,9 @@ class ProductScopeRewriteGenerator $this->categoriesUrlRewriteGenerator = $categoriesUrlRewriteGenerator; $this->currentUrlRewritesRegenerator = $currentUrlRewritesRegenerator; $this->anchorUrlRewriteGenerator = $anchorUrlRewriteGenerator; - $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance() - ->get(MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php index 27053c21cffa37e63c4d4387fcacaae9ea562746..f76db7bef44d5b81936015bb033990c36205bc54 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/AfterImportDataObserver.php @@ -134,8 +134,9 @@ class AfterImportDataObserver implements ObserverInterface $this->storeManager = $storeManager; $this->urlRewriteFactory = $urlRewriteFactory; $this->urlFinder = $urlFinder; - $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance() - ->get(MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php index b864285b06a9f8d7a2a55a1414f703e4cbd62d48..dd0250049a426187f674ac61ad60e8c78ac02f67 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryProcessUrlRewriteSavingObserver.php @@ -71,32 +71,17 @@ class CategoryProcessUrlRewriteSavingObserver implements ObserverInterface || $category->dataHasChangedFor('is_anchor') || $category->getIsChangedProductList() ) { - $this->initializeUrlRewritesDataMaps($category); - $categoryUrlRewriteResult = $this->categoryUrlRewriteGenerator->generate($category); $this->urlRewriteBunchReplacer->doBunchReplace($categoryUrlRewriteResult); $productUrlRewriteResult = $this->urlRewriteHandler->generateProductUrlRewrites($category); $this->urlRewriteBunchReplacer->doBunchReplace($productUrlRewriteResult); + //frees memory for maps that are self-initialized in multiple classes that were called by the generators $this->resetUrlRewritesDataMaps($category); } } - /** - * Initializes data maps to be further used - * - * @param Category $category - * @return void - */ - private function initializeUrlRewritesDataMaps($category) - { - foreach ($this->dataUrlRewriteClassNames as $className) { - $this->databaseMapPool->getDataMap($className, $category->getEntityId()); - } - - } - /** * Resets used data maps to free up memory and temporary tables * diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php index 464824e7eefe80eb34101916388c042a3d25c6bf..727dd744cd8a7c9556f4a6889fb48844b0bf3c00 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php @@ -64,8 +64,9 @@ class UrlRewriteHandler $this->productUrlRewriteGenerator = $productUrlRewriteGenerator; $this->urlPersist = $urlPersist; $this->productCollectionFactory = $productCollectionFactory; - $mergeDataProviderFactory = $mergeDataProviderFactory ?: ObjectManager::getInstance() - ->get(MergeDataProviderFactory::class); + if (!isset($mergeDataProviderFactory)) { + $mergeDataProviderFactory = $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class); + } $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create(); } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php index d5abe69ff79777cf02067899eff0d434c76620a9..f36799f789fbdb3a9c287f4e14e1c3abab5b3c36 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php @@ -5,8 +5,7 @@ */ namespace Magento\CatalogUrlRewrite\Test\Unit\Model; -use \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator; - +use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator; use Magento\Catalog\Model\Category; use Magento\Store\Model\ScopeInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php index d9351b4e426ded57289b5af3b21377567e6aa8d4..78b114f60da858acb0d8bbd2e07edd87dcfb5ad0 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/HashMapPoolTest.php @@ -47,8 +47,22 @@ class HashMapPoolTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturnOnConsecutiveCalls($dataCategoryMapMock, $dataProductMapMock, $dataProductMapMockOtherCategory); $this->assertEquals($dataCategoryMapMock, $this->model->getDataMap(DataCategoryHashMap::class, 1)); - $this->assertEquals($dataCategoryMapMock, $this->model->getDataMap(DataCategoryHashMap::class, 1)); + $this->assertSame($dataCategoryMapMock, $this->model->getDataMap(DataCategoryHashMap::class, 1)); $this->assertEquals($dataProductMapMock, $this->model->getDataMap(DataProductHashMap::class, 1)); $this->assertEquals($dataProductMapMockOtherCategory, $this->model->getDataMap(DataCategoryHashMap::class, 2)); } + + /** + * Tests getDataMap with exception + */ + public function testGetDataMapException() + { + $nonInterface = $this->getMock(HashMapPool::class, [], [], '', false); + + $this->objectManagerMock->expects($this->any()) + ->method('create') + ->willReturn($nonInterface); + $this->setExpectedException(\InvalidArgumentException::class); + $this->model->getDataMap(HashMapPool::class, 1); + } } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php index 2a8149960c6d414b123977faa16f736d0c4b7367..b0c4500dab3e02f4d35aed41eb57b54a3e54cfd4 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php @@ -45,12 +45,18 @@ class UrlRewriteFinderTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($this->urlRewritePrototypeMock); + $urlRewriteClassesNamesArray = [ + UrlRewriteFinder::ENTITY_TYPE_PRODUCT => DataProductUrlRewriteDatabaseMap::class, + UrlRewriteFinder::ENTITY_TYPE_CATEGORY => DataCategoryUrlRewriteDatabaseMap::class + ]; + $this->model = (new ObjectManager($this))->getObject( UrlRewriteFinder::class, [ 'databaseMapPool' => $this->databaseMapPoolMock, 'urlFinder' => $this->urlFinderMock, - 'urlRewriteFactory' => $this->urlRewriteFactoryMock + 'urlRewriteFactory' => $this->urlRewriteFactoryMock, + 'urlRewriteClassNames' => $urlRewriteClassesNamesArray ] ); } diff --git a/app/code/Magento/CatalogUrlRewrite/etc/di.xml b/app/code/Magento/CatalogUrlRewrite/etc/di.xml index 5a8974fc52da4b619b73dc627ea8d35159d5ac71..7f0fc718083ecab1df47dd659bbbcac78e14a77f 100644 --- a/app/code/Magento/CatalogUrlRewrite/etc/di.xml +++ b/app/code/Magento/CatalogUrlRewrite/etc/di.xml @@ -23,4 +23,12 @@ <type name="Magento\UrlRewrite\Model\StorageInterface"> <plugin name="storage_plugin" type="Magento\CatalogUrlRewrite\Model\Category\Plugin\Storage"/> </type> + <type name="Magento\CatalogUrlRewrite\Model\Map\UrlRewriteFinder"> + <arguments> + <argument name="urlRewriteClassNames" xsi:type="array"> + <item name="product" xsi:type="string">Magento\CatalogUrlRewrite\Model\Map\DataProductUrlRewriteDatabaseMap</item> + <item name="category" xsi:type="string">Magento\CatalogUrlRewrite\Model\Map\DataCategoryUrlRewriteDatabaseMap</item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php index 3e57c7176b734cd231b10c4031b37fcb2448f5c2..76aa5d368be4c805155b374245799197e4b538dd 100644 --- a/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php +++ b/app/code/Magento/UrlRewrite/Test/Unit/Model/MergeDataProviderTest.php @@ -35,7 +35,7 @@ class MergeDataProviderTest extends \PHPUnit_Framework_TestCase * @param array $urlRewriteMockArray * @param String $expectedData * @param int $arrayCount - * @dataProvider getMergeTestParameters + * @dataProvider mergeDataProvider * @return void */ public function testMerge($urlRewriteMockArray, $expectedData, $arrayCount) @@ -56,11 +56,11 @@ class MergeDataProviderTest extends \PHPUnit_Framework_TestCase } /** - * Data provider for testMerge + * Data provider for testMerge * * @return array */ - public function getMergeTestParameters() + public function mergeDataProvider() { $urlRewriteMock1 = $this->getMock(UrlRewrite::class, [], [], '', false); diff --git a/lib/internal/Magento/Framework/DB/TemporaryTableService.php b/lib/internal/Magento/Framework/DB/TemporaryTableService.php index afc4d884638885d5062dee17324f31ff9f188b59..62d1a0d65cfb5c294e6f9b7771366d10cfcc853f 100644 --- a/lib/internal/Magento/Framework/DB/TemporaryTableService.php +++ b/lib/internal/Magento/Framework/DB/TemporaryTableService.php @@ -71,7 +71,11 @@ class TemporaryTableService foreach ($indexes as $indexName => $columns) { $renderedColumns = implode(',', array_map([$adapter, 'quoteIdentifier'], $columns)); - $indexType = sprintf('INDEX %s USING %s', $adapter->quoteIdentifier($indexName), "{$indexMethod}"); + $indexType = sprintf( + 'INDEX %s USING %s', + $adapter->quoteIdentifier($indexName), + $indexMethod + ); if ($indexName === 'PRIMARY') { $indexType = 'PRIMARY KEY'; @@ -86,7 +90,7 @@ class TemporaryTableService 'CREATE TEMPORARY TABLE %s %s ENGINE=%s IGNORE (%s)', $adapter->quoteIdentifier($name), $indexStatements ? '(' . implode(',', $indexStatements) . ')' : '', - "{$engine}", + $adapter->quoteIdentifier($engine), "{$select}" );