![]() 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/framework/DB/Query/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\DB\Query; use Magento\Framework\Exception\LocalizedException; /** * Query generator */ class Generator { /** * @var \Magento\Framework\DB\Query\BatchIteratorFactory */ private $iteratorFactory; /** * @var \Magento\Framework\DB\Query\BatchRangeIteratorFactory */ private $rangeIteratorFactory; /** * Initialize dependencies. * * @param BatchIteratorFactory $iteratorFactory * @param BatchRangeIteratorFactory $rangeIteratorFactory */ public function __construct( BatchIteratorFactory $iteratorFactory, BatchRangeIteratorFactory $rangeIteratorFactory = null ) { $this->iteratorFactory = $iteratorFactory; $this->rangeIteratorFactory = $rangeIteratorFactory ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\DB\Query\BatchRangeIteratorFactory::class); } /** * Generate select query list with predefined items count in each select item * * Generates select parameters - batchSize, correlationName, rangeField, rangeFieldAlias * to obtain instance of iterator. The behavior of the iterator will depend on the parameters passed to it. * For example: by default for $batchStrategy parameter used * \Magento\Framework\DB\Query\BatchIteratorInterface::UNIQUE_FIELD_ITERATOR. This parameter is determine, what * instance of Iterator will be returned. * * Other params: * select - represents the select object, that should be passed into Iterator. * batchSize - sets the number of items in select. * correlationName - is the base table involved in the select. * rangeField - this is the basic field which used to split select. * rangeFieldAlias - alias of range field. * * @see \Magento\Framework\DB\Query\BatchIteratorInterface * @param string $rangeField - Field which is used for the range mechanism in select * @param \Magento\Framework\DB\Select $select * @param int $batchSize - Determines on how many parts will be divided * the number of values in the select. * @param string $batchStrategy It determines which strategy is chosen * @return BatchIteratorInterface * @throws LocalizedException Throws if incorrect "FROM" part in \Select exists */ public function generate( $rangeField, \Magento\Framework\DB\Select $select, $batchSize = 100, $batchStrategy = \Magento\Framework\DB\Query\BatchIteratorInterface::UNIQUE_FIELD_ITERATOR ) { if ($batchStrategy == \Magento\Framework\DB\Query\BatchIteratorInterface::NON_UNIQUE_FIELD_ITERATOR) { return $this->generateByRange($rangeField, $select, $batchSize); } $fromSelect = $select->getPart(\Magento\Framework\DB\Select::FROM); if (empty($fromSelect)) { throw new LocalizedException( new \Magento\Framework\Phrase( 'The select object must have the correct "FROM" part. Verify and try again.' ) ); } $fieldCorrelationName = ''; foreach ($fromSelect as $correlationName => $fromPart) { if ($fromPart['joinType'] == \Magento\Framework\DB\Select::FROM) { $fieldCorrelationName = $correlationName; break; } } $columns = $select->getPart(\Magento\Framework\DB\Select::COLUMNS); /** * Calculate $rangeField alias */ $rangeFieldAlias = $rangeField; foreach ($columns as $column) { list($table, $columnName, $alias) = $column; if ($table == $fieldCorrelationName && $columnName == $rangeField) { $rangeFieldAlias = $alias ?: $rangeField; break; } } return $this->iteratorFactory->create( [ 'select' => $select, 'batchSize' => $batchSize, 'correlationName' => $fieldCorrelationName, 'rangeField' => $rangeField, 'rangeFieldAlias' => $rangeFieldAlias ] ); } /** * Generate select query list with predefined items count in each select item. * * Generates select parameters - batchSize, correlationName, rangeField, rangeFieldAlias * to obtain instance of BatchRangeIterator. * * Other params: * select - represents the select object, that should be passed into Iterator. * batchSize - sets the number of items in select. * correlationName - is the base table involved in the select. * rangeField - this is the basic field which used to split select. * rangeFieldAlias - alias of range field. * * @see BatchRangeIterator * @param string $rangeField - Field which is used for the range mechanism in select * @param \Magento\Framework\DB\Select $select * @param int $batchSize * @return BatchIteratorInterface * @throws LocalizedException Throws if incorrect "FROM" part in \Select exists * @see \Magento\Framework\DB\Query\Generator * @deprecated 100.1.8 This is a temporary solution which is made due to the fact that we * can't change method generate() in version 2.1 due to a backwards incompatibility. * In 2.2 version need to use original method generate() with additional parameter. */ public function generateByRange( $rangeField, \Magento\Framework\DB\Select $select, $batchSize = 100 ) { $fromSelect = $select->getPart(\Magento\Framework\DB\Select::FROM); if (empty($fromSelect)) { throw new LocalizedException( new \Magento\Framework\Phrase( 'The select object must have the correct "FROM" part. Verify and try again.' ) ); } $fieldCorrelationName = ''; foreach ($fromSelect as $correlationName => $fromPart) { if ($fromPart['joinType'] == \Magento\Framework\DB\Select::FROM) { $fieldCorrelationName = $correlationName; break; } } $columns = $select->getPart(\Magento\Framework\DB\Select::COLUMNS); /** * Calculate $rangeField alias */ $rangeFieldAlias = $rangeField; foreach ($columns as $column) { list($table, $columnName, $alias) = $column; if ($table == $fieldCorrelationName && $columnName == $rangeField) { $rangeFieldAlias = $alias ?: $rangeField; break; } } return $this->rangeIteratorFactory->create( [ 'select' => $select, 'batchSize' => $batchSize, 'correlationName' => $fieldCorrelationName, 'rangeField' => $rangeField, 'rangeFieldAlias' => $rangeFieldAlias, ] ); } }