|
Apache/2.4.41 (Ubuntu) Linux vmi616275.contaboserver.net 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 uid=33(www-data) gid=33(www-data) groups=33(www-data) server ip : 62.171.164.128 | your ip : 127.0.0.1 safemode OFF > / home / dev2.destoffenstraat.com / app / code / Mirasvit / SearchMysql / Model / Indexer / |
Filename | /home/dev2.destoffenstraat.com/app/code/Mirasvit/SearchMysql/Model/Indexer/IndexerHandler.php |
Size | 4.66 kb |
Permission | rwxrwxrwx |
Owner | root : root |
Create time | 17-Aug-2025 10:26 |
Last modified | 15-Oct-2024 20:30 |
Last accessed | 23-Aug-2025 02:07 |
Actions | edit | rename | delete | download (gzip) |
View | text | code | image |
<?php
/**
* Mirasvit
*
* This source file is subject to the Mirasvit Software License, which is available at https://mirasvit.com/license/.
* Do not edit or add to this file if you wish to upgrade the to newer versions in the future.
* If you wish to customize this module for your needs.
* Please refer to http://www.magentocommerce.com for more information.
*
* @category Mirasvit
* @package mirasvit/module-search-ultimate
* @version 2.3.2
* @copyright Copyright (C) 2024 Mirasvit (https://mirasvit.com/)
*/
namespace Mirasvit\SearchMysql\Model\Indexer;
use Magento\Elasticsearch\Model\Adapter\BatchDataMapperInterface;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\App\ScopeResolverInterface;
use Magento\Framework\Indexer\SaveHandler\Batch;
use Magento\Framework\Indexer\SaveHandler\IndexerInterface;
use Mirasvit\SearchMysql\SearchAdapter\Index\IndexNameResolver;
class IndexerHandler implements IndexerInterface
{
private $resource;
private $indexStructure;
private $batchDocumentDataMapper;
private $indexNameResolver;
private $batch;
private $scopeResolver;
private $data;
private $batchSize;
public function __construct(
ResourceConnection $resource,
IndexStructure $indexStructure,
BatchDataMapperInterface $batchDataMapper,
IndexNameResolver $indexNameResolver,
Batch $batch,
ScopeResolverInterface $scopeResolver,
array $data = [],
int $batchSize = 500
) {
$this->resource = $resource;
$this->indexStructure = $indexStructure;
$this->indexNameResolver = $indexNameResolver;
$this->batch = $batch;
$this->data = $data;
$this->batchSize = $batchSize;
$this->scopeResolver = $scopeResolver;
$this->batchDocumentDataMapper = $batchDataMapper;
}
public function saveIndex($dimensions, \Traversable $documents): void
{
$dimension = current($dimensions);
$scopeId = (int)$dimension->getValue();
foreach ($this->batch->getItems($documents, $this->batchSize) as $documentsBatch) {
$docs = $this->prepareDocsPerStore($documentsBatch, $scopeId);
$this->insertDocuments($docs, $dimensions);
}
}
public function prepareDocsPerStore(array $documentData, int $storeId): array
{
$documents = [];
if (count($documentData)) {
$documents = $this->batchDocumentDataMapper->map(
$documentData,
$storeId
);
}
return $documents;
}
public function deleteIndex($dimensions, \Traversable $documents): void
{
foreach ($this->batch->getItems($documents, $this->batchSize) as $batchDocuments) {
$this->resource->getConnection()
->delete($this->getTableName($dimensions), ['entity_id in (?)' => $batchDocuments]);
}
}
/**
* {@inheritdoc}
*/
public function cleanIndex($dimensions)
{
$this->indexStructure->delete($this->getIndexName(), $dimensions);
$this->indexStructure->create($this->getIndexName(), [], $dimensions);
}
/**
* {@inheritdoc}
*/
public function isAvailable($dimensions = [])
{
if (empty($dimensions)) {
return true;
}
return $this->resource->getConnection()->isTableExists($this->getTableName($dimensions));
}
private function insertDocuments(array $documents, array $dimensions): void
{
$documents = $this->prepareSearchableFields($documents);
if (empty($documents)) {
return;
}
$this->resource->getConnection()->insertOnDuplicate(
$this->getTableName($dimensions),
$documents,
['data_index']
);
}
private function prepareSearchableFields(array $documents): array
{
$insertDocuments = [];
foreach ($documents as $entityId => $document) {
foreach ($document as $attributeCode => $fieldValue) {
$insertDocuments[$entityId . '_' . $attributeCode] = [
'entity_id' => $entityId,
'attribute_code' => $attributeCode,
'data_index' => $fieldValue,
];
}
}
return $insertDocuments;
}
private function getTableName(array $dimensions): string
{
return $this->indexNameResolver->getIndexName($this->getIndexName(), $dimensions);
}
private function getIndexName(): string
{
return $this->data['indexer_id'];
}
}
/**
* Mirasvit
*
* This source file is subject to the Mirasvit Software License, which is available at https://mirasvit.com/license/.
* Do not edit or add to this file if you wish to upgrade the to newer versions in the future.
* If you wish to customize this module for your needs.
* Please refer to http://www.magentocommerce.com for more information.
*
* @category Mirasvit
* @package mirasvit/module-search-ultimate
* @version 2.3.2
* @copyright Copyright (C) 2024 Mirasvit (https://mirasvit.com/)
*/
namespace Mirasvit\SearchMysql\Model\Indexer;
use Magento\Elasticsearch\Model\Adapter\BatchDataMapperInterface;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\App\ScopeResolverInterface;
use Magento\Framework\Indexer\SaveHandler\Batch;
use Magento\Framework\Indexer\SaveHandler\IndexerInterface;
use Mirasvit\SearchMysql\SearchAdapter\Index\IndexNameResolver;
class IndexerHandler implements IndexerInterface
{
private $resource;
private $indexStructure;
private $batchDocumentDataMapper;
private $indexNameResolver;
private $batch;
private $scopeResolver;
private $data;
private $batchSize;
public function __construct(
ResourceConnection $resource,
IndexStructure $indexStructure,
BatchDataMapperInterface $batchDataMapper,
IndexNameResolver $indexNameResolver,
Batch $batch,
ScopeResolverInterface $scopeResolver,
array $data = [],
int $batchSize = 500
) {
$this->resource = $resource;
$this->indexStructure = $indexStructure;
$this->indexNameResolver = $indexNameResolver;
$this->batch = $batch;
$this->data = $data;
$this->batchSize = $batchSize;
$this->scopeResolver = $scopeResolver;
$this->batchDocumentDataMapper = $batchDataMapper;
}
public function saveIndex($dimensions, \Traversable $documents): void
{
$dimension = current($dimensions);
$scopeId = (int)$dimension->getValue();
foreach ($this->batch->getItems($documents, $this->batchSize) as $documentsBatch) {
$docs = $this->prepareDocsPerStore($documentsBatch, $scopeId);
$this->insertDocuments($docs, $dimensions);
}
}
public function prepareDocsPerStore(array $documentData, int $storeId): array
{
$documents = [];
if (count($documentData)) {
$documents = $this->batchDocumentDataMapper->map(
$documentData,
$storeId
);
}
return $documents;
}
public function deleteIndex($dimensions, \Traversable $documents): void
{
foreach ($this->batch->getItems($documents, $this->batchSize) as $batchDocuments) {
$this->resource->getConnection()
->delete($this->getTableName($dimensions), ['entity_id in (?)' => $batchDocuments]);
}
}
/**
* {@inheritdoc}
*/
public function cleanIndex($dimensions)
{
$this->indexStructure->delete($this->getIndexName(), $dimensions);
$this->indexStructure->create($this->getIndexName(), [], $dimensions);
}
/**
* {@inheritdoc}
*/
public function isAvailable($dimensions = [])
{
if (empty($dimensions)) {
return true;
}
return $this->resource->getConnection()->isTableExists($this->getTableName($dimensions));
}
private function insertDocuments(array $documents, array $dimensions): void
{
$documents = $this->prepareSearchableFields($documents);
if (empty($documents)) {
return;
}
$this->resource->getConnection()->insertOnDuplicate(
$this->getTableName($dimensions),
$documents,
['data_index']
);
}
private function prepareSearchableFields(array $documents): array
{
$insertDocuments = [];
foreach ($documents as $entityId => $document) {
foreach ($document as $attributeCode => $fieldValue) {
$insertDocuments[$entityId . '_' . $attributeCode] = [
'entity_id' => $entityId,
'attribute_code' => $attributeCode,
'data_index' => $fieldValue,
];
}
}
return $insertDocuments;
}
private function getTableName(array $dimensions): string
{
return $this->indexNameResolver->getIndexName($this->getIndexName(), $dimensions);
}
private function getIndexName(): string
{
return $this->data['indexer_id'];
}
}