Skip to content

Commit 6a7d028

Browse files
committed
Merge remote-tracking branch 'mainline/develop' into bugfixes
Conflicts: app/code/Magento/Catalog/Setup/UpgradeSchema.php
2 parents 671bed0 + 3cb0463 commit 6a7d028

File tree

19 files changed

+377
-35
lines changed

19 files changed

+377
-35
lines changed

app/code/Magento/Catalog/Model/ResourceModel/Layer/Filter/Attribute.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,36 @@
55
*/
66
namespace Magento\Catalog\Model\ResourceModel\Layer\Filter;
77

8+
use Magento\Framework\App\ObjectManager;
9+
810
/**
911
* Catalog Layer Attribute Filter Resource Model
1012
*
1113
* @author Magento Core Team <core@magentocommerce.com>
1214
*/
1315
class Attribute extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
1416
{
17+
/**
18+
* @var \Magento\Indexer\Model\ResourceModel\FrontendResource
19+
*/
20+
private $frontendResource;
21+
22+
/**
23+
* Attribute constructor.
24+
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
25+
* @param null $connectionName
26+
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $frontendResource
27+
*/
28+
public function __construct(
29+
\Magento\Framework\Model\ResourceModel\Db\Context $context,
30+
$connectionName = null,
31+
\Magento\Indexer\Model\ResourceModel\FrontendResource $frontendResource = null
32+
) {
33+
$this->frontendResource = $frontendResource ?: ObjectManager::getInstance()
34+
->get(\Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\FrontendResource::class);
35+
parent::__construct($context, $connectionName);
36+
}
37+
1538
/**
1639
* Initialize connection and define main table name
1740
*
@@ -88,4 +111,12 @@ public function getCount(\Magento\Catalog\Model\Layer\Filter\FilterInterface $fi
88111

89112
return $connection->fetchPairs($select);
90113
}
114+
115+
/**
116+
* @inheritdoc
117+
*/
118+
public function getMainTable()
119+
{
120+
return $this->frontendResource->getMainTable();
121+
}
91122
}

app/code/Magento/Catalog/Model/ResourceModel/Layer/Filter/Decimal.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,36 @@
55
*/
66
namespace Magento\Catalog\Model\ResourceModel\Layer\Filter;
77

8+
use Magento\Framework\App\ObjectManager;
9+
810
/**
911
* Catalog Layer Decimal attribute Filter Resource Model
1012
*
1113
* @author Magento Core Team <core@magentocommerce.com>
1214
*/
1315
class Decimal extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
1416
{
17+
/**
18+
* @var \Magento\Indexer\Model\ResourceModel\FrontendResource
19+
*/
20+
private $frontendResource;
21+
22+
/**
23+
* Attribute constructor.
24+
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
25+
* @param null $connectionName
26+
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $frontendResource
27+
*/
28+
public function __construct(
29+
\Magento\Framework\Model\ResourceModel\Db\Context $context,
30+
$connectionName = null,
31+
\Magento\Indexer\Model\ResourceModel\FrontendResource $frontendResource = null
32+
) {
33+
$this->frontendResource = $frontendResource ?: ObjectManager::getInstance()
34+
->get(\Magento\Catalog\Model\ResourceModel\Product\Indexer\EavDecimal\FrontendResource::class);
35+
parent::__construct($context, $connectionName);
36+
}
37+
1538
/**
1639
* Initialize connection and define main table name
1740
*
@@ -141,4 +164,12 @@ public function getCount(\Magento\Catalog\Model\Layer\Filter\FilterInterface $fi
141164

142165
return $connection->fetchPairs($select);
143166
}
167+
168+
/**
169+
* @inheritdoc
170+
*/
171+
public function getMainTable()
172+
{
173+
return $this->frontendResource->getMainTable();
174+
}
144175
}

app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/AbstractEav.php

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
namespace Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav;
77

88
use Magento\Catalog\Api\Data\ProductInterface;
9+
use Magento\Framework\App\ObjectManager;
910

1011
/**
1112
* Catalog Product Eav Attributes abstract indexer resource model
1213
*
1314
* @author Magento Core Team <core@magentocommerce.com>
15+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1416
*/
1517
abstract class AbstractEav extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\AbstractIndexer
1618
{
@@ -22,22 +24,39 @@ abstract class AbstractEav extends \Magento\Catalog\Model\ResourceModel\Product\
2224
protected $_eventManager = null;
2325

2426
/**
25-
* Construct
26-
*
27+
* @var \Magento\Indexer\Model\Indexer\StateFactory
28+
*/
29+
private $indexerStateFactory;
30+
31+
/**
32+
* @var mixed
33+
*/
34+
private $frontendResource;
35+
36+
/**
37+
* AbstractEav constructor.
2738
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
2839
* @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
2940
* @param \Magento\Eav\Model\Config $eavConfig
3041
* @param \Magento\Framework\Event\ManagerInterface $eventManager
31-
* @param string $connectionName
42+
* @param null $connectionName
43+
* @param \Magento\Indexer\Model\Indexer\StateFactory|null $stateFactory
44+
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $frontendResource
3245
*/
3346
public function __construct(
3447
\Magento\Framework\Model\ResourceModel\Db\Context $context,
3548
\Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
3649
\Magento\Eav\Model\Config $eavConfig,
3750
\Magento\Framework\Event\ManagerInterface $eventManager,
38-
$connectionName = null
51+
$connectionName = null,
52+
\Magento\Indexer\Model\Indexer\StateFactory $stateFactory = null,
53+
\Magento\Indexer\Model\ResourceModel\FrontendResource $frontendResource = null
3954
) {
4055
$this->_eventManager = $eventManager;
56+
$this->indexerStateFactory = $stateFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
57+
->get(\Magento\Indexer\Model\Indexer\StateFactory::class);
58+
$this->frontendResource = $frontendResource ?: ObjectManager::getInstance()
59+
->get(\Magento\Catalog\Model\ResourceModel\Product\Indexer\EavDecimal\FrontendResource::class);
4160
parent::__construct($context, $tableStrategy, $eavConfig, $connectionName);
4261
}
4362

@@ -100,10 +119,11 @@ public function reindexEntities($processIds)
100119
try {
101120
// remove old index
102121
$where = $connection->quoteInto('entity_id IN(?)', $processIds);
103-
$connection->delete($this->getMainTable(), $where);
122+
$mainTable = $this->frontendResource->getMainTable();
123+
$connection->delete($this->frontendResource->getMainTable(), $where);
104124

105125
// insert new index
106-
$this->insertFromTable($this->getIdxTable(), $this->getMainTable());
126+
$this->insertFromTable($this->getIdxTable(), $mainTable);
107127
$connection->commit();
108128
} catch (\Exception $e) {
109129
$connection->rollBack();
@@ -325,4 +345,22 @@ protected function _synchronizeAttributeIndexData($attributeId)
325345
}
326346
return $this;
327347
}
348+
349+
/**
350+
* @inheritdoc
351+
* Returns main table name in depends of the suffix stored in the 'indexer_state' table
352+
*
353+
* @return string
354+
*/
355+
public function getMainTable()
356+
{
357+
$table = parent::getMainTable();
358+
$indexerState = $this->indexerStateFactory->create()->loadByIndexer(
359+
\Magento\Catalog\Model\Indexer\Product\Eav\Processor::INDEXER_ID
360+
);
361+
$destinationTableSuffix = ($indexerState->getTableSuffix() === '')
362+
? \Magento\Framework\Indexer\StateInterface::ADDITIONAL_TABLE_SUFFIX
363+
: '';
364+
return $table . $destinationTableSuffix;
365+
}
328366
}

app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/Source.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
/**
1212
* Catalog Product Eav Select and Multiply Select Attributes Indexer resource model
1313
*
14-
* @author Magento Core Team <core@magentocommerce.com>
14+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1515
*/
1616
class Source extends AbstractEav
1717
{
@@ -30,18 +30,30 @@ class Source extends AbstractEav
3030
* @param \Magento\Eav\Model\Config $eavConfig
3131
* @param \Magento\Framework\Event\ManagerInterface $eventManager
3232
* @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
33-
* @param string $connectionName
33+
* @param null|string $connectionName
34+
* @param \Magento\Indexer\Model\Indexer\StateFactory|null $stateFactory
35+
* @param \Magento\Indexer\Model\ResourceModel\FrontendResource|null $frontendResource
3436
*/
3537
public function __construct(
3638
\Magento\Framework\Model\ResourceModel\Db\Context $context,
3739
\Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
3840
\Magento\Eav\Model\Config $eavConfig,
3941
\Magento\Framework\Event\ManagerInterface $eventManager,
4042
\Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
41-
$connectionName = null
43+
$connectionName = null,
44+
\Magento\Indexer\Model\Indexer\StateFactory $stateFactory = null,
45+
\Magento\Indexer\Model\ResourceModel\FrontendResource $frontendResource = null
4246
) {
47+
parent::__construct(
48+
$context,
49+
$tableStrategy,
50+
$eavConfig,
51+
$eventManager,
52+
$connectionName,
53+
$stateFactory,
54+
$frontendResource
55+
);
4356
$this->_resourceHelper = $resourceHelper;
44-
parent::__construct($context, $tableStrategy, $eavConfig, $eventManager, $connectionName);
4557
}
4658

4759
/**

app/code/Magento/Catalog/Setup/UpgradeSchema.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $con
6565

6666
if (version_compare($context->getVersion(), '2.2.0', '<')) {
6767
$this->addProductPriceIndexReplicaTable($setup);
68+
$this->addProductEavIndexReplicaTables($setup);
6869
$this->addPathKeyToCategoryEntityTableIfNotExists($setup);
6970
}
7071
$setup->endSetup();
@@ -504,4 +505,30 @@ private function addProductPriceIndexReplicaTable(SchemaSetupInterface $setup)
504505
)
505506
);
506507
}
508+
509+
/**
510+
* Add Replica for Catalog Product Eav Index Tables.
511+
*
512+
* By adding 'catalog_product_index_eav_replica', 'catalog_product_index_eav_decimal_replica' we provide separation
513+
* of tables used for indexation write and read operations and affected models.
514+
*
515+
* @param SchemaSetupInterface $setup
516+
* @return void
517+
*/
518+
private function addProductEavIndexReplicaTables(SchemaSetupInterface $setup)
519+
{
520+
$setup->getConnection()->createTable(
521+
$setup->getConnection()->createTableByDdl(
522+
$setup->getTable('catalog_product_index_eav'),
523+
$setup->getTable('catalog_product_index_eav_replica')
524+
)
525+
);
526+
527+
$setup->getConnection()->createTable(
528+
$setup->getConnection()->createTableByDdl(
529+
$setup->getTable('catalog_product_index_eav_decimal'),
530+
$setup->getTable('catalog_product_index_eav_decimal_replica')
531+
)
532+
);
533+
}
507534
}

app/code/Magento/Catalog/etc/di.xml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,42 @@
956956
<arguments>
957957
<argument name="tableStrategy" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\TemporaryTableStrategy</argument>
958958
<argument name="connectionName" xsi:type="string">indexer</argument>
959+
<argument name="frontendResource" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\FrontendResource</argument>
960+
</arguments>
961+
</type>
962+
<virtualType name="Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\FrontendResource" type="Magento\Indexer\Model\ResourceModel\FrontendResource">
963+
<arguments>
964+
<argument name="indexerId" xsi:type="const">Magento\Catalog\Model\Indexer\Product\Eav\Processor::INDEXER_ID</argument>
965+
<argument name="indexerBaseTable" xsi:type="string">catalog_product_index_eav</argument>
966+
<argument name="idFieldName" xsi:type="string">entity_id</argument>
967+
</arguments>
968+
</virtualType>
969+
<virtualType name="Magento\Catalog\Model\ResourceModel\Product\Indexer\EavDecimal\FrontendResource" type="Magento\Indexer\Model\ResourceModel\FrontendResource">
970+
<arguments>
971+
<argument name="indexerId" xsi:type="const">Magento\Catalog\Model\Indexer\Product\Eav\Processor::INDEXER_ID</argument>
972+
<argument name="indexerBaseTable" xsi:type="string">catalog_product_index_eav_decimal</argument>
973+
<argument name="idFieldName" xsi:type="string">entity_id</argument>
974+
</arguments>
975+
</virtualType>
976+
<type name="Magento\Catalog\Model\Indexer\Product\Eav\Action\Full">
977+
<arguments>
978+
<argument name="batchSizeCalculator" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\BatchSizeCalculator</argument>
979+
</arguments>
980+
</type>
981+
<type name="Magento\Catalog\Model\ResourceModel\Layer\Filter\Attribute">
982+
<arguments>
983+
<argument name="frontendResource" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\FrontendResource</argument>
984+
</arguments>
985+
</type>
986+
<type name="Magento\Catalog\Model\ResourceModel\Layer\Filter\Decimal">
987+
<arguments>
988+
<argument name="frontendResource" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\EavDecimal\FrontendResource</argument>
989+
</arguments>
990+
</type>
991+
<type name="Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\Source">
992+
<arguments>
993+
<argument name="connectionName" xsi:type="string">indexer</argument>
994+
<argument name="frontendResource" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\Eav\FrontendResource</argument>
959995
</arguments>
960996
</type>
961997
</config>

app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,26 @@ class DataProvider implements DataProviderInterface
5454
*/
5555
private $indexerFrontendResource;
5656

57+
/**
58+
* @var \Magento\Indexer\Model\Indexer\StateFactory|null
59+
*/
60+
private $stateFactory;
61+
5762
/**
5863
* @param Config $eavConfig
5964
* @param ResourceConnection $resource
6065
* @param ScopeResolverInterface $scopeResolver
6166
* @param Session $customerSession
62-
* @param FrontendResource $indexerFrontendResource
67+
* @param FrontendResource|null $indexerFrontendResource
68+
* @param \Magento\Indexer\Model\Indexer\StateFactory|null $stateFactory
6369
*/
6470
public function __construct(
6571
Config $eavConfig,
6672
ResourceConnection $resource,
6773
ScopeResolverInterface $scopeResolver,
6874
Session $customerSession,
69-
FrontendResource $indexerFrontendResource = null
75+
FrontendResource $indexerFrontendResource = null,
76+
\Magento\Indexer\Model\Indexer\StateFactory $stateFactory = null
7077
) {
7178
$this->eavConfig = $eavConfig;
7279
$this->resource = $resource;
@@ -76,6 +83,8 @@ public function __construct(
7683
$this->indexerFrontendResource = $indexerFrontendResource ?: ObjectManager::getInstance()->get(
7784
Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\FrontendResource::class
7885
);
86+
$this->stateFactory = $stateFactory ?: ObjectManager::getInstance()
87+
->get(\Magento\Indexer\Model\Indexer\StateFactory::class);
7988
}
8089

8190
/**
@@ -112,9 +121,13 @@ public function getDataSet(
112121
} else {
113122
$currentScopeId = $this->scopeResolver->getScope($currentScope)
114123
->getId();
124+
$tableSufix = $this->stateFactory->create()->loadByIndexer(
125+
\Magento\Catalog\Model\Indexer\Product\Eav\Processor::INDEXER_ID
126+
)->getTableSuffix();
115127
$table = $this->resource->getTableName(
116128
'catalog_product_index_eav' . ($attribute->getBackendType() === 'decimal' ? '_decimal' : '')
117129
);
130+
$table .= $tableSufix;
118131
$subSelect = $select;
119132
$subSelect->from(['main_table' => $table], ['main_table.value'])
120133
->joinLeft(

0 commit comments

Comments
 (0)