Skip to content

Commit

Permalink
Merge pull request #579 from magento-firedrakes/bugfixes_2.1.4
Browse files Browse the repository at this point in the history
[Firedrakes] Bugfixes 2.1.4
  • Loading branch information
Volodymyr Klymenko authored Nov 10, 2016
2 parents 2afafac + f2d82aa commit c9636f9
Show file tree
Hide file tree
Showing 13 changed files with 582 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,11 @@ protected function _fillTemporaryFlatTable(array $tables, $storeId, $valueFieldS

unset($tables[$entityTableName]);

$allColumns = array_merge(['entity_id', 'type_id', 'attribute_set_id'], $columnsList);
$allColumns = array_values(
array_unique(
array_merge(['entity_id', $linkField, 'type_id', 'attribute_set_id'], $columnsList)
)
);

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

$select->joinLeft(
$temporaryTableName,
"e.entity_id = " . $temporaryTableName . ".entity_id",
"e.${linkField} = ${temporaryTableName}.${linkField}",
$columnsNames
);
$allColumns = array_merge($allColumns, $columnsNames);
Expand All @@ -277,7 +281,7 @@ protected function _fillTemporaryFlatTable(array $tables, $storeId, $valueFieldS
if (!empty($columnValueNames)) {
$select->joinLeft(
$temporaryValueTableName,
"e.${linkField} = " . $temporaryValueTableName . ".entity_id",
"e.${linkField} = " . $temporaryValueTableName . ".${linkField}",
$columnValueNames
);
$allColumns = array_merge($allColumns, $columnValueNames);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Model\Indexer\Product\Flat\Table;

/**
* Class Builder
*/
class Builder implements BuilderInterface
{
/**
* @var \Magento\Framework\DB\Ddl\Table
*/
private $tableInstance;

/**
* Builder constructor.
*
* @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
* @param string $tableName
*/
public function __construct(\Magento\Framework\DB\Adapter\AdapterInterface $connection, $tableName)
{
$this->tableInstance = $connection->newTable($tableName);
}

/**
* Adds column to table.
*
* $options contains additional options for columns. Supported values are:
* - 'unsigned', for number types only. Default: FALSE.
* - 'precision', for numeric and decimal only. Default: taken from $size, if not set there then 0.
* - 'scale', for numeric and decimal only. Default: taken from $size, if not set there then 10.
* - 'default'. Default: not set.
* - 'nullable'. Default: TRUE.
* - 'primary', add column to primary index. Default: do not add.
* - 'primary_position', only for column in primary index. Default: count of primary columns + 1.
* - 'identity' or 'auto_increment'. Default: FALSE.
*
* @param string $name the column name
* @param string $type the column data type
* @param string|int|array $size the column length
* @param array $options array of additional options
* @param string $comment column description
* @return $this
* @throws \Zend_Db_Exception
*/
public function addColumn($name, $type, $size = null, $options = [], $comment = null)
{
$this->tableInstance->addColumn($name, $type, $size, $options, $comment);
return $this;
}

/**
* @return \Magento\Framework\DB\Ddl\Table
*/
public function getTable()
{
return $this->tableInstance;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Model\Indexer\Product\Flat\Table;

/**
* Interface BuilderInterface
*/
interface BuilderInterface
{
/**
* Adds column to table.
*
* $options contains additional options for columns. Supported values are:
* - 'unsigned', for number types only. Default: FALSE.
* - 'precision', for numeric and decimal only. Default: taken from $size, if not set there then 0.
* - 'scale', for numeric and decimal only. Default: taken from $size, if not set there then 10.
* - 'default'. Default: not set.
* - 'nullable'. Default: TRUE.
* - 'primary', add column to primary index. Default: do not add.
* - 'primary_position', only for column in primary index. Default: count of primary columns + 1.
* - 'identity' or 'auto_increment'. Default: FALSE.
*
* @param string $name the column name
* @param string $type the column data type
* @param string|int|array $size the column length
* @param array $options array of additional options
* @param string $comment column description
* @return $this
* @throws \Zend_Db_Exception
*/
public function addColumn($name, $type, $size = null, $options = [], $comment = null);

/**
* @return \Magento\Framework\DB\Ddl\Table
*/
public function getTable();
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/
namespace Magento\Catalog\Model\Indexer\Product\Flat;

use Magento\Framework\App\ResourceConnection;
use Magento\Catalog\Model\Indexer\Product\Flat\Table\BuilderInterfaceFactory;

/**
* Class TableBuilder
Expand All @@ -32,6 +32,11 @@ class TableBuilder
*/
protected $resource;

/**
* @var BuilderInterfaceFactory
*/
private $tableBuilderFactory;

/**
* Check whether builder was executed
*
Expand Down Expand Up @@ -123,17 +128,27 @@ protected function _createTemporaryTable($tableName, array $columns, $valueField
$valueTables = [];
if (!empty($columns)) {
$valueTableName = $tableName . $valueFieldSuffix;
$temporaryTable = $this->_connection->newTable($tableName);
$valueTemporaryTable = $this->_connection->newTable($valueTableName);
$temporaryTableBuilder = $this->getTableBuilderFactory()->create(
[
'connection' => $this->_connection,
'tableName' => $tableName
]
);
$valueTemporaryTableBuilder = $this->getTableBuilderFactory()->create(
[
'connection' => $this->_connection,
'tableName' => $valueTableName
]
);
$flatColumns = $this->_productIndexerHelper->getFlatColumns();

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

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

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

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

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

$temporaryTable->addColumn(
$temporaryTableBuilder->addColumn(
$columnName,
$column['type'],
isset($column['length']) ? $column['length'] : null
Expand All @@ -154,19 +169,19 @@ protected function _createTemporaryTable($tableName, array $columns, $valueField
$columnValueName = $attributeCode . $valueFieldSuffix;
if (isset($flatColumns[$columnValueName])) {
$columnValue = $flatColumns[$columnValueName];
$valueTemporaryTable->addColumn(
$valueTemporaryTableBuilder->addColumn(
$columnValueName,
$columnValue['type'],
isset($columnValue['length']) ? $columnValue['length'] : null
);
}
}
$this->_connection->dropTemporaryTable($tableName);
$this->_connection->createTemporaryTable($temporaryTable);
$this->_connection->createTemporaryTable($temporaryTableBuilder->getTable());

if (count($valueTemporaryTable->getColumns()) > 1) {
if (count($valueTemporaryTableBuilder->getTable()->getColumns()) > 1) {
$this->_connection->dropTemporaryTable($valueTableName);
$this->_connection->createTemporaryTable($valueTemporaryTable);
$this->_connection->createTemporaryTable($valueTemporaryTableBuilder->getTable());
$valueTables[$valueTableName] = $valueTableName;
}
}
Expand Down Expand Up @@ -197,7 +212,8 @@ protected function _fillTemporaryEntityTable($tableName, array $columns, array $
if (!empty($columns)) {
$select = $this->_connection->select();
$temporaryEntityTable = $this->_getTemporaryTableName($tableName);
$idsColumns = ['entity_id', 'type_id', 'attribute_set_id'];
$metadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
$idsColumns = array_unique([$metadata->getLinkField(), 'entity_id', 'type_id', 'attribute_set_id']);

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

Expand Down Expand Up @@ -261,7 +277,7 @@ protected function _fillTemporaryTable(
);
$temporaryTableName = $this->_getTemporaryTableName($tableName);
$temporaryValueTableName = $temporaryTableName . $valueFieldSuffix;
$keyColumn = ['entity_id'];
$keyColumn = array_unique([$metadata->getLinkField(), 'entity_id']);
$columns = array_merge($keyColumn, array_keys($columnsList));
$valueColumns = $keyColumn;
$flatColumns = $this->_productIndexerHelper->getFlatColumns();
Expand Down Expand Up @@ -333,6 +349,19 @@ protected function _fillTemporaryTable(
}
}

/**
* @return BuilderInterfaceFactory
*/
private function getTableBuilderFactory()
{
if (null === $this->tableBuilderFactory) {
$this->tableBuilderFactory = \Magento\Framework\App\ObjectManager::getInstance()
->get(BuilderInterfaceFactory::class);
}

return $this->tableBuilderFactory;
}

/**
* @return \Magento\Framework\EntityManager\MetadataPool
*/
Expand Down
Loading

0 comments on commit c9636f9

Please sign in to comment.