diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/TableResolver.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/TableResolver.php
new file mode 100644
index 0000000000000..84c0eb46429cd
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/TableResolver.php
@@ -0,0 +1,74 @@
+storeManager = $storeManager;
+ $this->tableResolver = $tableResolver;
+ }
+
+ /**
+ * replacing catalog_category_product_index table name on the table name segmented per store
+ *
+ * @param ResourceConnection $subject
+ * @param string $result
+ * @param string|string[] $modelEntity
+ *
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ *
+ * @return string
+ */
+ public function afterGetTableName(
+ \Magento\Framework\App\ResourceConnection $subject,
+ string $result,
+ $modelEntity
+ ) {
+ if (!is_array($modelEntity) && $modelEntity === AbstractAction::MAIN_INDEX_TABLE) {
+ $catalogCategoryProductDimension = new Dimension(
+ \Magento\Store\Model\Store::ENTITY,
+ $this->storeManager->getStore()->getId()
+ );
+
+ $tableName = $this->tableResolver->resolve(
+ AbstractAction::MAIN_INDEX_TABLE,
+ [
+ $catalogCategoryProductDimension
+ ]
+ );
+ return $tableName;
+ }
+ return $result;
+ }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/TableMaintainer.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/TableMaintainer.php
index 9651e1ec873bd..d2f8925d09a7b 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Product/TableMaintainer.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/TableMaintainer.php
@@ -136,10 +136,19 @@ public function getMainTable(int $storeId)
public function createTablesForStore(int $storeId)
{
$mainTableName = $this->getMainTable($storeId);
- $this->createTable($this->getTable(AbstractAction::MAIN_INDEX_TABLE), $mainTableName);
+ //Create index table for store based on on main replica table
+ //Using main replica table is necessary for backward capability and TableResolver plugin work
+ $this->createTable(
+ $this->getTable(AbstractAction::MAIN_INDEX_TABLE . $this->additionalTableSuffix),
+ $mainTableName
+ );
$mainReplicaTableName = $this->getMainTable($storeId) . $this->additionalTableSuffix;
- $this->createTable($this->getTable(AbstractAction::MAIN_INDEX_TABLE), $mainReplicaTableName);
+ //Create replica table for store based on main replica table
+ $this->createTable(
+ $this->getTable(AbstractAction::MAIN_INDEX_TABLE . $this->additionalTableSuffix),
+ $mainReplicaTableName
+ );
}
/**
diff --git a/app/code/Magento/Catalog/etc/adminhtml/di.xml b/app/code/Magento/Catalog/etc/adminhtml/di.xml
index 9739ee28a6dae..130c387924701 100644
--- a/app/code/Magento/Catalog/etc/adminhtml/di.xml
+++ b/app/code/Magento/Catalog/etc/adminhtml/di.xml
@@ -193,4 +193,7 @@
+
+
+
diff --git a/app/code/Magento/Catalog/etc/frontend/di.xml b/app/code/Magento/Catalog/etc/frontend/di.xml
index 63fc11c08d8bb..d62ecdb632ac4 100644
--- a/app/code/Magento/Catalog/etc/frontend/di.xml
+++ b/app/code/Magento/Catalog/etc/frontend/di.xml
@@ -79,4 +79,7 @@
recently_compared_product
+
+
+
diff --git a/app/code/Magento/Catalog/etc/webapi_rest/di.xml b/app/code/Magento/Catalog/etc/webapi_rest/di.xml
index 1d2b013f2035d..1e09b9eedb73e 100644
--- a/app/code/Magento/Catalog/etc/webapi_rest/di.xml
+++ b/app/code/Magento/Catalog/etc/webapi_rest/di.xml
@@ -16,4 +16,7 @@
+
+
+
diff --git a/app/code/Magento/Catalog/etc/webapi_soap/di.xml b/app/code/Magento/Catalog/etc/webapi_soap/di.xml
index 98a8ef4de8408..a0d3e850b3c64 100644
--- a/app/code/Magento/Catalog/etc/webapi_soap/di.xml
+++ b/app/code/Magento/Catalog/etc/webapi_soap/di.xml
@@ -15,4 +15,7 @@
+
+
+