IndexStructure.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogSearch\Model\Indexer;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Framework\DB\Adapter\AdapterInterface;
  9. use Magento\Framework\DB\Ddl\Table;
  10. use Magento\Framework\Search\Request\Dimension;
  11. use Magento\Framework\Indexer\IndexStructureInterface;
  12. use Magento\Framework\Indexer\ScopeResolver\IndexScopeResolver;
  13. use Magento\Framework\Search\Request\IndexScopeResolverInterface;
  14. /**
  15. * Catalog search index structure.
  16. *
  17. * @api
  18. * @since 100.0.2
  19. */
  20. class IndexStructure implements IndexStructureInterface
  21. {
  22. /**
  23. * @var Resource
  24. */
  25. private $resource;
  26. /**
  27. * @var IndexScopeResolver
  28. */
  29. private $indexScopeResolver;
  30. /**
  31. * @param ResourceConnection $resource
  32. * @param IndexScopeResolverInterface $indexScopeResolver
  33. */
  34. public function __construct(
  35. ResourceConnection $resource,
  36. IndexScopeResolverInterface $indexScopeResolver
  37. ) {
  38. $this->resource = $resource;
  39. $this->indexScopeResolver = $indexScopeResolver;
  40. }
  41. /**
  42. * @inheritdoc
  43. */
  44. public function delete($index, array $dimensions = [])
  45. {
  46. $tableName = $this->indexScopeResolver->resolve($index, $dimensions);
  47. if ($this->resource->getConnection()->isTableExists($tableName)) {
  48. $this->resource->getConnection()->dropTable($tableName);
  49. }
  50. }
  51. /**
  52. * @inheritdoc
  53. */
  54. public function create($index, array $fields, array $dimensions = [])
  55. {
  56. $this->createFulltextIndex($this->indexScopeResolver->resolve($index, $dimensions));
  57. }
  58. /**
  59. * Create fulltext index table.
  60. *
  61. * @param string $tableName
  62. * @throws \Zend_Db_Exception
  63. * @return void
  64. */
  65. protected function createFulltextIndex($tableName)
  66. {
  67. $table = $this->resource->getConnection()->newTable($tableName)
  68. ->addColumn(
  69. 'entity_id',
  70. Table::TYPE_INTEGER,
  71. 10,
  72. ['unsigned' => true, 'nullable' => false],
  73. 'Entity ID'
  74. )->addColumn(
  75. 'attribute_id',
  76. Table::TYPE_INTEGER,
  77. 10,
  78. ['unsigned' => true, 'nullable' => false]
  79. )->addColumn(
  80. 'data_index',
  81. Table::TYPE_TEXT,
  82. '4g',
  83. ['nullable' => true],
  84. 'Data index'
  85. )->addIndex(
  86. 'idx_primary',
  87. ['entity_id', 'attribute_id'],
  88. ['type' => AdapterInterface::INDEX_TYPE_PRIMARY]
  89. )->addIndex(
  90. 'FTI_FULLTEXT_DATA_INDEX',
  91. ['data_index'],
  92. ['type' => AdapterInterface::INDEX_TYPE_FULLTEXT]
  93. );
  94. $this->resource->getConnection()->createTable($table);
  95. }
  96. }