/** * Create changelog table * * @return void * @throws \Exception */ public function create() { $changelogTableName = $this->resource->getTableName($this->getName()); if (!$this->connection->isTableExists($changelogTableName)) { $table = $this->connection->newTable($changelogTableName)->addColumn('version_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Version ID')->addColumn($this->getColumnName(), \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['unsigned' => true, 'nullable' => false, 'default' => '0'], 'Entity ID'); $this->connection->createTable($table); } }
/** * Create changelog table * * @return void * @throws \Exception */ public function create() { $changelogTableName = $this->resource->getTableName($this->getName()); if ($this->write->isTableExists($changelogTableName)) { throw new \Exception("Table {$changelogTableName} already exist"); } $table = $this->write->newTable($changelogTableName)->addColumn('version_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true), 'Version ID')->addColumn($this->getColumnName(), \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, array('unsigned' => true, 'nullable' => false, 'default' => '0'), 'Entity ID'); $this->write->createTable($table); }
protected function setUp() { $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Framework\\Module\\Setup', array('resourceName' => 'core_setup', 'moduleName' => 'Magento_Core')); $this->_connection = $installer->getConnection(); $this->_tableName = $installer->getTable('table_two_column_idx'); $this->_oneColumnIdxName = $installer->getIdxName($this->_tableName, array('column1')); $this->_twoColumnIdxName = $installer->getIdxName($this->_tableName, array('column1', 'column2')); $table = $this->_connection->newTable($this->_tableName)->addColumn('id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true), 'Id')->addColumn('column1', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER)->addColumn('column2', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER)->addIndex($this->_oneColumnIdxName, array('column1'))->addIndex($this->_twoColumnIdxName, array('column1', 'column2')); $this->_connection->createTable($table); }
protected function setUp() { /** @var \Magento\Framework\Setup\ModuleDataSetupInterface $installer */ $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('\\Magento\\Framework\\Setup\\ModuleDataSetupInterface'); $this->_connection = $installer->getConnection(); $this->_tableName = $this->_connection->getTableName('table_two_column_idx'); $this->_oneColumnIdxName = $this->_connection->getIndexName($this->_tableName, ['column1']); $this->_twoColumnIdxName = $this->_connection->getIndexName($this->_tableName, ['column1', 'column2']); $table = $this->_connection->newTable($this->_tableName)->addColumn('id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Id')->addColumn('column1', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER)->addColumn('column2', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER)->addIndex($this->_oneColumnIdxName, ['column1'])->addIndex($this->_twoColumnIdxName, ['column1', 'column2']); $this->_connection->createTable($table); }
/** * Create delta for specified table * * @param string $documentName * @param string $deltaLogName * @param string $idKey * @return void */ public function createDelta($documentName, $deltaLogName, $idKey) { if (!$this->resourceAdapter->isTableExists($deltaLogName)) { $triggerTable = $this->resourceAdapter->newTable($deltaLogName)->addColumn($idKey, \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['nullable' => false, 'primary' => true])->addColumn('operation', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT)->addColumn('processed', \Magento\Framework\DB\Ddl\Table::TYPE_BOOLEAN, null, ['nullable' => false, 'default' => 0]); $this->resourceAdapter->createTable($triggerTable); } else { $this->deleteAllRecords($deltaLogName); } foreach (Trigger::getListOfEvents() as $event) { $triggerName = $this->resourceAdapter->getTableName('trg_' . $documentName . '_after_' . strtolower($event)); $statement = $this->buildStatement($event, $idKey, $deltaLogName); $trigger = $this->triggerFactory->create()->setTime(Trigger::TIME_AFTER)->setEvent($event)->setTable($documentName); $triggerKey = $documentName . $event . Trigger::TIME_AFTER; $triggerExists = $this->isTriggerExist($triggerKey); if ($triggerExists) { $triggerName = $this->triggers[$triggerKey]['trigger_name']; $oldTriggerStatement = $this->triggers[$triggerKey]['action_statement']; if (strpos($oldTriggerStatement, $statement) !== false) { unset($trigger); continue; } $trigger->addStatement($oldTriggerStatement); $this->resourceAdapter->dropTrigger($triggerName); } $trigger->addStatement($statement)->setName($triggerName); $this->resourceAdapter->createTrigger($trigger); if (!$triggerExists) { $this->triggers[$triggerKey] = 1; } unset($trigger); } }
/** * Build and populate the temporary category tree index table * * Returns the name of the temporary table to use in queries. * * @return string */ protected function makeTempCategoryTreeIndex() { // Note: this temporary table is per-connection, so won't conflict by prefix. $temporaryName = $this->getTemporaryTreeIndexTableName(); $temporaryTable = $this->connection->newTable($temporaryName); $temporaryTable->addColumn('parent_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['nullable' => false, 'unsigned' => true]); $temporaryTable->addColumn('child_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['nullable' => false, 'unsigned' => true]); // Each entry will be unique. $temporaryTable->addIndex('idx_primary', ['parent_id', 'child_id'], ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY]); // Drop the temporary table in case it already exists on this (persistent?) connection. $this->connection->dropTemporaryTable($temporaryName); $this->connection->createTemporaryTable($temporaryTable); $this->fillTempCategoryTreeIndex($temporaryName); return $temporaryName; }
/** * Return structure for flat catalog table * * @param string $tableName * @return \Magento\Framework\DB\Ddl\Table */ protected function getFlatTableStructure($tableName) { $table = $this->connection->newTable($tableName)->setComment(sprintf("Catalog Category Flat", $tableName)); //Adding columns foreach ($this->getColumns() as $fieldName => $fieldProp) { $default = $fieldProp['default']; if ($fieldProp['type'][0] == \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP && $default == 'CURRENT_TIMESTAMP') { $default = \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT; } $table->addColumn($fieldName, $fieldProp['type'][0], $fieldProp['type'][1], ['nullable' => $fieldProp['nullable'], 'unsigned' => $fieldProp['unsigned'], 'default' => $default, 'primary' => isset($fieldProp['primary']) ? $fieldProp['primary'] : false], $fieldProp['comment'] != '' ? $fieldProp['comment'] : ucwords(str_replace('_', ' ', $fieldName))); } // Adding indexes $table->addIndex($this->connection->getIndexName($tableName, ['entity_id']), ['entity_id'], ['type' => 'primary']); $table->addIndex($this->connection->getIndexName($tableName, ['store_id']), ['store_id'], ['type' => 'index']); $table->addIndex($this->connection->getIndexName($tableName, ['path']), ['path'], ['type' => 'index']); $table->addIndex($this->connection->getIndexName($tableName, ['level']), ['level'], ['type' => 'index']); return $table; }
/** * Prepare flat table for store * * @param int|string $storeId * @return void * @throws \Magento\Framework\Exception\LocalizedException * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function _createTemporaryFlatTable($storeId) { $columns = $this->_productIndexerHelper->getFlatColumns(); $indexesNeed = $this->_productIndexerHelper->getFlatIndexes(); $maxIndex = $this->_config->getValue(self::XML_NODE_MAX_INDEX_COUNT); if ($maxIndex && count($indexesNeed) > $maxIndex) { throw new \Magento\Framework\Exception\LocalizedException(__('The Flat Catalog module has a limit of %2$d filterable and/or sortable attributes.' . 'Currently there are %1$d of them.' . 'Please reduce the number of filterable/sortable attributes in order to use this module', count($indexesNeed), $maxIndex)); } $indexKeys = []; $indexProps = array_values($indexesNeed); $upperPrimaryKey = strtoupper(\Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY); foreach ($indexProps as $i => $indexProp) { $indexName = $this->_connection->getIndexName($this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($storeId)), $indexProp['fields'], $indexProp['type']); $indexProp['type'] = strtoupper($indexProp['type']); if ($indexProp['type'] == $upperPrimaryKey) { $indexKey = $upperPrimaryKey; } else { $indexKey = $indexName; } $indexProps[$i] = ['KEY_NAME' => $indexName, 'COLUMNS_LIST' => $indexProp['fields'], 'INDEX_TYPE' => strtolower($indexProp['type'])]; $indexKeys[$i] = $indexKey; } $indexesNeed = array_combine($indexKeys, $indexProps); /** @var $table \Magento\Framework\DB\Ddl\Table */ $table = $this->_connection->newTable($this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($storeId))); foreach ($columns as $fieldName => $fieldProp) { $columnLength = isset($fieldProp['length']) ? $fieldProp['length'] : null; $columnDefinition = ['nullable' => isset($fieldProp['nullable']) ? (bool) $fieldProp['nullable'] : false, 'unsigned' => isset($fieldProp['unsigned']) ? (bool) $fieldProp['unsigned'] : false, 'default' => isset($fieldProp['default']) ? $fieldProp['default'] : false, 'primary' => false]; $columnComment = isset($fieldProp['comment']) ? $fieldProp['comment'] : $fieldName; $table->addColumn($fieldName, $fieldProp['type'], $columnLength, $columnDefinition, $columnComment); } foreach ($indexesNeed as $indexProp) { $table->addIndex($indexProp['KEY_NAME'], $indexProp['COLUMNS_LIST'], ['type' => $indexProp['INDEX_TYPE']]); } $table->setComment("Catalog Product Flat (Store {$storeId})"); $this->_connection->dropTable($this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($storeId))); $this->_connection->createTable($table); }
/** * Create empty temporary table with given columns list * * @param string $tableName Table name * @param array $columns array('columnName' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute, ...) * @param string $valueFieldSuffix * * @return array */ protected function _createTemporaryTable($tableName, array $columns, $valueFieldSuffix) { $valueTables = []; if (!empty($columns)) { $valueTableName = $tableName . $valueFieldSuffix; $temporaryTable = $this->_connection->newTable($tableName); $valueTemporaryTable = $this->_connection->newTable($valueTableName); $flatColumns = $this->_productIndexerHelper->getFlatColumns(); $temporaryTable->addColumn('entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER); $temporaryTable->addColumn('type_id', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT); $temporaryTable->addColumn('attribute_set_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER); $valueTemporaryTable->addColumn('entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER); /** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */ foreach ($columns as $columnName => $attribute) { $attributeCode = $attribute->getAttributeCode(); if (isset($flatColumns[$attributeCode])) { $column = $flatColumns[$attributeCode]; } else { $column = $attribute->_getFlatColumnsDdlDefinition(); $column = $column[$attributeCode]; } $temporaryTable->addColumn($columnName, $column['type'], isset($column['length']) ? $column['length'] : null); $columnValueName = $attributeCode . $valueFieldSuffix; if (isset($flatColumns[$columnValueName])) { $columnValue = $flatColumns[$columnValueName]; $valueTemporaryTable->addColumn($columnValueName, $columnValue['type'], isset($columnValue['length']) ? $columnValue['length'] : null); } } $this->_connection->dropTemporaryTable($tableName); $this->_connection->createTemporaryTable($temporaryTable); if (count($valueTemporaryTable->getColumns()) > 1) { $this->_connection->dropTemporaryTable($valueTableName); $this->_connection->createTemporaryTable($valueTemporaryTable); $valueTables[$valueTableName] = $valueTableName; } } return $valueTables; }
/** * Create table 'flag' * * @param SchemaSetupInterface $setup * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection * @return void */ private function setupFlagTable( SchemaSetupInterface $setup, \Magento\Framework\DB\Adapter\AdapterInterface $connection ) { if (!$connection->isTableExists($setup->getTable('flag'))) { $table = $connection->newTable( $setup->getTable('flag') )->addColumn( 'flag_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Flag Id' )->addColumn( 'flag_code', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 255, ['nullable' => false], 'Flag Code' )->addColumn( 'state', \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, null, ['unsigned' => true, 'nullable' => false, 'default' => '0'], 'Flag State' )->addColumn( 'flag_data', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, '64k', [], 'Flag Data' )->addColumn( 'last_update', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Date of Last Flag Update' )->addIndex( $setup->getIdxName('flag', ['last_update']), ['last_update'] )->setComment( 'Flag' ); $connection->createTable($table); } }