Completed
Push — master ( 6ed010...811bc4 )
by Karel
06:34 queued 10s
created

AsyncPagerPersister::insert()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 20
ccs 13
cts 13
cp 1
rs 9.6
c 0
b 0
f 0
cc 3
nc 1
nop 2
crap 3
1
<?php
2
declare(strict_types=1);
3
4
namespace FOS\ElasticaBundle\Persister;
5
6
use FOS\ElasticaBundle\Message\AsyncPersistPage;
7
use FOS\ElasticaBundle\Provider\PagerInterface;
8
use FOS\ElasticaBundle\Provider\PagerProviderRegistry;
9
use Symfony\Component\Messenger\MessageBusInterface;
10
11
final class AsyncPagerPersister implements PagerPersisterInterface
12
{
13
    const NAME = 'async';
14
    const DEFAULT_PAGE_SIZE = 100;
15
16
    /**
17
     * @var PagerPersisterRegistry
18
     */
19
    private $pagerPersisterRegistry;
20
21
    /**
22
     * @var PagerProviderRegistry
23
     */
24
    private $pagerProviderRegistry;
25
26
    /**
27
     * @var MessageBusInterface
28
     */
29
    private $messageBus;
30
31 2
    public function __construct(
32
        PagerPersisterRegistry $pagerPersisterRegistry,
33
        PagerProviderRegistry $pagerProviderRegistry,
34
        MessageBusInterface $messageBus
35
    ) {
36 2
        $this->pagerPersisterRegistry = $pagerPersisterRegistry;
37 2
        $this->pagerProviderRegistry = $pagerProviderRegistry;
38 2
        $this->messageBus = $messageBus;
39 2
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44 1
    public function insert(PagerInterface $pager, array $options = array()): void
45
    {
46 1
        $pager->setMaxPerPage(empty($options['max_per_page']) ? self::DEFAULT_PAGE_SIZE : $options['max_per_page']);
47
48 1
        $options = array_replace([
49 1
            'max_per_page' => $pager->getMaxPerPage(),
50 1
            'first_page' => $pager->getCurrentPage(),
51 1
            'last_page' => $pager->getNbPages(),
52
        ], $options);
53
54 1
        $pager->setCurrentPage($options['first_page']);
55
56 1
        $lastPage = min($options['last_page'], $pager->getNbPages());
57 1
        $page = $pager->getCurrentPage();
58
        do {
59 1
            $this->messageBus->dispatch(new AsyncPersistPage($page, $options));
60
61 1
            $page++;
62 1
        } while ($page <= $lastPage);
63 1
    }
64
65 1
    public function insertPage(int $page, array $options = []): int
66
    {
67 1
        if (!isset($options['indexName'])) {
68
            throw new \RuntimeException('Invalid call. $options is missing the indexName key.');
69
        }
70 1
        if (!isset($options['max_per_page'])) {
71
            throw new \RuntimeException('Invalid call. $options is missing the max_per_page key.');
72
        }
73
74 1
        $options['first_page'] = $page;
75 1
        $options['last_page'] = $page;
76
77 1
        $provider = $this->pagerProviderRegistry->getProvider($options['indexName']);
78 1
        $pager = $provider->provide($options);
79 1
        $pager->setMaxPerPage($options['max_per_page']);
80 1
        $pager->setCurrentPage($options['first_page']);
81
82 1
        $objectCount = count($pager->getCurrentPageResults());
83
84 1
        $pagerPersister = $this->pagerPersisterRegistry->getPagerPersister(InPlacePagerPersister::NAME);
85 1
        $pagerPersister->insert($pager, $options);
86
87 1
        return $objectCount;
88
    }
89
}
90