Skip to content

Commit c9636f9

Browse files
author
Volodymyr Klymenko
authored
Merge pull request #579 from magento-firedrakes/bugfixes_2.1.4
[Firedrakes] Bugfixes 2.1.4
2 parents 2afafac + f2d82aa commit c9636f9

File tree

13 files changed

+582
-25
lines changed

13 files changed

+582
-25
lines changed

app/code/Magento/Catalog/Model/Indexer/Product/Flat/FlatTableBuilder.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,11 @@ protected function _fillTemporaryFlatTable(array $tables, $storeId, $valueFieldS
221221

222222
unset($tables[$entityTableName]);
223223

224-
$allColumns = array_merge(['entity_id', 'type_id', 'attribute_set_id'], $columnsList);
224+
$allColumns = array_values(
225+
array_unique(
226+
array_merge(['entity_id', $linkField, 'type_id', 'attribute_set_id'], $columnsList)
227+
)
228+
);
225229

226230
/* @var $status \Magento\Eav\Model\Entity\Attribute */
227231
$status = $this->_productIndexerHelper->getAttribute('status');
@@ -263,7 +267,7 @@ protected function _fillTemporaryFlatTable(array $tables, $storeId, $valueFieldS
263267

264268
$select->joinLeft(
265269
$temporaryTableName,
266-
"e.entity_id = " . $temporaryTableName . ".entity_id",
270+
"e.${linkField} = ${temporaryTableName}.${linkField}",
267271
$columnsNames
268272
);
269273
$allColumns = array_merge($allColumns, $columnsNames);
@@ -277,7 +281,7 @@ protected function _fillTemporaryFlatTable(array $tables, $storeId, $valueFieldS
277281
if (!empty($columnValueNames)) {
278282
$select->joinLeft(
279283
$temporaryValueTableName,
280-
"e.${linkField} = " . $temporaryValueTableName . ".entity_id",
284+
"e.${linkField} = " . $temporaryValueTableName . ".${linkField}",
281285
$columnValueNames
282286
);
283287
$allColumns = array_merge($allColumns, $columnValueNames);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Catalog\Model\Indexer\Product\Flat\Table;
7+
8+
/**
9+
* Class Builder
10+
*/
11+
class Builder implements BuilderInterface
12+
{
13+
/**
14+
* @var \Magento\Framework\DB\Ddl\Table
15+
*/
16+
private $tableInstance;
17+
18+
/**
19+
* Builder constructor.
20+
*
21+
* @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
22+
* @param string $tableName
23+
*/
24+
public function __construct(\Magento\Framework\DB\Adapter\AdapterInterface $connection, $tableName)
25+
{
26+
$this->tableInstance = $connection->newTable($tableName);
27+
}
28+
29+
/**
30+
* Adds column to table.
31+
*
32+
* $options contains additional options for columns. Supported values are:
33+
* - 'unsigned', for number types only. Default: FALSE.
34+
* - 'precision', for numeric and decimal only. Default: taken from $size, if not set there then 0.
35+
* - 'scale', for numeric and decimal only. Default: taken from $size, if not set there then 10.
36+
* - 'default'. Default: not set.
37+
* - 'nullable'. Default: TRUE.
38+
* - 'primary', add column to primary index. Default: do not add.
39+
* - 'primary_position', only for column in primary index. Default: count of primary columns + 1.
40+
* - 'identity' or 'auto_increment'. Default: FALSE.
41+
*
42+
* @param string $name the column name
43+
* @param string $type the column data type
44+
* @param string|int|array $size the column length
45+
* @param array $options array of additional options
46+
* @param string $comment column description
47+
* @return $this
48+
* @throws \Zend_Db_Exception
49+
*/
50+
public function addColumn($name, $type, $size = null, $options = [], $comment = null)
51+
{
52+
$this->tableInstance->addColumn($name, $type, $size, $options, $comment);
53+
return $this;
54+
}
55+
56+
/**
57+
* @return \Magento\Framework\DB\Ddl\Table
58+
*/
59+
public function getTable()
60+
{
61+
return $this->tableInstance;
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Catalog\Model\Indexer\Product\Flat\Table;
7+
8+
/**
9+
* Interface BuilderInterface
10+
*/
11+
interface BuilderInterface
12+
{
13+
/**
14+
* Adds column to table.
15+
*
16+
* $options contains additional options for columns. Supported values are:
17+
* - 'unsigned', for number types only. Default: FALSE.
18+
* - 'precision', for numeric and decimal only. Default: taken from $size, if not set there then 0.
19+
* - 'scale', for numeric and decimal only. Default: taken from $size, if not set there then 10.
20+
* - 'default'. Default: not set.
21+
* - 'nullable'. Default: TRUE.
22+
* - 'primary', add column to primary index. Default: do not add.
23+
* - 'primary_position', only for column in primary index. Default: count of primary columns + 1.
24+
* - 'identity' or 'auto_increment'. Default: FALSE.
25+
*
26+
* @param string $name the column name
27+
* @param string $type the column data type
28+
* @param string|int|array $size the column length
29+
* @param array $options array of additional options
30+
* @param string $comment column description
31+
* @return $this
32+
* @throws \Zend_Db_Exception
33+
*/
34+
public function addColumn($name, $type, $size = null, $options = [], $comment = null);
35+
36+
/**
37+
* @return \Magento\Framework\DB\Ddl\Table
38+
*/
39+
public function getTable();
40+
}

app/code/Magento/Catalog/Model/Indexer/Product/Flat/TableBuilder.php

+43-14
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
namespace Magento\Catalog\Model\Indexer\Product\Flat;
77

8-
use Magento\Framework\App\ResourceConnection;
8+
use Magento\Catalog\Model\Indexer\Product\Flat\Table\BuilderInterfaceFactory;
99

1010
/**
1111
* Class TableBuilder
@@ -32,6 +32,11 @@ class TableBuilder
3232
*/
3333
protected $resource;
3434

35+
/**
36+
* @var BuilderInterfaceFactory
37+
*/
38+
private $tableBuilderFactory;
39+
3540
/**
3641
* Check whether builder was executed
3742
*
@@ -123,17 +128,27 @@ protected function _createTemporaryTable($tableName, array $columns, $valueField
123128
$valueTables = [];
124129
if (!empty($columns)) {
125130
$valueTableName = $tableName . $valueFieldSuffix;
126-
$temporaryTable = $this->_connection->newTable($tableName);
127-
$valueTemporaryTable = $this->_connection->newTable($valueTableName);
131+
$temporaryTableBuilder = $this->getTableBuilderFactory()->create(
132+
[
133+
'connection' => $this->_connection,
134+
'tableName' => $tableName
135+
]
136+
);
137+
$valueTemporaryTableBuilder = $this->getTableBuilderFactory()->create(
138+
[
139+
'connection' => $this->_connection,
140+
'tableName' => $valueTableName
141+
]
142+
);
128143
$flatColumns = $this->_productIndexerHelper->getFlatColumns();
129144

130-
$temporaryTable->addColumn('entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER);
145+
$temporaryTableBuilder->addColumn('entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER);
131146

132-
$temporaryTable->addColumn('type_id', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT);
147+
$temporaryTableBuilder->addColumn('type_id', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT);
133148

134-
$temporaryTable->addColumn('attribute_set_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER);
149+
$temporaryTableBuilder->addColumn('attribute_set_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER);
135150

136-
$valueTemporaryTable->addColumn('entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER);
151+
$valueTemporaryTableBuilder->addColumn('entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER);
137152

138153
/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
139154
foreach ($columns as $columnName => $attribute) {
@@ -145,7 +160,7 @@ protected function _createTemporaryTable($tableName, array $columns, $valueField
145160
$column = $column[$attributeCode];
146161
}
147162

148-
$temporaryTable->addColumn(
163+
$temporaryTableBuilder->addColumn(
149164
$columnName,
150165
$column['type'],
151166
isset($column['length']) ? $column['length'] : null
@@ -154,19 +169,19 @@ protected function _createTemporaryTable($tableName, array $columns, $valueField
154169
$columnValueName = $attributeCode . $valueFieldSuffix;
155170
if (isset($flatColumns[$columnValueName])) {
156171
$columnValue = $flatColumns[$columnValueName];
157-
$valueTemporaryTable->addColumn(
172+
$valueTemporaryTableBuilder->addColumn(
158173
$columnValueName,
159174
$columnValue['type'],
160175
isset($columnValue['length']) ? $columnValue['length'] : null
161176
);
162177
}
163178
}
164179
$this->_connection->dropTemporaryTable($tableName);
165-
$this->_connection->createTemporaryTable($temporaryTable);
180+
$this->_connection->createTemporaryTable($temporaryTableBuilder->getTable());
166181

167-
if (count($valueTemporaryTable->getColumns()) > 1) {
182+
if (count($valueTemporaryTableBuilder->getTable()->getColumns()) > 1) {
168183
$this->_connection->dropTemporaryTable($valueTableName);
169-
$this->_connection->createTemporaryTable($valueTemporaryTable);
184+
$this->_connection->createTemporaryTable($valueTemporaryTableBuilder->getTable());
170185
$valueTables[$valueTableName] = $valueTableName;
171186
}
172187
}
@@ -197,7 +212,8 @@ protected function _fillTemporaryEntityTable($tableName, array $columns, array $
197212
if (!empty($columns)) {
198213
$select = $this->_connection->select();
199214
$temporaryEntityTable = $this->_getTemporaryTableName($tableName);
200-
$idsColumns = ['entity_id', 'type_id', 'attribute_set_id'];
215+
$metadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
216+
$idsColumns = array_unique([$metadata->getLinkField(), 'entity_id', 'type_id', 'attribute_set_id']);
201217

202218
$columns = array_merge($idsColumns, array_keys($columns));
203219

@@ -261,7 +277,7 @@ protected function _fillTemporaryTable(
261277
);
262278
$temporaryTableName = $this->_getTemporaryTableName($tableName);
263279
$temporaryValueTableName = $temporaryTableName . $valueFieldSuffix;
264-
$keyColumn = ['entity_id'];
280+
$keyColumn = array_unique([$metadata->getLinkField(), 'entity_id']);
265281
$columns = array_merge($keyColumn, array_keys($columnsList));
266282
$valueColumns = $keyColumn;
267283
$flatColumns = $this->_productIndexerHelper->getFlatColumns();
@@ -333,6 +349,19 @@ protected function _fillTemporaryTable(
333349
}
334350
}
335351

352+
/**
353+
* @return BuilderInterfaceFactory
354+
*/
355+
private function getTableBuilderFactory()
356+
{
357+
if (null === $this->tableBuilderFactory) {
358+
$this->tableBuilderFactory = \Magento\Framework\App\ObjectManager::getInstance()
359+
->get(BuilderInterfaceFactory::class);
360+
}
361+
362+
return $this->tableBuilderFactory;
363+
}
364+
336365
/**
337366
* @return \Magento\Framework\EntityManager\MetadataPool
338367
*/

0 commit comments

Comments
 (0)