Skip to content
Snippets Groups Projects
DefaultSeed.php 5.21 KiB
Newer Older
<?php

namespace IQDEV\ElasticSearchTests\Seed;

use IQDEV\ElasticSearch\Config\BaseConfiguration;
use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Document\ProductDocument;
use IQDEV\ElasticSearch\Facet\FacetCategory;
use IQDEV\ElasticSearch\Facet\FacetKeyword;
use IQDEV\ElasticSearch\Facet\FacetNumber;
use IQDEV\ElasticSearch\Indexer\AddIndex;
use IQDEV\ElasticSearch\Indexer\IndexProvider;
use IQDEV\ElasticSearch\Indexer\IndexRunner;
use IQDEV\ElasticSearchTests\Factory\ClientFactory;
use Psr\Log\Test\TestLogger;

class DefaultSeed
{
    private IndexRunner $indexRunner;

    private Configuration $configuration;

    public function __construct()
    {
        $this->configuration = new BaseConfiguration();

        $this->indexRunner = new IndexRunner(
            ClientFactory::create(),
            $this->configuration,
            new TestLogger()
        );
    }

    public function start()
    {
        $provider = new class implements IndexProvider {
            public function get(): \Generator
            {
                $products = [
                    [
                        'id' => 's1',
                        'name' => 'Кроссовки NMD_R1 Boba Fett Spectoo',
                        'category' => 'shoes',
                        'properties' => ['brand' => 'adidas', 'color' => 'green', 'size' => 46,'price' => 100]
                    ],
                    [
                        'id' => 's2',
                        'name' => 'КРОССОВКИ ULTRABOOST 5.0 DNA',
                        'category' => 'shoes',
                        'properties' => ['brand' => 'adidas', 'color' => 'red', 'size' => 47,'price' => 101]
                    ],
                    [
                        'id' => 's3',
                        'name' => 'Кроссовки Reebok Royal Techque',
                        'category' => 'shoes',
                        'properties' => ['brand' => 'rebook', 'color' => 'blue', 'size' => 47,'price' => 102]
                    ],
                    [
                        'id' => 's4',
                        'name' => 'Nike Air Zoom Pegasus 39',
                        'category' => 'shoes',
                        'properties' => ['brand' => 'nike', 'color' => 'green', 'size' => 43,'price' => 103]
                    ],
                    [
                        'id' => 'h1',
                        'name' => 'Nike Dri-FIT Strike',
                        'category' => 't-short',
                        'properties' => ['brand' => 'nike', 'color' => 'red', 'size' => 'xl','price' => 104]
                    ],
                    [
                        'id' => 'h2',
                        'name' => 'Nike Dri-FIT Rise 365',
                        'category' => 't-short',
                        'properties' => ['brand' => 'nike', 'color' => 'white', 'size' => 'xxl','price' => 105]
                    ],
                    [
                        'id' => 'h3',
                        'name' => 'Компрессионная Футболка ACTIVCHILL Graphic Move',
                        'category' => 't-short',
                        'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 106]
                    ],
                    [
                        'id' => 'p1',
                        'name' => 'Товар с ценой',
                        'category' => 'prices',
                        'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 107]
                    ],
                ];

                foreach ($products as $product) {
                    $document = new ProductDocument(new FacetCategory($product['category']));
                    //todo по-хорошему нужны базовые классы, которые будут описывать свойства
                    // и формировать структуру для последующей обработки

                    $document->setAdditionData([
                        'id' => $product['id'],
                        'title' => $product['name'],
                    ]);

                    foreach ($product['properties'] as $key => $prop) {
                        if ($key === 'price') {
                            $document->getNumberFacets()->add(new FacetNumber($key, $prop));
                        } else {
                            $document->getKeywordFacets()->add(new FacetKeyword($key, $prop));
                        }
                    }
                    $document->setSearchContent($product['name']);

                    yield new AddIndex(
                        $_ENV['IQ_ES_PRODUCT_SEARCH_INDEX'],
                        $document,
                        $product['id']
                    );
                }
            }

            public function setBatchSize(int $size): void
            {
            }

            public function getBatchSize(): ?int
            {
                return null;
            }

            public function setLimit(int $limit): void
            {
            }

            public function getLimit(): ?int
            {
                return null;
            }
        };

        $this->indexRunner->run($provider);
    }
}